Refactor SignalR, pallet editing, and error handling

- Refactored SignalRMessageToClientWithText<T> to use explicit constructors and properties.
- Added Shipping.Comment column to GridShippingDocument.razor.
- Updated PalletItemComponent: renamed audit callback, added pre-save/audit callback, improved UI refresh logic.
- MeasuringOut now uses new callbacks and _enablePalletItems flag to control editability during save/audit.
- Wrapped SignalR message handling and logout logic in try/catch for better error logging.
- MainLayout and MeasuringOut now implement IDisposable to unsubscribe SignalR events.
- UI editability and state updates improved for thread safety and responsiveness.
This commit is contained in:
Loretta 2026-03-06 14:27:22 +01:00
parent f5915f7f72
commit a73b72f831
6 changed files with 179 additions and 118 deletions

View File

@ -2,8 +2,16 @@
namespace FruitBank.Common.Models.SignalRs; namespace FruitBank.Common.Models.SignalRs;
public class SignalRMessageToClientWithText<T>(string? message, T? content) public class SignalRMessageToClientWithText<T>
{ {
public string? Message { get; set; } = message; public SignalRMessageToClientWithText()
public T? Content { get; set; } = content; {}
public SignalRMessageToClientWithText(string? message, T? content) : this()
{
Message = message;
Content = content;
}
public string? Message { get; set; }
public T? Content { get; set; }
} }

View File

@ -57,6 +57,7 @@
<DxListEditorColumn FieldName="@nameof(Shipping.Id)" /> <DxListEditorColumn FieldName="@nameof(Shipping.Id)" />
<DxListEditorColumn FieldName="@nameof(Shipping.ShippingDate)" /> <DxListEditorColumn FieldName="@nameof(Shipping.ShippingDate)" />
<DxListEditorColumn FieldName="@nameof(Shipping.LicencePlate)" /> <DxListEditorColumn FieldName="@nameof(Shipping.LicencePlate)" />
<DxListEditorColumn FieldName="@nameof(Shipping.Comment)" />
</Columns> </Columns>
</DxComboBoxSettings> </DxComboBoxSettings>
</EditSettings> </EditSettings>

View File

