diff --git a/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs b/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs index 7786f2b..e7e5fd1 100644 --- a/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs +++ b/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs @@ -26,6 +26,7 @@ public interface IFruitBankDataControllerCommon #region ShippingItem public Task?> GetShippingItems(); + public Task?> GetShippingItemsByDocumentId(int shippingDocumentId); public Task GetShippingItemById(int id); public Task AddShippingItem(ShippingItem shippingItem); public Task UpdateShippingItem(ShippingItem shippingItem); diff --git a/FruitBank.Common/MgObservableCollection.cs b/FruitBank.Common/MgObservableCollection.cs deleted file mode 100644 index fbb27ba..0000000 --- a/FruitBank.Common/MgObservableCollection.cs +++ /dev/null @@ -1,152 +0,0 @@ -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 : IMgFastObservableCollection - { - public void Replace(IEnumerable other); - public void Sort(IComparer comparer); - public void SortAndReplace(IEnumerable other, IComparer comparer); - } - - public class MgObservableCollection : ObservableCollection, IMgFastObservableCollection - { - private bool _suppressChangedEvent; - - public void Replace(IEnumerable 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 other, IComparer comparer) - { - List values = new(other); - - values.Sort(comparer); - Replace(values); - } - - public void Sort(IComparer comparer) - { - List 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; - //} - } -} \ No newline at end of file diff --git a/FruitBank.Common/SignalRs/SignalRTags.cs b/FruitBank.Common/SignalRs/SignalRTags.cs index 7d2680d..3fd5465 100644 --- a/FruitBank.Common/SignalRs/SignalRTags.cs +++ b/FruitBank.Common/SignalRs/SignalRTags.cs @@ -24,6 +24,7 @@ public class SignalRTags : AcSignalRTags public const int GetShippingItems = 50; public const int GetShippingItemById = 51; + public const int GetShippingItemsByDocumentId = 52; public const int AddShippingItem = 55; public const int UpdateShippingItem = 56; public const int UpdateMeasuredShippingItem = 57; diff --git a/FruitBankHybrid.Shared/Components/GridProductDtoTemplate.razor b/FruitBankHybrid.Shared/Components/GridProductDtoTemplate.razor index c6d35e3..1e7a83a 100644 --- a/FruitBankHybrid.Shared/Components/GridProductDtoTemplate.razor +++ b/FruitBankHybrid.Shared/Components/GridProductDtoTemplate.razor @@ -53,7 +53,7 @@ //var orderItemDtos = _orderItemDtos?.Where(oi => oi.ProductId == productId).ToList() ?? []; var contextIds = new[] { (object)((ProductDto)(context.DataItem)).Id }; - + } diff --git a/FruitBankHybrid.Shared/Components/GridShipping.razor b/FruitBankHybrid.Shared/Components/GridShipping.razor index 8d55e6d..87cbd73 100644 --- a/FruitBankHybrid.Shared/Components/GridShipping.razor +++ b/FruitBankHybrid.Shared/Components/GridShipping.razor @@ -1,4 +1,5 @@ -@using AyCode.Utils.Extensions +@using AyCode.Core.Helpers +@using AyCode.Utils.Extensions @using FruitBank.Common.Dtos @using FruitBank.Common.Entities @using FruitBankHybrid.Shared.Databases @@ -25,7 +26,8 @@ @if (IsMasterGrid) { var shipping = ((Shipping)context.DataItem); - var shippingDocuments = shipping?.ShippingDocuments?.ToList() ?? []; + var shippingDocuments = new AcFastObservableCollection(); + shippingDocuments.AddRange(shipping?.ShippingDocuments ?? []); @@ -36,7 +38,7 @@ - + } diff --git a/FruitBankHybrid.Shared/Components/GridShippingDocument.razor b/FruitBankHybrid.Shared/Components/GridShippingDocument.razor index be2f607..888d88d 100644 --- a/FruitBankHybrid.Shared/Components/GridShippingDocument.razor +++ b/FruitBankHybrid.Shared/Components/GridShippingDocument.razor @@ -7,6 +7,7 @@ @using FruitBankHybrid.Shared.Services.SignalRs @using System.Text @using AyCode.Core.Extensions +@using AyCode.Core.Helpers @using FruitBank.Common.Models @inject FruitBankSignalRClient FruitBankSignalRClient @@ -73,12 +74,12 @@ - + @{ var shippingItemPallets = shippingDocument?.ShippingItems?.SelectMany(oi => oi.ShippingItemPallets ?? []).ToList() ?? []; - + } @@ -127,6 +128,9 @@ @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 DatabaseClient Database { get; set; } [Inject] public required LoggedInModel LoggedInModel { get; set; } @@ -135,7 +139,7 @@ [Parameter] public List? Shippings { get; set; } [Parameter] public List? Partners { get; set; } - [Parameter] public List? ShippingDocuments { get; set; } + [Parameter] public AcFastObservableCollection? ShippingDocuments { get; set; } [Parameter] public Func?, Task>? OnUploadedFileParsed { get; set; } @@ -186,11 +190,14 @@ using (await ObjectLock.GetSemaphore().UseWaitAsync()) { - if (ShippingDocuments == null) ShippingDocuments = await FruitBankSignalRClient.GetShippingDocuments() ?? []; + if (ShippingDocuments == null) + { + ShippingDocuments = []; + ShippingDocuments.AddRange(await FruitBankSignalRClient.GetShippingDocuments() ?? []); + } else if (ShippingDocuments.Count == 0 || forceReload) { - ShippingDocuments.Clear(); - ShippingDocuments.AddRange(await FruitBankSignalRClient.GetShippingDocuments() ?? []); + ShippingDocuments.Replace(await FruitBankSignalRClient.GetShippingDocuments() ?? []); } } diff --git a/FruitBankHybrid.Shared/Components/GridShippingItemTemplate.razor b/FruitBankHybrid.Shared/Components/GridShippingItemTemplate.razor index 2c641bd..91e3372 100644 --- a/FruitBankHybrid.Shared/Components/GridShippingItemTemplate.razor +++ b/FruitBankHybrid.Shared/Components/GridShippingItemTemplate.razor @@ -1,9 +1,11 @@ @using AyCode.Core.Loggers; @using AyCode.Core.Extensions @using AyCode.Core.Helpers +@using AyCode.Core.Interfaces @using AyCode.Utils.Extensions @using FruitBank.Common.Dtos @using FruitBank.Common.Entities +@using FruitBank.Common.Interfaces @using FruitBankHybrid.Shared.Components.Grids.ShippingItems @using FruitBankHybrid.Shared.Components.Toolbars @using FruitBankHybrid.Shared.Databases @@ -18,17 +20,18 @@ ValidationEnabled="false" EditMode="GridEditMode.EditRow" EditModelSaving="Grid_EditModelSaving" FocusedRowChanged="Grid_FocusedRowChanged" *@ - + FocusedRowChanged="Grid_FocusedRowChanged" OnGridEditModelSaving="EditModelSaving"> @* *@ - + - + @@ -135,12 +138,15 @@ FocusedRowChanged="Grid_FocusedRowChanged" *@ //[Inject] public required ObjectLock ObjectLock { get; set; } [Inject] public required DatabaseClient Database { get; set; } - [Parameter] public bool IsMasterGrid { get; set; } = false; + //[Parameter] public int GetAllMessageTag { get; set; } + [Parameter] public IId? ParentDataItem { get; set; } [Parameter] public IEnumerable? ProductDtos { get; set; } [Parameter] public List? ShippingItems { get; set; } - [Parameter] public List? ShippingDocuments { get; set; } + [Parameter] public AcFastObservableCollection? ShippingDocuments { get; set; } + public bool IsMasterGrid => ParentDataItem == null; + public bool ParentDataItemIsShippingDocument => (ParentDataItem is ShippingDocument); string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty; const string ExportFileName = "ExportResult"; @@ -162,20 +168,28 @@ FocusedRowChanged="Grid_FocusedRowChanged" *@ public async Task ReloadDataFromDb(bool forceReload = false) { - if (!IsMasterGrid) return; - using (await ObjectLock.GetSemaphore().UseWaitAsync()) { 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().UseWaitAsync()) { - if (ShippingDocuments == null) ShippingDocuments = await FruitBankSignalRClient.GetShippingDocuments() ?? []; + if (ShippingDocuments == null) + { + ShippingDocuments = []; + ShippingDocuments.AddRange(await FruitBankSignalRClient.GetShippingDocuments() ?? []); + } else if (ShippingDocuments.Count == 0 || forceReload) { - ShippingDocuments.Clear(); - ShippingDocuments.AddRange(await FruitBankSignalRClient.GetShippingDocuments() ?? []); + ShippingDocuments.Replace(await FruitBankSignalRClient.GetShippingDocuments() ?? []); } } @@ -220,4 +234,10 @@ FocusedRowChanged="Grid_FocusedRowChanged" *@ EditItemsEnabled = true; } + + private void EditModelSaving(GridEditModelSavingEventArgs obj) + { + //obj. + } + } \ No newline at end of file diff --git a/FruitBankHybrid.Shared/Components/Grids/FruitBankGrid.cs b/FruitBankHybrid.Shared/Components/Grids/FruitBankGrid.cs index 5724019..0a267a4 100644 --- a/FruitBankHybrid.Shared/Components/Grids/FruitBankGrid.cs +++ b/FruitBankHybrid.Shared/Components/Grids/FruitBankGrid.cs @@ -19,7 +19,7 @@ public class FruitBankListGridBase : MgGridBase : MgGridBase : MgGridBase : MgGridBase : MgGridBase LogWriters @inject FruitBankSignalRClient FruitBankSignalRClient - @@ -54,11 +55,12 @@ [Inject] public required DatabaseClient Database { get; set; } [Parameter] public object[]? ContextIds { get; set; } - [Parameter] public bool IsMasterGrid { get; set; } + [Parameter] public IId? ParentDataItem { get; set; } [Parameter] public IEnumerable? ProductDtos { get; set; } [Parameter] public List? StockQuantityHistoryDtos { get; set; } + public bool IsMasterGrid => ParentDataItem == null; string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty; public GridStockQuantityHistoryDto Grid { get; set; } diff --git a/FruitBankHybrid.Shared/Components/Grids/ShippingItems/GridShippingItem.cs b/FruitBankHybrid.Shared/Components/Grids/ShippingItems/GridShippingItem.cs index 340f834..f9fa907 100644 --- a/FruitBankHybrid.Shared/Components/Grids/ShippingItems/GridShippingItem.cs +++ b/FruitBankHybrid.Shared/Components/Grids/ShippingItems/GridShippingItem.cs @@ -1,6 +1,7 @@ using AyCode.Core.Interfaces; using DevExpress.Blazor; using FruitBank.Common.Entities; +using FruitBank.Common.Interfaces; using FruitBank.Common.SignalRs; using FruitBankHybrid.Shared.Pages; using Microsoft.AspNetCore.Components; @@ -9,25 +10,66 @@ namespace FruitBankHybrid.Shared.Components.Grids.ShippingItems; public class GridShippingItem : FruitBankListGridBase, IGrid { + private bool _isFirstInitializeParameterCore; + private bool _isFirstInitializeParameters; + public GridShippingItem () : base() { - GetAllMessageTag = SignalRTags.GetShippingItems; AddMessageTag = SignalRTags.AddShippingItem; UpdateMessageTag = SignalRTags.UpdateShippingItem; + //RemoveMessageTag = SignalRTags.; } - protected override Task SetParametersAsyncCore(ParameterView parameters) + protected override async Task OnInitializedAsync() { - if (!IsFirstInitializeParameters) + if (IsMasterGrid) GetAllMessageTag = SignalRTags.GetShippingItems; + 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; //ShowGroupPanel = true; //AllowSort = false; //etc... - } - return base.SetParametersAsyncCore(parameters); + _isFirstInitializeParameterCore = false; + } } } \ No newline at end of file diff --git a/FruitBankHybrid.Shared/Databases/DatabaseClient.cs b/FruitBankHybrid.Shared/Databases/DatabaseClient.cs index a223791..26fd044 100644 --- a/FruitBankHybrid.Shared/Databases/DatabaseClient.cs +++ b/FruitBankHybrid.Shared/Databases/DatabaseClient.cs @@ -15,6 +15,7 @@ using Nop.Core.Domain.Orders; using System.Collections.Concurrent; using System.Collections.ObjectModel; using System.Threading; +using AyCode.Core.Helpers; namespace FruitBankHybrid.Shared.Databases; @@ -55,7 +56,7 @@ public class ShippingItemTable : SignalRDataSourceList } } -public class ProductDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : MgObservableCollection +public class ProductDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : AcFastObservableCollection { private readonly SemaphoreSlim _semaphoreSlim = new(1); public async Task LoadDataAsync(bool onlyIfEmpty = true) @@ -80,7 +81,7 @@ public class ProductDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : Mg return this; } } -public class OrderDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : MgObservableCollection +public class OrderDtoTable(FruitBankSignalRClient fruitBankSignalRClient) : AcFastObservableCollection { private readonly SemaphoreSlim _semaphoreSlim = new(1); diff --git a/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor b/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor index 20a62cc..1e50c57 100644 --- a/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor +++ b/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor @@ -26,7 +26,7 @@ - + diff --git a/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor.cs b/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor.cs index 0aea55a..bc54f56 100644 --- a/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor.cs +++ b/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor.cs @@ -1,4 +1,5 @@ -using AyCode.Core.Loggers; +using AyCode.Core.Helpers; +using AyCode.Core.Loggers; using DevExpress.Blazor; using DevExpress.ClipboardSource.SpreadsheetML; using FruitBank.Common.Dtos; @@ -31,7 +32,7 @@ public partial class ShippingsAdmin : ComponentBase private GridShippingItemPallets gridShippingItemPallet; public List Shippings { get; set; } = []; - public List ShippingDocuments { get; set; } = []; + public AcFastObservableCollection ShippingDocuments { get; set; } = []; public List ShippingItems { get; set; } = []; public List ShippingItemPallets { get; set; } = []; diff --git a/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs b/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs index 08e5adb..8c0e8e1 100644 --- a/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs +++ b/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs @@ -96,6 +96,9 @@ namespace FruitBankHybrid.Shared.Services.SignalRs public Task?> GetShippingItems() => GetAllAsync>(SignalRTags.GetShippingItems); + public Task?> GetShippingItemsByDocumentId(int shippingDocumentId) + => GetAllAsync>(SignalRTags.GetShippingItemsByDocumentId, [shippingDocumentId]); + public Task GetShippingItemById(int id) => GetByIdAsync(SignalRTags.GetShippingItemById, id);