Compare commits

..

No commits in common. "5c6aa6a80f987b3cc2767b08985b3ad7d3a7168a" and "c5e019f0517a6dcd360403eb475153ba82b70c43" have entirely different histories.

22 changed files with 218 additions and 197 deletions

View File

@ -26,7 +26,6 @@ public interface IFruitBankDataControllerCommon
#region ShippingItem #region ShippingItem
public Task<List<ShippingItem>?> GetShippingItems(); public Task<List<ShippingItem>?> GetShippingItems();
public Task<List<ShippingItem>?> GetShippingItemsByDocumentId(int shippingDocumentId);
public Task<ShippingItem?> GetShippingItemById(int id); public Task<ShippingItem?> GetShippingItemById(int id);
public Task<ShippingItem?> AddShippingItem(ShippingItem shippingItem); public Task<ShippingItem?> AddShippingItem(ShippingItem shippingItem);
public Task<ShippingItem?> UpdateShippingItem(ShippingItem shippingItem); public Task<ShippingItem?> UpdateShippingItem(ShippingItem shippingItem);

View File

@ -0,0 +1,152 @@
using System.Collections;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
namespace FruitBank.Common
{
public interface IMgFastObservableCollection
{
public void AddRange(IEnumerable other);
public void Replace(IEnumerable other);
public void RemoveRange(IEnumerable other);
public void Synchronize(NotifyCollectionChangedEventArgs args);
}
public interface IMgFastObservableCollection<T> : IMgFastObservableCollection
{
public void Replace(IEnumerable<T> other);
public void Sort(IComparer<T> comparer);
public void SortAndReplace(IEnumerable<T> other, IComparer<T> comparer);
}
public class MgObservableCollection<T> : ObservableCollection<T>, IMgFastObservableCollection<T>
{
private bool _suppressChangedEvent;
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 PropertyChangedEventArgs(nameof(Count)));
}
public void AddRange(IEnumerable other)
{
_suppressChangedEvent = true;
foreach (var item in other)
{
if (item is T tItem) Add(tItem);
}
_suppressChangedEvent = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
OnPropertyChanged(new PropertyChangedEventArgs(nameof(Count)));
}
public void RemoveRange(IEnumerable other)
{
_suppressChangedEvent = true;
foreach (var item in other)
{
if (item is T tItem) Remove(tItem);
}
_suppressChangedEvent = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
OnPropertyChanged(new PropertyChangedEventArgs(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)
{
switch (args.Action)
{
case NotifyCollectionChangedAction.Add when args.NewItems != null:
AddRange(args.NewItems);
break;
case NotifyCollectionChangedAction.Remove when args.OldItems != null:
RemoveRange(args.OldItems);
break;
case NotifyCollectionChangedAction.Reset:
Clear();
break;
case NotifyCollectionChangedAction.Replace:
case NotifyCollectionChangedAction.Move:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (_suppressChangedEvent)
return;
base.OnPropertyChanged(e);
}
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (_suppressChangedEvent)
return;
base.OnCollectionChanged(e);
}
//protected override void ClearItems()
//{
// base.ClearItems();
//}
//protected override void InsertItem(int index, T item)
//{
// base.InsertItem(index, item);
//}
//protected override void MoveItem(int oldIndex, int newIndex)
//{
// base.MoveItem(oldIndex, newIndex);
//}
//public override event NotifyCollectionChangedEventHandler? CollectionChanged
//{
// add => base.CollectionChanged += value;
// remove => base.CollectionChanged -= value;
//}
}
}

View File

@ -24,7 +24,6 @@ public class SignalRTags : AcSignalRTags
public const int GetShippingItems = 50; public const int GetShippingItems = 50;
public const int GetShippingItemById = 51; public const int GetShippingItemById = 51;
public const int GetShippingItemsByDocumentId = 52;
public const int AddShippingItem = 55; public const int AddShippingItem = 55;
public const int UpdateShippingItem = 56; public const int UpdateShippingItem = 56;
public const int UpdateMeasuredShippingItem = 57; public const int UpdateMeasuredShippingItem = 57;

View File