@ -60,7 +60,7 @@
} }
</DxFormLayout> </DxFormLayout>
@code { @code {
[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 LoggedInModel LoggedInModel { get; set; } [Inject] public required LoggedInModel LoggedInModel { get; set; }
@ -75,10 +75,14 @@
[Parameter] public int? MaxTrayQuantity { get; set; } = null; [Parameter] public int? MaxTrayQuantity { get; set; } = null;
[Parameter] public bool Editable { get; set; } = true; [Parameter] public bool Editable { get; set; } = true;
//[Parameter] public EventCallback OnPalletItemSaveClick { get; set; }
[Parameter] public Func<TPalletItem?, Task>? OnPalletItemSaved { get; set; } [Parameter] public Func<TPalletItem?, Task>? OnPalletItemSaved { get; set; }
[Parameter] public Func<TPalletItem, Task>? OnPalletItemValueChanged { get; set; } [Parameter] public Func<TPalletItem, Task>? OnPalletItemValueChanged { get; set; }
[Parameter] public Func<TPalletItem?, Task>? OnPalletItemAuditedClick { get; set; } [Parameter] public Func<TPalletItem?, Task>? OnPalletItemAudited { get; set; }
/// <summary>
/// Before Save or Audit
/// </summary>
[Parameter] public Func<TPalletItem?, Task>? OnPalletItemSaveOrAuditClick { get; set; }
//public bool LoadingPanelVisible { get; set; } = false; //public bool LoadingPanelVisible { get; set; } = false;
//public bool Editable => !HasAuditButton || (OrderItemPallet.IsAudited); //public bool Editable => !HasAuditButton || (OrderItemPallet.IsAudited);
@ -119,6 +123,8 @@
PalletItem.ModifierId = LoggedInModel.CustomerDto?.Id; PalletItem.ModifierId = LoggedInModel.CustomerDto?.Id;
if (OnPalletItemSaveOrAuditClick != null) await OnPalletItemSaveOrAuditClick.Invoke(PalletItem);
var responseShippingItemPallet = await FruitBankSignalRClient.PostDataAsync(AddOrUpdateSignalRTag!.Value, PalletItem); var responseShippingItemPallet = await FruitBankSignalRClient.PostDataAsync(AddOrUpdateSignalRTag!.Value, PalletItem);
if (responseShippingItemPallet != null) PalletItem.Id = responseShippingItemPallet.Id; //Az UpdateCollection miatt kell, hogy megtalálja mit kell kicserélni! - J. if (responseShippingItemPallet != null) PalletItem.Id = responseShippingItemPallet.Id; //Az UpdateCollection miatt kell, hogy megtalálja mit kell kicserélni! - J.
//else _logger.Error($"Sikertelen volt a raklap adatainak mentése!"); //else _logger.Error($"Sikertelen volt a raklap adatainak mentése!");
@ -126,7 +132,7 @@
if (OnPalletItemSaved != null) await OnPalletItemSaved.Invoke(responseShippingItemPallet); if (OnPalletItemSaved != null) await OnPalletItemSaved.Invoke(responseShippingItemPallet);
//LoadingPanelVisible = false; //LoadingPanelVisible = false;
StateHasChanged(); await InvokeAsync(StateHasChanged);
} }
protected async Task OnItemUpdating(string fieldName, object newValue, TPalletItem palletItem) protected async Task OnItemUpdating(string fieldName, object newValue, TPalletItem palletItem)
@ -172,15 +178,17 @@
private async Task PalletItemAuditedClick() private async Task PalletItemAuditedClick()
{ {
if (OnPalletItemAuditedClick != null) if (OnPalletItemAudited != null)
{ {
if (OrderItemPallet == null) throw new Exception($"PalletItemComponent->PalletItemAuditedClick(); OrderItemPallet == null"); if (OrderItemPallet == null) throw new Exception($"PalletItemComponent->PalletItemAuditedClick(); OrderItemPallet == null");
if (await DialogService.ShowConfirmBoxAsync("Megerősítés", "Biztoan jóváhagyja a mérést? Jóváhagyás után a mérés nem módosítható!", MessageBoxRenderStyle.Info)) if (await DialogService.ShowConfirmBoxAsync("Megerősítés", "Biztoan jóváhagyja a mérést? Jóváhagyás után a mérés nem módosítható!", MessageBoxRenderStyle.Info))
{ {
if (OnPalletItemSaveOrAuditClick != null) await OnPalletItemSaveOrAuditClick.Invoke(PalletItem);
OrderItemPallet.RevisorId = LoggedInModel.CustomerDto!.Id; OrderItemPallet.RevisorId = LoggedInModel.CustomerDto!.Id;
StateHasChanged(); //Az Audit button miatt kell a StateHasChanged(), most már van RevisorId és emiatt disabled lesz... await InvokeAsync(StateHasChanged); //Az Audit button miatt kell a StateHasChanged(), most már van RevisorId és emiatt disabled lesz...
PalletItem.SetParentPropToNull(); PalletItem.SetParentPropToNull();
@ -191,7 +199,7 @@
await DialogService.ShowMessageBoxAsync("Hiba", "Adatok mentése sikertelen volt, ellenőrizze a mérés adatait!", MessageBoxRenderStyle.Danger); await DialogService.ShowMessageBoxAsync("Hiba", "Adatok mentése sikertelen volt, ellenőrizze a mérés adatait!", MessageBoxRenderStyle.Danger);
} }
if (OnPalletItemAuditedClick != null) await OnPalletItemAuditedClick.Invoke(responseShippingItemPallet); await OnPalletItemAudited.Invoke(responseShippingItemPallet);
} }
} }
} }

View File

@ -16,7 +16,7 @@ using Microsoft.AspNetCore.Components;
namespace FruitBankHybrid.Shared.Layout; namespace FruitBankHybrid.Shared.Layout;
public partial class MainLayout : LayoutComponentBase public partial class MainLayout : LayoutComponentBase, IDisposable
{ {
[Inject] public required IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; } [Inject] public required IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; }
[Inject] public required NavigationManager NavManager { get; set; } [Inject] public required NavigationManager NavManager { get; set; }
@ -70,43 +70,57 @@ public partial class MainLayout : LayoutComponentBase
{ {
if (messageTag != SignalRTags.NotificationReceived || !LoggedInModel.IsLoggedIn) return; if (messageTag != SignalRTags.NotificationReceived || !LoggedInModel.IsLoggedIn) return;
var notificationMessage = responseDataMessage?.GetResponseData<SignalRMessageToClientWithText<OrderDto>>(); try
if (notificationMessage == null)
{ {
_logger.Error($"notificationMessage == null"); var notificationMessage = responseDataMessage?.GetResponseData<SignalRMessageToClientWithText<OrderDto>>();
return; if (notificationMessage == null)
{
_logger.Error($"MainLayout.SignalRClientOnMessageReceived; notificationMessage == null; messageTag: {messageTag}");
return;
}
toastOrderNumber = null;
toastDateOfReceipt = null;
toastMessage = notificationMessage.Message;
var orderDto = notificationMessage.Content;
var hasPermission = orderDto == null || (orderDto.HasMeasuringAccess(LoggedInModel.CustomerDto!.Id, LoggedInModel.IsRevisor) || orderDto.MeasurementOwnerId == 0);
if (orderDto != null && hasPermission)
{
toastOrderNumber = orderDto.CustomOrderNumber;
toastDateOfReceipt = orderDto.DateOfReceipt;
}
if (!hasPermission) return;
_logger.Debug($"MainLayout.SignalRClientOnMessageReceived; NotificationMessage received. {toastMessage}");
await InvokeAsync(() =>
{
orderNotificationToast?.Show();
StateHasChanged();
});
} }
catch (Exception ex)
toastOrderNumber = null;
toastDateOfReceipt = null;
toastMessage = notificationMessage.Message;
var orderDto = notificationMessage.Content;
var hasPermission = orderDto == null || (orderDto.HasMeasuringAccess(LoggedInModel.CustomerDto!.Id, LoggedInModel.IsRevisor) || orderDto.MeasurementOwnerId == 0);
if (orderDto != null && hasPermission)
{ {
toastOrderNumber = orderDto.CustomOrderNumber; _logger.Error($"MainLayout.SignalRClientOnMessageReceived ERROR; messageTag: {messageTag}", ex);
toastDateOfReceipt = orderDto.DateOfReceipt;
} }
if (!hasPermission) return;
_logger.Debug($"NotificationMessage received. {toastMessage}");
await InvokeAsync(() =>
{
orderNotificationToast?.Show();
StateHasChanged();
});
} }
private async void OnLogoutClick() private async void OnLogoutClick()
{ {
await LoggedInModel.LogOutAsync(); try
RefreshMainLayout(); {
NavManager.NavigateTo("/Login"); await LoggedInModel.LogOutAsync();
RefreshMainLayout();
NavManager.NavigateTo("/Login");
}
catch (Exception e)
{
_logger.Error($"OnLogoutClick error");
}
} }
public void RefreshMainLayout() public void RefreshMainLayout()

View File