@ -17,14 +17,13 @@
<Columns> <Columns>
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" /> <DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" />
<DxGridDataColumn FieldName="CustomerId" /> <DxGridDataColumn FieldName="CustomerId" />
<DxGridDataColumn FieldName="OrderTotal" />
<DxGridDataColumn FieldName="OrderStatus" /> <DxGridDataColumn FieldName="OrderStatus" />
<DxGridDataColumn FieldName="IsMeasurable" ReadOnly="true" /> <DxGridDataColumn FieldName="IsMeasurable" ReadOnly="true" />
<DxGridDataColumn FieldName="MeasuringStatus" ReadOnly="true" /> <DxGridDataColumn FieldName="MeasuringStatus" ReadOnly="true" />
@* <DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" /> *@ @* <DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" /> *@
<DxGridDataColumn FieldName="OrderTotal" Caption="Végösszeg (br.)"/>
<DxGridDataColumn FieldName="IsAllOrderItemAvgWeightValid" ReadOnly="true" Caption="AvgWeightValid" /> <DxGridDataColumn FieldName="IsAllOrderItemAvgWeightValid" ReadOnly="true" Caption="AvgWeightValid" />
<DxGridDataColumn FieldName="RevisorId" ReadOnly="true" /> <DxGridDataColumn FieldName="RevisorId" ReadOnly="true" />
@ -112,34 +111,6 @@
LoadingPanelVisibility.Visible = false; LoadingPanelVisibility.Visible = false;
} }
// void OnCustomizeElement(GridCustomizeElementEventArgs e)
// {
// if (e.ElementType == GridElementType.DataCell)
// {
// //if (some_condition)
// e.Attributes["title"] = "some tooltip";
// }
// }
// void Grid_CustomizeElement(GridCustomizeElementEventArgs e)
// {
// if (e.ElementType == GridElementType.DataCell)
// {
// var fieldName = ((DxGridDataColumn)e.Column).FieldName;
// var cellIdentifier = e.VisibleIndex + ":" + fieldName;
// e.Attributes["data-id"] = cellIdentifier;
// e.Attributes["onmouseenter"] = EventCallback.Factory.Create<MouseEventArgs>(
// this,
// async _ =>
// {
// hoveredCellInfo = fieldName + ": " + e.Grid.GetRowValue(e.VisibleIndex, fieldName);
// selector = "td[data-id=\"" + cellIdentifier + "\"]";
// await Hint.ShowAsync();
// });
// }
// }
protected async Task OnActiveTabChanged(int activeTabIndex) protected async Task OnActiveTabChanged(int activeTabIndex)
{ {
_activeTabIndex = activeTabIndex; _activeTabIndex = activeTabIndex;

View File

@ -32,6 +32,8 @@
</DxGridDataColumn> </DxGridDataColumn>
@* <DxGridDataColumn FieldName="ProductName" /> *@ @* <DxGridDataColumn FieldName="ProductName" /> *@
<DxGridDataColumn FieldName="PriceInclTax" DisplayFormat="c" />
<DxGridDataColumn FieldName="UnitPriceInclTax" DisplayFormat="c" />
<DxGridDataColumn FieldName="Quantity" /> <DxGridDataColumn FieldName="Quantity" />
<DxGridDataColumn FieldName="NetWeight" /> <DxGridDataColumn FieldName="NetWeight" />
@ -40,9 +42,6 @@
<DxGridDataColumn FieldName="MeasuringStatus" ReadOnly="true" /> <DxGridDataColumn FieldName="MeasuringStatus" ReadOnly="true" />
@* <DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" /> *@ @* <DxGridDataColumn FieldName="IsMeasured" ReadOnly="true" /> *@
<DxGridDataColumn FieldName="UnitPriceInclTax" Caption="Egységár (br.)" />
<DxGridDataColumn FieldName="PriceInclTax" Caption="Végösszeg (br.)" />
<DxGridDataColumn FieldName="AverageWeight" ReadOnly="true" Visible="false" Caption="AvgWeight" /> <DxGridDataColumn FieldName="AverageWeight" ReadOnly="true" Visible="false" Caption="AvgWeight" />
<DxGridDataColumn FieldName="AverageWeightDifference" ReadOnly="true" Visible="false" Caption="AvgWeightDiff" /> <DxGridDataColumn FieldName="AverageWeightDifference" ReadOnly="true" Visible="false" Caption="AvgWeightDiff" />
<DxGridDataColumn FieldName="AverageWeightIsValid" ReadOnly="true" Caption="AvgWeightValid" /> <DxGridDataColumn FieldName="AverageWeightIsValid" ReadOnly="true" Caption="AvgWeightValid" />

View File

@ -53,7 +53,7 @@
//var orderItemDtos = _orderItemDtos?.Where(oi => oi.ProductId == productId).ToList() ?? []; //var orderItemDtos = _orderItemDtos?.Where(oi => oi.ProductId == productId).ToList() ?? [];
var contextIds = new[] { (object)((ProductDto)(context.DataItem)).Id }; var contextIds = new[] { (object)((ProductDto)(context.DataItem)).Id };
<GridStockQuantityHistoryDtoTemplate ContextIds="@(contextIds)" ParentDataItem="@((ProductDto)(context.DataItem))" /> <GridStockQuantityHistoryDtoTemplate ContextIds="@(contextIds)" IsMasterGrid="false" />
} }
</DxTabPage> </DxTabPage>
</DxTabs> </DxTabs>

View File

@ -1,5 +1,4 @@
@using AyCode.Core.Helpers @using AyCode.Utils.Extensions
@using AyCode.Utils.Extensions
@using FruitBank.Common.Dtos @using FruitBank.Common.Dtos
@using FruitBank.Common.Entities @using FruitBank.Common.Entities
@using FruitBankHybrid.Shared.Databases @using FruitBankHybrid.Shared.Databases
@ -26,8 +25,7 @@
@if (IsMasterGrid) @if (IsMasterGrid)
{ {
var shipping = ((Shipping)context.DataItem); var shipping = ((Shipping)context.DataItem);
var shippingDocuments = new AcFastObservableCollection<ShippingDocument>(); var shippingDocuments = shipping?.ShippingDocuments?.ToList() ?? [];
shippingDocuments.AddRange(shipping?.ShippingDocuments ?? []);
<DxTabs ActiveTabIndexChanged="(i) => OnActiveTabChanged(i)"> <DxTabs ActiveTabIndexChanged="(i) => OnActiveTabChanged(i)">
<DxTabPage Text="Szállítólevelek"> <DxTabPage Text="Szállítólevelek">
@ -38,7 +36,7 @@
</DxTabPage> </DxTabPage>
<DxTabPage Text="Szállítmány tételek"> <DxTabPage Text="Szállítmány tételek">
<GridShippingItemTemplate ShippingItems="shippingDocuments?.SelectMany(sd => sd.ShippingItems ?? [])?.ToList() ?? []" ParentDataItem="shipping" /> <GridShippingItemTemplate ShippingItems="shippingDocuments?.SelectMany(sd => sd.ShippingItems ?? [])?.ToList() ?? []" IsMasterGrid="false" />
</DxTabPage> </DxTabPage>
</DxTabs> </DxTabs>
} }

View File