@ -176,7 +176,8 @@
{ {
var selectedOrderItem = (OrderItemDto)(context.DataItem); var selectedOrderItem = (OrderItemDto)(context.DataItem);
<DxFormLayout Context="ctxFormLayout" Data="@selectedOrderItem" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100"> <DxFormLayout Context="ctxFormLayout" Data="@selectedOrderItem" CaptionPosition="CaptionPosition.Vertical"
CssClass="w-100">
<DxFormLayoutItem Context="ctxFormLayoutItem" ColSpanMd="12"> <DxFormLayoutItem Context="ctxFormLayoutItem" ColSpanMd="12">
@for (var index = 0; index < (selectedOrderItem?.OrderItemPallets?.Count ?? 0); index++) @for (var index = 0; index < (selectedOrderItem?.OrderItemPallets?.Count ?? 0); index++)
{ {
@ -185,14 +186,15 @@
<PalletItemComponent IsMeasurable="@selectedOrderItem.IsMeasurable" <PalletItemComponent IsMeasurable="@selectedOrderItem.IsMeasurable"
MeasuringIndex="@localI" MeasuringIndex="@localI"
Editable="@(!currentOrderItemPallet.IsAudited && !(SelectedOrder?.IsComplete ?? false))" Editable="@(_enablePalletItems && !currentOrderItemPallet.IsAudited && !(SelectedOrder?.IsComplete ?? false))"
PalletItem="@currentOrderItemPallet" PalletItem="@currentOrderItemPallet"
ProductId="@selectedOrderItem.ProductId" ProductId="@selectedOrderItem.ProductId"
MaxTrayQuantity="@selectedOrderItem.Quantity" MaxTrayQuantity="@selectedOrderItem.Quantity"
AddOrUpdateSignalRTag="SignalRTags.AddOrUpdateMeasuredOrderItemPallet" AddOrUpdateSignalRTag="SignalRTags.AddOrUpdateMeasuredOrderItemPallet"
OnPalletItemSaveOrAuditClick="pallet => OnOrderItemSaveOrAuditClick(pallet, selectedOrderItem)"
OnPalletItemSaved="pallet => OnOrderItemPalletSaved(pallet, selectedOrderItem)" OnPalletItemSaved="pallet => OnOrderItemPalletSaved(pallet, selectedOrderItem)"
OnPalletItemValueChanged="pallet => OnOrderItemPalletValueChanged(pallet, selectedOrderItem)" OnPalletItemValueChanged="pallet => OnOrderItemPalletValueChanged(pallet, selectedOrderItem)"
OnPalletItemAuditedClick="pallet => OnPalletItemAuditedClick(pallet, selectedOrderItem)"> OnPalletItemAudited="pallet => OnOrderItemAudited(pallet, selectedOrderItem)">
</PalletItemComponent> </PalletItemComponent>
} }
</DxFormLayoutItem> </DxFormLayoutItem>

View File

@ -17,9 +17,10 @@ using Nop.Core.Domain.Orders;
namespace FruitBankHybrid.Shared.Pages namespace FruitBankHybrid.Shared.Pages
{ {
public partial class MeasuringOut : ComponentBase public partial class MeasuringOut : ComponentBase, IDisposable
{ {
private readonly Lock _lock = new Lock(); private readonly Lock _lock = new Lock();
[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; }
@ -29,6 +30,7 @@ namespace FruitBankHybrid.Shared.Pages
private LoggerClient _logger = null!; private LoggerClient _logger = null!;
private string _errorText; private string _errorText;
private bool _enablePalletItems = true;
private int _lastDaysCount = 1; private int _lastDaysCount = 1;
public bool HasMeasuringAccess; public bool HasMeasuringAccess;
public bool LoadingPanelVisible { get; set; } = true; public bool LoadingPanelVisible { get; set; } = true;
@ -59,99 +61,106 @@ namespace FruitBankHybrid.Shared.Pages
if (messageTag != SignalRTags.SendOrderItemDeleted && messageTag != SignalRTags.SendOrderChanged && messageTag != SignalRTags.SendOrderItemChanged && if (messageTag != SignalRTags.SendOrderItemDeleted && messageTag != SignalRTags.SendOrderChanged && messageTag != SignalRTags.SendOrderItemChanged &&
messageTag != SignalRTags.SendOrderItemPalletChanged && messageTag != SignalRTags.SendProductChanged) return; messageTag != SignalRTags.SendOrderItemPalletChanged && messageTag != SignalRTags.SendProductChanged) return;
_logger.DebugConditional($"SignalRClientOnMessageReceived received. {responseDataMessage}"); _logger.DebugConditional($"MeasuringOut.SignalRClientOnMessageReceived received. {responseDataMessage}");
OrderDto? orderDto; try
OrderItem? orderItem;
OrderItemDto? orderItemDto;
switch (messageTag)
{ {
case SignalRTags.SendOrderItemDeleted: OrderDto? orderDto;
orderItem = responseDataMessage?.GetResponseData<OrderItem>(); OrderItem? orderItem;
if (orderItem == null) break; OrderItemDto? orderItemDto;
lock (_lock) switch (messageTag)
{ {
orderDto = SelectedDayOrders.FirstOrDefault(o => o.OrderItemDtos.Any(oi => oi.Id == orderItem.Id)); case SignalRTags.SendOrderItemDeleted:
orderDto?.OrderItemDtos.RemoveAll(oi => oi.Id == orderItem.Id); orderItem = responseDataMessage?.GetResponseData<OrderItem>();
} if (orderItem == null) break;
await InvokeAsync(StateHasChanged); lock (_lock)
return; {
case SignalRTags.SendOrderChanged: orderDto = SelectedDayOrders.FirstOrDefault(o => o.OrderItemDtos.Any(oi => oi.Id == orderItem.Id));
orderDto = responseDataMessage?.GetResponseData<OrderDto>(); orderDto?.OrderItemDtos.RemoveAll(oi => oi.Id == orderItem.Id);
if (orderDto == null) break; }
if (orderDto.DateOfReceipt == null) return; await InvokeAsync(StateHasChanged);
return;
case SignalRTags.SendOrderChanged:
orderDto = responseDataMessage?.GetResponseData<OrderDto>();
if (orderDto == null) break;
lock (_lock) if (orderDto.DateOfReceipt == null) return;
{
if (_measuringDates.All(x => x.DateTime.Date != orderDto.DateOfReceipt.Value.Date))
_measuringDates.Add(new MeasuringDateSelectorModel(orderDto.Id, orderDto.DateOfReceipt.Value.Date, orderDto.IsMeasured));
if (SelectedDate != orderDto.DateOfReceipt.Value.Date) return; lock (_lock)
{
if (_measuringDates.All(x => x.DateTime.Date != orderDto.DateOfReceipt.Value.Date))
_measuringDates.Add(new MeasuringDateSelectorModel(orderDto.Id, orderDto.DateOfReceipt.Value.Date, orderDto.IsMeasured));
//Elég lenne ez is, csak a CopyTo a Collection - ökben lévő elemeket hozzáfűzi és duplikálva lesznek... -J. if (SelectedDate != orderDto.DateOfReceipt.Value.Date) return;
if (SelectedOrder?.Id == orderDto.Id) orderDto.CopyTo(SelectedOrder);
else SelectedDayOrders.UpdateCollection(orderDto, false);
//var selectedOrderId = SelectedOrder?.Id; //Elég lenne ez is, csak a CopyTo a Collection - ökben lévő elemeket hozzáfűzi és duplikálva lesznek... -J.
//SelectedDayOrders.UpdateCollection(orderDto, false); if (SelectedOrder?.Id == orderDto.Id) orderDto.CopyTo(SelectedOrder);
else SelectedDayOrders.UpdateCollection(orderDto, false);
//if (selectedOrderId.GetValueOrDefault(-1) == orderDto.Id) SelectedOrder = orderDto; //var selectedOrderId = SelectedOrder?.Id;
} //SelectedDayOrders.UpdateCollection(orderDto, false);
await InvokeAsync(StateHasChanged); //if (selectedOrderId.GetValueOrDefault(-1) == orderDto.Id) SelectedOrder = orderDto;
return; }
case SignalRTags.SendOrderItemChanged:
orderItemDto = responseDataMessage?.GetResponseData<OrderItemDto>();
if (orderItemDto == null) break;
lock (_lock) await InvokeAsync(StateHasChanged);
{ return;
var localOrderDto = SelectedDayOrders.FirstOrDefault(o => o.OrderItemDtos.Any(oi => oi.Id == orderItemDto.Id)); case SignalRTags.SendOrderItemChanged:
var localOrderItemDto = localOrderDto?.OrderItemDtos.FirstOrDefault(x => x.Id == orderItemDto.Id); orderItemDto = responseDataMessage?.GetResponseData<OrderItemDto>();
if (orderItemDto == null) break;
if (localOrderItemDto == null) return;
//orderItemDto.OrderDto = localOrderDto!; lock (_lock)
{
var localOrderDto = SelectedDayOrders.FirstOrDefault(o => o.OrderItemDtos.Any(oi => oi.Id == orderItemDto.Id));
var localOrderItemDto = localOrderDto?.OrderItemDtos.FirstOrDefault(x => x.Id == orderItemDto.Id);
localOrderItemDto.Quantity = orderItemDto.Quantity; if (localOrderItemDto == null) return;
localOrderItemDto.GenericAttributes.UpdateBaseEntityCollection(orderItemDto.GenericAttributes, false);
}
await InvokeAsync(StateHasChanged); //orderItemDto.OrderDto = localOrderDto!;
return;
case SignalRTags.SendOrderItemPalletChanged:
var orderItemPallet = responseDataMessage?.GetResponseData<OrderItemPallet>();
if (orderItemPallet == null) break;
lock (_lock) localOrderItemDto.Quantity = orderItemDto.Quantity;
{ localOrderItemDto.GenericAttributes.UpdateBaseEntityCollection(orderItemDto.GenericAttributes, false);
var orderItemDtos = SelectedDayOrders.FirstOrDefault(x => x.OrderItemDtos.Any(oi => oi.Id == orderItemPallet.OrderItemId))?.OrderItemDtos; }
orderItemDto = orderItemDtos?.FirstOrDefault(oi => oi.Id == orderItemPallet.OrderItemId);
if (orderItemDto == null) return;
orderItemPallet.OrderItemDto = orderItemDto; await InvokeAsync(StateHasChanged);
var orderItemPalletsCount = orderItemDto.OrderItemPallets.Count; return;
case SignalRTags.SendOrderItemPalletChanged:
var orderItemPallet = responseDataMessage?.GetResponseData<OrderItemPallet>();
if (orderItemPallet == null) break;
if (orderItemDto.OrderItemPallets[orderItemPalletsCount - 1].Id == 0) orderItemDto.OrderItemPallets.Insert(orderItemPalletsCount - 1, orderItemPallet); lock (_lock)
else orderItemDto.OrderItemPallets.UpdateCollection(orderItemPallet, false); {
} var orderItemDtos = SelectedDayOrders.FirstOrDefault(x => x.OrderItemDtos.Any(oi => oi.Id == orderItemPallet.OrderItemId))?.OrderItemDtos;
await InvokeAsync(StateHasChanged); orderItemDto = orderItemDtos?.FirstOrDefault(oi => oi.Id == orderItemPallet.OrderItemId);
return; if (orderItemDto == null) return;
case SignalRTags.SendProductChanged:
var productDto = responseDataMessage?.GetResponseData<ProductDto>();
if (productDto == null) break;
await InvokeAsync(StateHasChanged); orderItemPallet.OrderItemDto = orderItemDto;
return; var orderItemPalletsCount = orderItemDto.OrderItemPallets.Count;
if (orderItemDto.OrderItemPallets[orderItemPalletsCount - 1].Id == 0) orderItemDto.OrderItemPallets.Insert(orderItemPalletsCount - 1, orderItemPallet);
else orderItemDto.OrderItemPallets.UpdateCollection(orderItemPallet, false);
}
await InvokeAsync(StateHasChanged);
return;
case SignalRTags.SendProductChanged:
var productDto = responseDataMessage?.GetResponseData<ProductDto>();
if (productDto == null) break;
await InvokeAsync(StateHasChanged);
return;
}
_logger.Error($"MeasuringOut.SignalRClientOnMessageReceived message == null; messageTag: {messageTag}");
}
catch (Exception ex)
{
_logger.Error($"MeasuringOut.SignalRClientOnMessageReceived ERROR; messageTag: {messageTag}", ex);
} }
_logger.Error($"SignalRClientOnMessageReceived message == null");
} }
private async Task RefreshOrdersFromDb(DateTime dateTime, int lastDaysCount) private async Task RefreshOrdersFromDb(DateTime dateTime, int lastDaysCount)
@ -241,12 +250,25 @@ namespace FruitBankHybrid.Shared.Pages
return Task.CompletedTask; return Task.CompletedTask;
} }
private async Task OnPalletItemAuditedClick(OrderItemPallet? orderItemPallet, OrderItemDto selectedOrderItemDto) private async Task OnOrderItemAudited(OrderItemPallet? orderItemPallet, OrderItemDto selectedOrderItemDto)
{ {
if (orderItemPallet == null) return; if (orderItemPallet == null) return;
_enablePalletItems = false;
await InvokeAsync(StateHasChanged);
await OnOrderItemPalletSaved(orderItemPallet, selectedOrderItemDto); await OnOrderItemPalletSaved(orderItemPallet, selectedOrderItemDto);
} }
private async Task OnOrderItemSaveOrAuditClick(OrderItemPallet? orderItemPallet, OrderItemDto selectedOrderItemDto)
{
if (orderItemPallet != null)
{
_enablePalletItems = false;
await InvokeAsync(StateHasChanged);
}
}
private async Task OnOrderItemPalletSaved(OrderItemPallet? orderItemPallet, OrderItemDto selectedOrderItemDto) private async Task OnOrderItemPalletSaved(OrderItemPallet? orderItemPallet, OrderItemDto selectedOrderItemDto)
{ {
if (orderItemPallet != null) if (orderItemPallet != null)
@ -258,7 +280,8 @@ namespace FruitBankHybrid.Shared.Pages
} }
else await DialogService.ShowMessageBoxAsync("Hiba", "Adatok mentése sikertelen volt, ellenőrizze a mérés adatait!", MessageBoxRenderStyle.Danger); else await DialogService.ShowMessageBoxAsync("Hiba", "Adatok mentése sikertelen volt, ellenőrizze a mérés adatait!", MessageBoxRenderStyle.Danger);
StateHasChanged(); _enablePalletItems = true;
await InvokeAsync(StateHasChanged);
} }
private Task AddNewPalletItemClick(OrderItemDto selectedOrderItemDto) private Task AddNewPalletItemClick(OrderItemDto selectedOrderItemDto)
@ -359,5 +382,10 @@ namespace FruitBankHybrid.Shared.Pages
orderDto.GenericAttributes.UpdateBaseEntityCollection(genericAttributes, false); orderDto.GenericAttributes.UpdateBaseEntityCollection(genericAttributes, false);
} }
} }
public void Dispose()
{
FruitBankSignalRClient.OnMessageReceived -= SignalRClientOnMessageReceived;
}
} }
} }