@ -7,7 +7,6 @@
@using FruitBankHybrid.Shared.Services.SignalRs @using FruitBankHybrid.Shared.Services.SignalRs
@using System.Text @using System.Text
@using AyCode.Core.Extensions @using AyCode.Core.Extensions
@using AyCode.Core.Helpers
@using FruitBank.Common.Models @using FruitBank.Common.Models
@inject FruitBankSignalRClient FruitBankSignalRClient @inject FruitBankSignalRClient FruitBankSignalRClient
@ -74,12 +73,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">
<GridShippingItemTemplate ShippingItems="shippingDocument.ShippingItems" ParentDataItem="@shippingDocument" /> <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() ?? [];
<GridShippingItemPallets ShippingItemPallets="shippingItemPallets" IsMasterGrid="false" /> <GridShippingItemPallets OrderItemPallets="shippingItemPallets" IsMasterGrid="false" />
} }
</DxTabPage> </DxTabPage>
@ -128,9 +127,6 @@
</MgGridBase> </MgGridBase>
@code { @code {
//EditRow dblClick
//https://supportcenter.devexpress.com/ticket/details/t1097648/datagrid-for-blazor-how-to-start-editing-a-row-and-save-changes-without-the-command-column
//[Inject] public required ObjectLock ObjectLock { get; set; } //[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; }
@ -139,7 +135,7 @@
[Parameter] public List<Shipping>? Shippings { get; set; } [Parameter] public List<Shipping>? Shippings { get; set; }
[Parameter] public List<Partner>? Partners { get; set; } [Parameter] public List<Partner>? Partners { get; set; }
[Parameter] public AcFastObservableCollection<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; }
@ -190,14 +186,11 @@
using (await ObjectLock.GetSemaphore<ShippingDocument>().UseWaitAsync()) using (await ObjectLock.GetSemaphore<ShippingDocument>().UseWaitAsync())
{ {
if (ShippingDocuments == null) if (ShippingDocuments == null) ShippingDocuments = await FruitBankSignalRClient.GetShippingDocuments() ?? [];
{
ShippingDocuments = [];
ShippingDocuments.AddRange(await FruitBankSignalRClient.GetShippingDocuments() ?? []);
}
else if (ShippingDocuments.Count == 0 || forceReload) else if (ShippingDocuments.Count == 0 || forceReload)
{ {
ShippingDocuments.Replace(await FruitBankSignalRClient.GetShippingDocuments() ?? []); ShippingDocuments.Clear();
ShippingDocuments.AddRange(await FruitBankSignalRClient.GetShippingDocuments() ?? []);
} }
} }

View File

@ -1,11 +1,9 @@
@using AyCode.Core.Loggers; @using AyCode.Core.Loggers;
@using AyCode.Core.Extensions @using AyCode.Core.Extensions
@using AyCode.Core.Helpers @using AyCode.Core.Helpers
@using AyCode.Core.Interfaces
@using AyCode.Utils.Extensions @using AyCode.Utils.Extensions
@using FruitBank.Common.Dtos @using FruitBank.Common.Dtos
@using FruitBank.Common.Entities @using FruitBank.Common.Entities
@using FruitBank.Common.Interfaces
@using FruitBankHybrid.Shared.Components.Grids.ShippingItems @using FruitBankHybrid.Shared.Components.Grids.ShippingItems
@using FruitBankHybrid.Shared.Components.Toolbars @using FruitBankHybrid.Shared.Components.Toolbars
@using FruitBankHybrid.Shared.Databases @using FruitBankHybrid.Shared.Databases
@ -20,18 +18,17 @@ ValidationEnabled="false" EditMode="GridEditMode.EditRow"
EditModelSaving="Grid_EditModelSaving" EditModelSaving="Grid_EditModelSaving"
FocusedRowChanged="Grid_FocusedRowChanged" *@ FocusedRowChanged="Grid_FocusedRowChanged" *@
<GridShippingItem @ref="Grid" ParentDataItem="ParentDataItem" KeyFieldNameToParentId="@nameof(ShippingItem.ShippingDocumentId)" <GridShippingItem @ref="Grid" IsMasterGrid="IsMasterGrid" DataSource="ShippingItems" AutoSaveLayoutName="GridShippingItem"
DataSource="ShippingItems" AutoSaveLayoutName="GridShippingItem" SignalRClient="FruitBankSignalRClient" Logger="_logger" SignalRClient="FruitBankSignalRClient" Logger="_logger"
CssClass="@GridCss" ValidationEnabled="false" EditMode="GridEditMode.EditRow" CssClass="@GridCss" ValidationEnabled="false" EditMode="GridEditMode.EditRow"
FocusedRowChanged="Grid_FocusedRowChanged" OnGridEditModelSaving="EditModelSaving"> FocusedRowChanged="Grid_FocusedRowChanged">
@* <MgGridBase Data="ShippingItems" IsMasterGrid="IsMasterGrid" CssClass="@GridCss" AutoSaveLayoutName="GridShippingItem" @* <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">
Visible="@(!ParentDataItemIsShippingDocument)" ReadOnly="@(ParentDataItemIsShippingDocument)">
<EditSettings> <EditSettings>
<DxComboBoxSettings Data="ShippingDocuments" <DxComboBoxSettings Data="ShippingDocuments"
ValueFieldName="Id" ValueFieldName="Id"
@ -51,8 +48,7 @@ FocusedRowChanged="Grid_FocusedRowChanged" *@
</EditSettings> </EditSettings>
</DxGridDataColumn> </DxGridDataColumn>
<DxGridDataColumn FieldName="@("ShippingDocument.Partner.Name")" Caption="Patner" Width="125" ReadOnly="true" Visible="@(!ParentDataItemIsShippingDocument)" /> @* <DxGridDataColumn FieldName="PalletId" Caption="pId" Width="125" /> *@
<DxGridDataColumn FieldName="ProductId" Caption="Product"> <DxGridDataColumn FieldName="ProductId" Caption="Product">
<EditSettings> <EditSettings>
<DxComboBoxSettings Data="ProductDtos" <DxComboBoxSettings Data="ProductDtos"
@ -95,20 +91,7 @@ FocusedRowChanged="Grid_FocusedRowChanged" *@
<DxGridDataColumn FieldName="Modified" ReadOnly="true" /> <DxGridDataColumn FieldName="Modified" ReadOnly="true" />
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn> <DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
</Columns> </Columns>
@* <DataColumnCellDisplayTemplate> <DetailRowTemplate>
@{
if (context.DataColumn.FieldName == nameof(ShippingItem.ShippingDocumentId))
{
<span>@(String.Format("{0:P2}", context.Value))</span>
// format the value as percentage
}
else
{
<span>@context.DisplayText</span>
}
}
</DataColumnCellDisplayTemplate>
*@ <DetailRowTemplate>
@{ @{
var shippingItemPallets = ((ShippingItem)context.DataItem).ShippingItemPallets; var shippingItemPallets = ((ShippingItem)context.DataItem).ShippingItemPallets;
<GridShippingItemPallets ShippingItemPallets="shippingItemPallets" IsMasterGrid="false"></GridShippingItemPallets> <GridShippingItemPallets ShippingItemPallets="shippingItemPallets" IsMasterGrid="false"></GridShippingItemPallets>
@ -138,15 +121,12 @@ FocusedRowChanged="Grid_FocusedRowChanged" *@
//[Inject] public required ObjectLock ObjectLock { get; set; } //[Inject] public required ObjectLock ObjectLock { get; set; }
[Inject] public required DatabaseClient Database { get; set; } [Inject] public required DatabaseClient Database { get; set; }
//[Parameter] public int GetAllMessageTag { get; set; } [Parameter] public bool IsMasterGrid { get; set; } = false;
[Parameter] public IId<int>? ParentDataItem { get; set; }
[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 AcFastObservableCollection<ShippingDocument>? ShippingDocuments { get; set; } [Parameter] public List<ShippingDocument>? ShippingDocuments { get; set; }
public bool IsMasterGrid => ParentDataItem == null;
public bool ParentDataItemIsShippingDocument => (ParentDataItem is ShippingDocument);
string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty; string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty;
const string ExportFileName = "ExportResult"; const string ExportFileName = "ExportResult";
@ -168,28 +148,20 @@ FocusedRowChanged="Grid_FocusedRowChanged" *@
public async Task ReloadDataFromDb(bool forceReload = false) public async Task ReloadDataFromDb(bool forceReload = false)
{ {
if (!IsMasterGrid) return;
using (await ObjectLock.GetSemaphore<ProductDto>().UseWaitAsync()) using (await ObjectLock.GetSemaphore<ProductDto>().UseWaitAsync())
{ {
if (ProductDtos == null || !ProductDtos.Any() || forceReload) ProductDtos = await Database.ProductDtoTable.LoadDataAsync(!forceReload); if (ProductDtos == null || !ProductDtos.Any() || forceReload) ProductDtos = await Database.ProductDtoTable.LoadDataAsync(!forceReload);
} }
if (!IsMasterGrid)
{
if (ShippingDocuments == null && ParentDataItem is ShippingDocument shippingDocumentParent) ShippingDocuments = [shippingDocumentParent];
return;
}
using (await ObjectLock.GetSemaphore<ShippingDocument>().UseWaitAsync()) using (await ObjectLock.GetSemaphore<ShippingDocument>().UseWaitAsync())
{ {
if (ShippingDocuments == null) if (ShippingDocuments == null) ShippingDocuments = await FruitBankSignalRClient.GetShippingDocuments() ?? [];
{
ShippingDocuments = [];
ShippingDocuments.AddRange(await FruitBankSignalRClient.GetShippingDocuments() ?? []);
}
else if (ShippingDocuments.Count == 0 || forceReload) else if (ShippingDocuments.Count == 0 || forceReload)
{ {
ShippingDocuments.Replace(await FruitBankSignalRClient.GetShippingDocuments() ?? []); ShippingDocuments.Clear();
ShippingDocuments.AddRange(await FruitBankSignalRClient.GetShippingDocuments() ?? []);
} }
} }
@ -234,10 +206,4 @@ FocusedRowChanged="Grid_FocusedRowChanged" *@
EditItemsEnabled = true; EditItemsEnabled = true;
} }
private void EditModelSaving(GridEditModelSavingEventArgs obj)
{
//obj.
}
} }

View File

@ -19,7 +19,7 @@ public class FruitBankListGridBase<TDataItem> : MgGridBase<SignalRDataSourceList
[Inject] public required LoggedInModel LoggedInModel { get; set; } [Inject] public required LoggedInModel LoggedInModel { get; set; }
[Inject] public required IJSRuntime JSRuntime { get; set; } [Inject] public required IJSRuntime JSRuntime { get; set; }
//[Parameter] public bool IsMasterGrid { get; set; } = false; [Parameter] public bool IsMasterGrid { get; set; } = false;
[Parameter] public string AutoSaveLayoutName { get; set; } [Parameter] public string AutoSaveLayoutName { get; set; }
private bool _isFirstInitializeParameterCore; private bool _isFirstInitializeParameterCore;
@ -105,10 +105,11 @@ public class FruitBankListGridBase<TDataItem> : MgGridBase<SignalRDataSourceList
//VirtualScrollingEnabled = IsMasterGrid; //VirtualScrollingEnabled = IsMasterGrid;
PageSizeSelectorVisible = true; PageSizeSelectorVisible = true;
if (AutoSaveLayoutName.IsNullOrWhiteSpace()) AutoSaveLayoutName = $"Grid{typeof(TDataItem).Name}"; if (!AutoSaveLayoutName.IsNullOrWhiteSpace())
{
LayoutAutoLoading = Grid_LayoutAutoLoading; LayoutAutoLoading = Grid_LayoutAutoLoading;
LayoutAutoSaving = Grid_LayoutAutoSaving; LayoutAutoSaving = Grid_LayoutAutoSaving;
}
_isFirstInitializeParameters = true; _isFirstInitializeParameters = true;
} }
@ -128,13 +129,13 @@ public class FruitBankListGridBase<TDataItem> : MgGridBase<SignalRDataSourceList
async Task Grid_LayoutAutoLoading(GridPersistentLayoutEventArgs e) async Task Grid_LayoutAutoLoading(GridPersistentLayoutEventArgs e)
{ {
var masterDetailName = IsMasterGrid ? "Master" : ParentDataItem!.GetType().Name; var masterDetailName = IsMasterGrid ? "Master" : "Detail";
e.Layout = await LoadLayoutFromLocalStorageAsync($"{AutoSaveLayoutName}_{masterDetailName}_AutoSave_{LoggedInModel.CustomerDto?.Id ?? 0}"); e.Layout = await LoadLayoutFromLocalStorageAsync($"{AutoSaveLayoutName}_{masterDetailName}_AutoSave_{LoggedInModel.CustomerDto?.Id ?? 0}");
} }
private async Task Grid_LayoutAutoSaving(GridPersistentLayoutEventArgs e) private async Task Grid_LayoutAutoSaving(GridPersistentLayoutEventArgs e)
{ {
var masterDetailName = IsMasterGrid ? "Master" : ParentDataItem!.GetType().Name; var masterDetailName = IsMasterGrid ? "Master" : "Detail";
await SaveLayoutToLocalStorageAsync(e.Layout, $"{AutoSaveLayoutName}_{masterDetailName}_AutoSave_{LoggedInModel.CustomerDto?.Id ?? 0}"); await SaveLayoutToLocalStorageAsync(e.Layout, $"{AutoSaveLayoutName}_{masterDetailName}_AutoSave_{LoggedInModel.CustomerDto?.Id ?? 0}");
} }

View File

@ -16,17 +16,8 @@ public class GridStockQuantityHistoryDto : FruitBankListGridBase<StockQuantityHi
//RemoveMessageTag = SignalRTags.; //RemoveMessageTag = SignalRTags.;
} }
protected override async Task OnInitializedAsync()
{
GetAllMessageTag = IsMasterGrid ? SignalRTags.GetStockQuantityHistoryDtos : SignalRTags.GetStockQuantityHistoryDtosByProductId;
await base.OnInitializedAsync();
}
protected override Task SetParametersAsyncCore(ParameterView parameters) protected override Task SetParametersAsyncCore(ParameterView parameters)
{ {
return base.SetParametersAsyncCore(parameters);
if (!IsFirstInitializeParameters) if (!IsFirstInitializeParameters)
{ {
//ShowFilterRow = true; //ShowFilterRow = true;
@ -35,5 +26,7 @@ public class GridStockQuantityHistoryDto : FruitBankListGridBase<StockQuantityHi
//etc... //etc...
} }
return base.SetParametersAsyncCore(parameters);
} }
} }

View File

@ -1,5 +1,4 @@
@using AyCode.Core.Interfaces @using AyCode.Core.Loggers;
@using AyCode.Core.Loggers;
@using AyCode.Utils.Extensions @using AyCode.Utils.Extensions
@using FruitBank.Common.Dtos @using FruitBank.Common.Dtos
@using FruitBankHybrid.Shared.Components.Grids.ShippingItems @using FruitBankHybrid.Shared.Components.Grids.ShippingItems
@ -11,7 +10,7 @@
@inject IEnumerable<IAcLogWriterClientBase> LogWriters @inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject FruitBankSignalRClient FruitBankSignalRClient @inject FruitBankSignalRClient FruitBankSignalRClient
<GridStockQuantityHistoryDto @ref="Grid" ContextIds="ContextIds" ParentDataItem="ParentDataItem" DataSource="StockQuantityHistoryDtos" AutoSaveLayoutName="GridStockQuantityHistoryDto" <GridStockQuantityHistoryDto @ref="Grid" ContextIds="ContextIds" IsMasterGrid="IsMasterGrid" DataSource="StockQuantityHistoryDtos" AutoSaveLayoutName="GridStockQuantityHistoryDto"
SignalRClient="FruitBankSignalRClient" Logger="_logger" SignalRClient="FruitBankSignalRClient" Logger="_logger"
CssClass="@GridCss" ValidationEnabled="false"> CssClass="@GridCss" ValidationEnabled="false">
<Columns> <Columns>
@ -55,12 +54,11 @@
[Inject] public required DatabaseClient Database { get; set; } [Inject] public required DatabaseClient Database { get; set; }
[Parameter] public object[]? ContextIds { get; set; } [Parameter] public object[]? ContextIds { get; set; }
[Parameter] public IId<int>? ParentDataItem { get; set; } [Parameter] public bool IsMasterGrid { get; set; }
[Parameter] public IEnumerable<ProductDto>? ProductDtos { get; set; } [Parameter] public IEnumerable<ProductDto>? ProductDtos { get; set; }
[Parameter] public List<StockQuantityHistoryDto>? StockQuantityHistoryDtos { get; set; } [Parameter] public List<StockQuantityHistoryDto>? StockQuantityHistoryDtos { get; set; }
public bool IsMasterGrid => ParentDataItem == null;
string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty; string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty;
public GridStockQuantityHistoryDto Grid { get; set; } public GridStockQuantityHistoryDto Grid { get; set; }

View File

@ -1,7 +1,6 @@
using AyCode.Core.Interfaces; using AyCode.Core.Interfaces;
using DevExpress.Blazor; using DevExpress.Blazor;
using FruitBank.Common.Entities; using FruitBank.Common.Entities;
using FruitBank.Common.Interfaces;
using FruitBank.Common.SignalRs; using FruitBank.Common.SignalRs;
using FruitBankHybrid.Shared.Pages; using FruitBankHybrid.Shared.Pages;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
@ -10,66 +9,25 @@ namespace FruitBankHybrid.Shared.Components.Grids.ShippingItems;
public class GridShippingItem : FruitBankListGridBase<ShippingItem>, IGrid public class GridShippingItem : FruitBankListGridBase<ShippingItem>, IGrid
{ {
private bool _isFirstInitializeParameterCore;
private bool _isFirstInitializeParameters;
public GridShippingItem () : base() public GridShippingItem () : base()
{ {
GetAllMessageTag = SignalRTags.GetShippingItems;
AddMessageTag = SignalRTags.AddShippingItem; AddMessageTag = SignalRTags.AddShippingItem;
UpdateMessageTag = SignalRTags.UpdateShippingItem; UpdateMessageTag = SignalRTags.UpdateShippingItem;
//RemoveMessageTag = SignalRTags.; //RemoveMessageTag = SignalRTags.;
} }
protected override async Task OnInitializedAsync() protected override Task SetParametersAsyncCore(ParameterView parameters)
{ {
if (IsMasterGrid) GetAllMessageTag = SignalRTags.GetShippingItems; if (!IsFirstInitializeParameters)
else
{ {
ContextIds = [ParentDataItem!.Id];
if (ParentDataItem is IShippingDocument) GetAllMessageTag = SignalRTags.GetShippingItemsByDocumentId;
//else if (ParentDataItem is IShipping) GetAllMessageTag = SignalRTags.GetShippingItemsByShippingId;
}
await base.OnInitializedAsync();
}
protected override void OnParametersSet()
{
base.OnParametersSet();
if (!_isFirstInitializeParameters)
{
//if (!IsMasterGrid && (ContextIds == null || ContextIds.Length == 0))
//{
// ContextIds = [ParentDataItem!.Id];
// GetAllMessageTag = SignalRTags.GetShippingItemsByDocumentId;
//}
_isFirstInitializeParameters = false;
}
}
protected override async Task SetParametersAsyncCore(ParameterView parameters)
{
await base.SetParametersAsyncCore(parameters);
if (!_isFirstInitializeParameterCore)
{
//if (!IsMasterGrid && (ContextIds == null || ContextIds.Length == 0))
//{
// ContextIds = [ParentDataItem!.Id];
// GetAllMessageTag = SignalRTags.GetShippingItemsByDocumentId;
//}
//ShowFilterRow = true; //ShowFilterRow = true;
//ShowGroupPanel = true; //ShowGroupPanel = true;
//AllowSort = false; //AllowSort = false;
//etc... //etc...
}
_isFirstInitializeParameterCore = false; return base.SetParametersAsyncCore(parameters);
}
} }
} }

View File

@ -15,7 +15,6 @@ using Nop.Core.Domain.Orders;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Threading; using System.Threading;
using AyCode.Core.Helpers;
namespace FruitBankHybrid.Shared.Databases; namespace FruitBankHybrid.Shared.Databases;
@ -56,17 +55,17 @@ public class ShippingItemTable : SignalRDataSourceList<ShippingItemTableItem>
} }
} }
public class ProductDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : AcFastObservableCollection<ProductDtoTableItem> public class ProductDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : MgObservableCollection<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)
{ {
if (onlyIfEmpty && Count > 0) return this; if (onlyIfEmpty && Count != 0) return this;
using (await _semaphoreSlim.UseWaitAsync()) using (await _semaphoreSlim.UseWaitAsync())
{ {
//Előfordulhat, h egy másik szálban már megtörtént a refresh... - J. //Előfordulhat, h egy másik szálban már megtörtént a refresh... - J.
if (onlyIfEmpty && Count > 0) return this; if (onlyIfEmpty && Count != 0) return this;
var items = (await fruitBankSignalRClient.GetProductDtoTableItems() ?? []); var items = (await fruitBankSignalRClient.GetProductDtoTableItems() ?? []);
@ -81,17 +80,17 @@ public class ProductDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : Ac
return this; return this;
} }
} }
public class OrderDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : AcFastObservableCollection<OrderDtoTableItem> public class OrderDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : MgObservableCollection<OrderDtoTableItem>
{ {
private readonly SemaphoreSlim _semaphoreSlim = new(1); private readonly SemaphoreSlim _semaphoreSlim = new(1);
public async Task<OrderDtoTable> LoadDataAsync(bool onlyIfEmpty = true) public async Task<OrderDtoTable> LoadDataAsync(bool onlyIfEmpty = true)
{ {
if (onlyIfEmpty && Count > 0) return this; if (onlyIfEmpty && Count != 0) return this;
using (await _semaphoreSlim.UseWaitAsync()) using (await _semaphoreSlim.UseWaitAsync())
{ {
if (Count > 0) return this; if (Count != 0) return this;
var items = (await fruitBankSignalRClient.GetAllOrderDtoTableItems() ?? []); var items = (await fruitBankSignalRClient.GetAllOrderDtoTableItems() ?? []);

View File

@ -28,12 +28,12 @@
</div> </div>
<div class="nav-item px-3"> <div class="nav-item px-3">
<NavLink class="nav-link" href="MeasuringIn"> <NavLink class="nav-link" href="MeasuringIn">
<span class="icon counter-icon" aria-hidden="true"></span> Áru bevételezés <span class="icon counter-icon" aria-hidden="true"></span> Bejövő mérés
</NavLink> </NavLink>
</div> </div>
<div class="nav-item px-3"> <div class="nav-item px-3">
<NavLink class="nav-link" href="MeasuringOut"> <NavLink class="nav-link" href="MeasuringOut">
<span class="icon counter-icon" aria-hidden="true"></span> Áru kiadás <span class="icon counter-icon" aria-hidden="true"></span> Kimenő mérés
</NavLink> </NavLink>
</div> </div>

View File

@ -12,12 +12,12 @@ Welcome to your new app running on <em>@Factor</em> using <em>@Platform</em>.
<div class="col-md-3"></div> <div class="col-md-3"></div>
<div class="col-md-3"> <div class="col-md-3">
<NavLink href="MeasuringIn"> <NavLink href="MeasuringIn">
<DxButton Text="Áru bevételezés"></DxButton> <DxButton Text="Bejövő mérés"></DxButton>
</NavLink> </NavLink>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<NavLink href="MeasuringOut"> <NavLink href="MeasuringOut">
<DxButton Text="Áru kiadás"></DxButton> <DxButton Text="Kimenő mérés"></DxButton>
</NavLink> </NavLink>
</div> </div>
<div class="col-md-3"></div> <div class="col-md-3"></div>

View File

@ -8,7 +8,7 @@
@using FruitBankHybrid.Shared.Services @using FruitBankHybrid.Shared.Services
@using Mango.Nop.Core.Dtos @using Mango.Nop.Core.Dtos
<h3>Áru bevételezés</h3> <h3>Bejövő mérés</h3>
<div style="margin-top: 50px;"> <div style="margin-top: 50px;">
<DxLoadingPanel @bind-Visible="LoadingPanelVisible" <DxLoadingPanel @bind-Visible="LoadingPanelVisible"

View File

@ -8,7 +8,7 @@
@using FruitBankHybrid.Shared.Components @using FruitBankHybrid.Shared.Components
@using FruitBankHybrid.Shared.Services @using FruitBankHybrid.Shared.Services
@using Nop.Core.Domain.Orders @using Nop.Core.Domain.Orders
<h3>Áru kiadás</h3> <h3>Kimenő mérés</h3>
<DxDialogProvider /> <DxDialogProvider />

View File

@ -26,7 +26,7 @@
<GridShippingDocument @ref="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">
<GridShippingItemTemplate @ref="gridShippingItemTemplate" ShippingItems="ShippingItems" ShippingDocuments="ShippingDocuments"></GridShippingItemTemplate> <GridShippingItemTemplate @ref="gridShippingItemTemplate" ShippingItems="ShippingItems" ShippingDocuments="ShippingDocuments" IsMasterGrid="true"></GridShippingItemTemplate>
</DxTabPage> </DxTabPage>
<DxTabPage Text="Mérések"> <DxTabPage Text="Mérések">
<GridShippingItemPallets @ref="gridShippingItemPallet" IsMasterGrid="true" ShippingItemPallets="ShippingItemPallets"></GridShippingItemPallets> <GridShippingItemPallets @ref="gridShippingItemPallet" IsMasterGrid="true" ShippingItemPallets="ShippingItemPallets"></GridShippingItemPallets>

View File

@ -1,5 +1,4 @@
using AyCode.Core.Helpers; using AyCode.Core.Loggers;
using AyCode.Core.Loggers;
using DevExpress.Blazor; using DevExpress.Blazor;
using DevExpress.ClipboardSource.SpreadsheetML; using DevExpress.ClipboardSource.SpreadsheetML;
using FruitBank.Common.Dtos; using FruitBank.Common.Dtos;
@ -32,7 +31,7 @@ public partial class ShippingsAdmin : ComponentBase
private GridShippingItemPallets gridShippingItemPallet; private GridShippingItemPallets gridShippingItemPallet;
public List<Shipping> Shippings { get; set; } = []; public List<Shipping> Shippings { get; set; } = [];
public AcFastObservableCollection<ShippingDocument> ShippingDocuments { get; set; } = []; public List<ShippingDocument> ShippingDocuments { get; set; } = [];
public List<ShippingItem> ShippingItems { get; set; } = []; public List<ShippingItem> ShippingItems { get; set; } = [];
public List<ShippingItemPallet> ShippingItemPallets { get; set; } = []; public List<ShippingItemPallet> ShippingItemPallets { get; set; } = [];

View File

@ -96,9 +96,6 @@ namespace FruitBankHybrid.Shared.Services.SignalRs
public Task<List<ShippingItem>?> GetShippingItems() public Task<List<ShippingItem>?> GetShippingItems()
=> GetAllAsync<List<ShippingItem>>(SignalRTags.GetShippingItems); => GetAllAsync<List<ShippingItem>>(SignalRTags.GetShippingItems);
public Task<List<ShippingItem>?> GetShippingItemsByDocumentId(int shippingDocumentId)
=> GetAllAsync<List<ShippingItem>>(SignalRTags.GetShippingItemsByDocumentId, [shippingDocumentId]);
public Task<ShippingItem?> GetShippingItemById(int id) public Task<ShippingItem?> GetShippingItemById(int id)
=> GetByIdAsync<ShippingItem?>(SignalRTags.GetShippingItemById, id); => GetByIdAsync<ShippingItem?>(SignalRTags.GetShippingItemById, id);

View File

@ -103,7 +103,6 @@ h1:focus {
font-weight: 700; font-weight: 700;
color: #161616; color: #161616;
} }
/* DevExpress and Bootstrap Themes */ /* DevExpress and Bootstrap Themes */
.alt-item > td:not(.dxbl-grid-empty-cell), .alt-item > td:not(.dxbl-grid-empty-cell),
.alt-item > td:not(.dxbl-grid-indent-cell) { .alt-item > td:not(.dxbl-grid-indent-cell) {