From 69010921d7c88a53745754686eeb66ef1cebd054 Mon Sep 17 00:00:00 2001 From: Loretta Date: Thu, 28 May 2026 19:48:18 +0200 Subject: [PATCH] Add CargoPartner management UI and API integration - Introduced CRUD operations for CargoPartner in IFruitBankDataControllerCommon and SignalRTags. - Implemented CargoPartner methods in FruitBankSignalRClient. - Added GridCargoPartner.razor and GridCargoPartnerBase.cs for CargoPartner grid UI. - Integrated CargoPartner grid into ShippingsAdmin page. - Added GetCargoPartnersTest; updated and commented out some tests. - Added CountryCode column to GridPartner.razor. - Commented out SandboxEndpointSimpleTests. - Minor refactoring for new entity and UI support. --- .../IFruitBankDataControllerCommon.cs | 7 + FruitBank.Common/SignalRs/SignalRTags.cs | 10 + .../FruitBankClientTests.cs | 13 +- .../SandboxEndpointSimpleTests.cs | 524 +++++++++--------- .../Grids/Cargos/GridCargoPartner.razor | 124 +++++ .../Grids/Cargos/GridCargoPartnerBase.cs | 67 +++ .../Grids/Partners/GridPartner.razor | 1 + .../Pages/ShippingsAdmin.razor | 4 + .../Pages/ShippingsAdmin.razor.cs | 3 + .../SignalRs/FruitBankSignalRClient.cs | 24 +- 10 files changed, 501 insertions(+), 276 deletions(-) create mode 100644 FruitBankHybrid.Shared/Components/Grids/Cargos/GridCargoPartner.razor create mode 100644 FruitBankHybrid.Shared/Components/Grids/Cargos/GridCargoPartnerBase.cs diff --git a/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs b/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs index db0e4d2d..07e242c4 100644 --- a/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs +++ b/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs @@ -19,6 +19,13 @@ public interface IFruitBankDataControllerCommon public Task UpdatePartner(Partner partner); #endregion Partner + #region CargoPartner + public Task?> GetCargoPartners(); + public Task GetCargoPartnerById(int id); + public Task AddCargoPartner(CargoPartner cargoPartner); + public Task UpdateCargoPartner(CargoPartner cargoPartner); + #endregion CargoPartner + #region Shipping public Task?> GetShippings(); Task?> GetNotMeasuredShippings(); diff --git a/FruitBank.Common/SignalRs/SignalRTags.cs b/FruitBank.Common/SignalRs/SignalRTags.cs index 13f0471f..e57326f4 100644 --- a/FruitBank.Common/SignalRs/SignalRTags.cs +++ b/FruitBank.Common/SignalRs/SignalRTags.cs @@ -15,6 +15,16 @@ public class SignalRTags : AcSignalRTags public const int AddPartner = 25; public const int UpdatePartner = 26; + public const int GetCargoPartners = 30; + public const int GetCargoPartnerById = 31; + public const int AddCargoPartner = 32; + public const int UpdateCargoPartner = 33; + + public const int GetCargoTrucks = 35; + public const int GetCargoTruckById = 36; + public const int AddCargoTruck = 37; + public const int UpdateCargoTruck = 38; + public const int GetShippings = 40; public const int GetNotMeasuredShippings = 41; public const int GetShippingById = 42; diff --git a/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs b/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs index fe542b21..6a61dda8 100644 --- a/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs +++ b/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs @@ -79,6 +79,17 @@ namespace FruitBankHybrid.Shared.Tests } #endregion Partner + #region CargoPartner + [TestMethod] + public async Task GetCargoPartnersTest() + { + var partners = await _signalRClient.GetPartners(); + + Assert.IsNotNull(partners); + Assert.IsTrue(partners.Count != 0); + } + #endregion CargoPartner + #region Shipping [TestMethod] public async Task GetShippingsTest() @@ -456,7 +467,7 @@ namespace FruitBankHybrid.Shared.Tests [DataRow(5, true)] //[DataRow(6, false)] [DataRow(33, true)] - [DataRow(64, false)] + //[DataRow(64, false)] [DataRow(7, true)] public async Task GetProductDtoByIdTest(int productId, bool isMeasurableExcepted) { diff --git a/FruitBankHybrid.Shared.Tests/SandboxEndpointSimpleTests.cs b/FruitBankHybrid.Shared.Tests/SandboxEndpointSimpleTests.cs index b6d05bdc..868ca9c7 100644 --- a/FruitBankHybrid.Shared.Tests/SandboxEndpointSimpleTests.cs +++ b/FruitBankHybrid.Shared.Tests/SandboxEndpointSimpleTests.cs @@ -1,316 +1,316 @@ -using AyCode.Core.Enums; -using AyCode.Core.Loggers; -using AyCode.Utils.Extensions; -using FruitBank.Common; -using FruitBank.Common.Dtos; -using FruitBank.Common.Entities; -using FruitBank.Common.Interfaces; -using FruitBank.Common.Loggers; -using FruitBankHybrid.Shared.Services.SignalRs; -using System.Diagnostics.CodeAnalysis; -using FruitBank.Common.SignalRs; -using AyCode.Services.SignalRs; +//using AyCode.Core.Enums; +//using AyCode.Core.Loggers; +//using AyCode.Utils.Extensions; +//using FruitBank.Common; +//using FruitBank.Common.Dtos; +//using FruitBank.Common.Entities; +//using FruitBank.Common.Interfaces; +//using FruitBank.Common.Loggers; +//using FruitBankHybrid.Shared.Services.SignalRs; +//using System.Diagnostics.CodeAnalysis; +//using FruitBank.Common.SignalRs; +//using AyCode.Services.SignalRs; -namespace FruitBankHybrid.Shared.Tests; +//namespace FruitBankHybrid.Shared.Tests; -/// -/// Teszt a TestSignalREndpoint-hoz. -/// FONTOS: A SANDBOX-ot manu�lisan kell elind�tani a tesztek futtat�sa el�tt! -/// Ind�t�s: dotnet run --project Mango.Sandbox.EndPoints --urls http://localhost:59579 -/// -[TestClass] -public class SandboxEndpointSimpleTests -{ - private static readonly string SandboxUrl = FruitBankConstClient.BaseUrl; //"http://localhost:59579"; - private static readonly string HubUrl = $"{SandboxUrl}/fbHub"; +///// +///// Teszt a TestSignalREndpoint-hoz. +///// FONTOS: A SANDBOX-ot manu�lisan kell elind�tani a tesztek futtat�sa el�tt! +///// Ind�t�s: dotnet run --project Mango.Sandbox.EndPoints --urls http://localhost:59579 +///// +//[TestClass] +//public class SandboxEndpointSimpleTests +//{ +// private static readonly string SandboxUrl = FruitBankConstClient.BaseUrl; //"http://localhost:59579"; +// private static readonly string HubUrl = $"{SandboxUrl}/fbHub"; - // Teszt SignalR Tags (TestSignalRTags-b�l) - private const int PingTag = SignalRTags.PingTag; - private const int EchoTag = SignalRTags.EchoTag; - private const int GetTestItemsTag = 9003; +// // Teszt SignalR Tags (TestSignalRTags-b�l) +// private const int PingTag = SignalRTags.PingTag; +// private const int EchoTag = SignalRTags.EchoTag; +// private const int GetTestItemsTag = 9003; - private FruitBankSignalRClient _signalRClient = null!; +// private FruitBankSignalRClient _signalRClient = null!; - [TestInitialize] - public void TestInit() - { - if (!SandboxUrl.Contains("localhost:")) throw new Exception("NEM LOCALHOST-ON TESZTEL�NK!"); +// [TestInitialize] +// public void TestInit() +// { +// if (!SandboxUrl.Contains("localhost:")) throw new Exception("NEM LOCALHOST-ON TESZTEL�NK!"); - _signalRClient = TestSignalRClientFactory.Create(nameof(SandboxEndpointSimpleTests)); - } +// _signalRClient = TestSignalRClientFactory.Create(nameof(SandboxEndpointSimpleTests)); +// } - #region HTTP Endpoint Tests +// #region HTTP Endpoint Tests - [TestMethod] - public async Task HealthEndpoint_ReturnsSuccess() - { - using var httpClient = new HttpClient(); - var response = await httpClient.GetAsync($"{SandboxUrl}/health"); - Assert.IsTrue(response.IsSuccessStatusCode, $"Health endpoint returned {response.StatusCode}"); - } +// [TestMethod] +// public async Task HealthEndpoint_ReturnsSuccess() +// { +// using var httpClient = new HttpClient(); +// var response = await httpClient.GetAsync($"{SandboxUrl}/health"); +// Assert.IsTrue(response.IsSuccessStatusCode, $"Health endpoint returned {response.StatusCode}"); +// } - [TestMethod] - public async Task RootEndpoint_ReturnsSandboxIsRunning() - { - using var httpClient = new HttpClient(); - var response = await httpClient.GetStringAsync(SandboxUrl); - Assert.AreEqual("SANDBOX is running!", response); - } +// [TestMethod] +// public async Task RootEndpoint_ReturnsSandboxIsRunning() +// { +// using var httpClient = new HttpClient(); +// var response = await httpClient.GetStringAsync(SandboxUrl); +// Assert.AreEqual("SANDBOX is running!", response); +// } - #endregion +// #endregion - #region SignalR Connection Tests +// #region SignalR Connection Tests - [TestMethod] - public async Task SignalR_Negotiate_ReturnsSuccess() - { - using var httpClient = new HttpClient(); - var response = await httpClient.PostAsync($"{HubUrl}/negotiate?negotiateVersion=1", null); - Assert.IsTrue(response.IsSuccessStatusCode, $"SignalR negotiate returned {response.StatusCode}"); - } +// [TestMethod] +// public async Task SignalR_Negotiate_ReturnsSuccess() +// { +// using var httpClient = new HttpClient(); +// var response = await httpClient.PostAsync($"{HubUrl}/negotiate?negotiateVersion=1", null); +// Assert.IsTrue(response.IsSuccessStatusCode, $"SignalR negotiate returned {response.StatusCode}"); +// } - [TestMethod] - public async Task SignalR_Connect_Succeeds() - { - var testItems = await _signalRClient.GetAllAsync>(GetTestItemsTag); - Assert.IsNotNull(testItems); - } +// [TestMethod] +// public async Task SignalR_Connect_Succeeds() +// { +// var testItems = await _signalRClient.GetAllAsync>(GetTestItemsTag); +// Assert.IsNotNull(testItems); +// } - public class TestItem - { - public int Id { get; set; } - public string Name { get; set; } = string.Empty; - public decimal Value { get; set; } - } +// public class TestItem +// { +// public int Id { get; set; } +// public string Name { get; set; } = string.Empty; +// public decimal Value { get; set; } +// } -//[TestMethod] - //public async Task SignalR_Connect_Succeeds() - //{ - // var connection = new HubConnectionBuilder() - // .WithUrl(HubUrl) - // .Build(); +////[TestMethod] +// //public async Task SignalR_Connect_Succeeds() +// //{ +// // var connection = new HubConnectionBuilder() +// // .WithUrl(HubUrl) +// // .Build(); - // try - // { - // await connection.StartAsync(); - // Assert.AreEqual(HubConnectionState.Connected, connection.State); - // } - // finally - // { - // await connection.StopAsync(); - // } - //} +// // try +// // { +// // await connection.StartAsync(); +// // Assert.AreEqual(HubConnectionState.Connected, connection.State); +// // } +// // finally +// // { +// // await connection.StopAsync(); +// // } +// //} - //#endregion +// //#endregion - //#region TestSignalREndpoint Tests +// //#region TestSignalREndpoint Tests - //[TestMethod] - //public async Task SignalR_Ping_ReturnsResponse() - //{ - // var testMessage = "Hello SignalR!"; - // await TestSignalREndpoint(PingTag, testMessage, "Ping", response => - // { - // Assert.IsNotNull(response, "Response should not be null"); +// //[TestMethod] +// //public async Task SignalR_Ping_ReturnsResponse() +// //{ +// // var testMessage = "Hello SignalR!"; +// // await TestSignalREndpoint(PingTag, testMessage, "Ping", response => +// // { +// // Assert.IsNotNull(response, "Response should not be null"); - // // Parse JSON response - // using var jsonDoc = JsonDocument.Parse(response); - // var root = jsonDoc.RootElement; +// // // Parse JSON response +// // using var jsonDoc = JsonDocument.Parse(response); +// // var root = jsonDoc.RootElement; - // // Ellen�rizz�k, hogy van Message property - // Assert.IsTrue(root.TryGetProperty("Message", out var messageElement) || - // root.TryGetProperty("message", out messageElement), - // "Response should contain 'Message' property"); +// // // Ellen�rizz�k, hogy van Message property +// // Assert.IsTrue(root.TryGetProperty("Message", out var messageElement) || +// // root.TryGetProperty("message", out messageElement), +// // "Response should contain 'Message' property"); - // Console.WriteLine($"[Ping] Received message: {messageElement.GetString()}"); - // }); - //} +// // Console.WriteLine($"[Ping] Received message: {messageElement.GetString()}"); +// // }); +// //} - //[TestMethod] - //public async Task SignalR_Echo_ReturnsEchoedData() - //{ - // var request = new { Id = 42, Name = "TestName" }; - // await TestSignalREndpoint(EchoTag, request, "Echo", response => - // { - // Assert.IsNotNull(response, "Response should not be null"); +// //[TestMethod] +// //public async Task SignalR_Echo_ReturnsEchoedData() +// //{ +// // var request = new { Id = 42, Name = "TestName" }; +// // await TestSignalREndpoint(EchoTag, request, "Echo", response => +// // { +// // Assert.IsNotNull(response, "Response should not be null"); - // using var jsonDoc = JsonDocument.Parse(response); - // var root = jsonDoc.RootElement; +// // using var jsonDoc = JsonDocument.Parse(response); +// // var root = jsonDoc.RootElement; - // // Ellen�rizz�k az Id-t - // Assert.IsTrue(root.TryGetProperty("Id", out var idElement) || - // root.TryGetProperty("id", out idElement), - // "Response should contain 'Id' property"); - // Assert.AreEqual(42, idElement.GetInt32(), "Id should be 42"); +// // // Ellen�rizz�k az Id-t +// // Assert.IsTrue(root.TryGetProperty("Id", out var idElement) || +// // root.TryGetProperty("id", out idElement), +// // "Response should contain 'Id' property"); +// // Assert.AreEqual(42, idElement.GetInt32(), "Id should be 42"); - // // Ellen�rizz�k a Name-et - // Assert.IsTrue(root.TryGetProperty("Name", out var nameElement) || - // root.TryGetProperty("name", out nameElement), - // "Response should contain 'Name' property"); - // Assert.AreEqual("TestName", nameElement.GetString(), "Name should be 'TestName'"); +// // // Ellen�rizz�k a Name-et +// // Assert.IsTrue(root.TryGetProperty("Name", out var nameElement) || +// // root.TryGetProperty("name", out nameElement), +// // "Response should contain 'Name' property"); +// // Assert.AreEqual("TestName", nameElement.GetString(), "Name should be 'TestName'"); - // Console.WriteLine($"[Echo] Received: Id={idElement.GetInt32()}, Name={nameElement.GetString()}"); - // }); - //} +// // Console.WriteLine($"[Echo] Received: Id={idElement.GetInt32()}, Name={nameElement.GetString()}"); +// // }); +// //} - //[TestMethod] - //public async Task SignalR_GetTestItems_ReturnsItemList() - //{ - // await TestSignalREndpoint(GetTestItemsTag, null, "GetTestItems", response => - // { - // Assert.IsNotNull(response, "Response should not be null"); +// //[TestMethod] +// //public async Task SignalR_GetTestItems_ReturnsItemList() +// //{ +// // await TestSignalREndpoint(GetTestItemsTag, null, "GetTestItems", response => +// // { +// // Assert.IsNotNull(response, "Response should not be null"); - // using var jsonDoc = JsonDocument.Parse(response); - // var root = jsonDoc.RootElement; +// // using var jsonDoc = JsonDocument.Parse(response); +// // var root = jsonDoc.RootElement; - // // Ellen�rizz�k, hogy t�mb-e - // Assert.AreEqual(JsonValueKind.Array, root.ValueKind, "Response should be an array"); - // Assert.IsTrue(root.GetArrayLength() > 0, "Array should have items"); +// // // Ellen�rizz�k, hogy t�mb-e +// // Assert.AreEqual(JsonValueKind.Array, root.ValueKind, "Response should be an array"); +// // Assert.IsTrue(root.GetArrayLength() > 0, "Array should have items"); - // Console.WriteLine($"[GetTestItems] Received {root.GetArrayLength()} items"); +// // Console.WriteLine($"[GetTestItems] Received {root.GetArrayLength()} items"); - // // Ellen�rizz�k az els� elemet - // var firstItem = root[0]; - // Assert.IsTrue(firstItem.TryGetProperty("Id", out _) || firstItem.TryGetProperty("id", out _), - // "Item should have 'Id' property"); - // Assert.IsTrue(firstItem.TryGetProperty("Name", out _) || firstItem.TryGetProperty("name", out _), - // "Item should have 'Name' property"); - // }); - //} +// // // Ellen�rizz�k az els� elemet +// // var firstItem = root[0]; +// // Assert.IsTrue(firstItem.TryGetProperty("Id", out _) || firstItem.TryGetProperty("id", out _), +// // "Item should have 'Id' property"); +// // Assert.IsTrue(firstItem.TryGetProperty("Name", out _) || firstItem.TryGetProperty("name", out _), +// // "Item should have 'Name' property"); +// // }); +// //} - //#endregion +// //#endregion - //#region EREDETI BUSINESS ENDPOINT TESZTEK - KIKOMMENTEZVE +// //#region EREDETI BUSINESS ENDPOINT TESZTEK - KIKOMMENTEZVE - //// =========================================== - //// === Az al�bbi tesztek az eredeti 3 endpoint-ot tesztelik === - //// === Vissza�ll�t�shoz: t�r�ld a kommenteket �s regisztr�ld az endpoint-okat a Program.cs-ben === - //// =========================================== +// //// =========================================== +// //// === Az al�bbi tesztek az eredeti 3 endpoint-ot tesztelik === +// //// === Vissza�ll�t�shoz: t�r�ld a kommenteket �s regisztr�ld az endpoint-okat a Program.cs-ben === +// //// =========================================== - //// [TestMethod] - //// public async Task SignalR_GetMeasuringUsers_ReturnsJson() - //// { - //// await TestSignalREndpoint(GetMeasuringUsersTag, null, "GetMeasuringUsers"); - //// } +// //// [TestMethod] +// //// public async Task SignalR_GetMeasuringUsers_ReturnsJson() +// //// { +// //// await TestSignalREndpoint(GetMeasuringUsersTag, null, "GetMeasuringUsers"); +// //// } - //// [TestMethod] - //// public async Task SignalR_GetStockQuantityHistoryDtos_ReturnsJson() - //// { - //// await TestSignalREndpoint(GetStockQuantityHistoryDtosTag, null, "GetStockQuantityHistoryDtos"); - //// } +// //// [TestMethod] +// //// public async Task SignalR_GetStockQuantityHistoryDtos_ReturnsJson() +// //// { +// //// await TestSignalREndpoint(GetStockQuantityHistoryDtosTag, null, "GetStockQuantityHistoryDtos"); +// //// } - //// [TestMethod] - //// public async Task SignalR_GetStockQuantityHistoryDtosByProductId_ReturnsJson() - //// { - //// // ProductId = 10 - //// await TestSignalREndpoint(GetStockQuantityHistoryDtosByProductIdTag, 10, "GetStockQuantityHistoryDtosByProductId"); - //// } +// //// [TestMethod] +// //// public async Task SignalR_GetStockQuantityHistoryDtosByProductId_ReturnsJson() +// //// { +// //// // ProductId = 10 +// //// await TestSignalREndpoint(GetStockQuantityHistoryDtosByProductIdTag, 10, "GetStockQuantityHistoryDtosByProductId"); +// //// } - //// [TestMethod] - //// public async Task SignalR_GetShippingDocumentsByShippingId_ReturnsJson() - //// { - //// // ShippingId = 5 - //// await TestSignalREndpoint(GetShippingDocumentsByShippingIdTag, 5, "GetShippingDocumentsByShippingId"); - //// } +// //// [TestMethod] +// //// public async Task SignalR_GetShippingDocumentsByShippingId_ReturnsJson() +// //// { +// //// // ShippingId = 5 +// //// await TestSignalREndpoint(GetShippingDocumentsByShippingIdTag, 5, "GetShippingDocumentsByShippingId"); +// //// } - //// [TestMethod] - //// public async Task SignalR_GetOrderDtoById_ReturnsJson() - //// { - //// // OrderId = 15 - //// await TestSignalREndpoint(GetOrderDtoByIdTag, 15, "GetOrderDtoById"); - //// } +// //// [TestMethod] +// //// public async Task SignalR_GetOrderDtoById_ReturnsJson() +// //// { +// //// // OrderId = 15 +// //// await TestSignalREndpoint(GetOrderDtoByIdTag, 15, "GetOrderDtoById"); +// //// } - //// [TestMethod] - //// public async Task SignalR_GetStockTakingItemsById_ReturnsJson() - //// { - //// // StockTakingItemId = 200 - //// await TestSignalREndpoint(GetStockTakingItemsByIdTag, 200, "GetStockTakingItemsById"); - //// } +// //// [TestMethod] +// //// public async Task SignalR_GetStockTakingItemsById_ReturnsJson() +// //// { +// //// // StockTakingItemId = 200 +// //// await TestSignalREndpoint(GetStockTakingItemsByIdTag, 200, "GetStockTakingItemsById"); +// //// } - //#endregion +// //#endregion - //#region Helper Methods +// //#region Helper Methods - //private async Task TestSignalREndpoint(int tag, object? parameter, string endpointName, Action? validateResponse = null) - //{ - // var connection = new HubConnectionBuilder() - // .WithUrl(HubUrl) - // .Build(); +// //private async Task TestSignalREndpoint(int tag, object? parameter, string endpointName, Action? validateResponse = null) +// //{ +// // var connection = new HubConnectionBuilder() +// // .WithUrl(HubUrl) +// // .Build(); - // string? receivedJson = null; - // int receivedTag = -1; - // var responseReceived = new TaskCompletionSource(); +// // string? receivedJson = null; +// // int receivedTag = -1; +// // var responseReceived = new TaskCompletionSource(); - // connection.On("ReceiveMessage", (responseTag, data) => - // { - // receivedTag = responseTag; - // if (data != null && data.Length > 0) - // { - // receivedJson = Encoding.UTF8.GetString(data); - // } - // responseReceived.TrySetResult(true); - // }); +// // connection.On("ReceiveMessage", (responseTag, data) => +// // { +// // receivedTag = responseTag; +// // if (data != null && data.Length > 0) +// // { +// // receivedJson = Encoding.UTF8.GetString(data); +// // } +// // responseReceived.TrySetResult(true); +// // }); - // try - // { - // await connection.StartAsync(); - // Assert.AreEqual(HubConnectionState.Connected, connection.State, $"Failed to connect to SignalR hub for {endpointName}"); +// // try +// // { +// // await connection.StartAsync(); +// // Assert.AreEqual(HubConnectionState.Connected, connection.State, $"Failed to connect to SignalR hub for {endpointName}"); - // // K�sz�ts�k el a request data-t - // // Ha nincs param�ter, null-t k�ld�nk (nem �res byte t�mb�t!) - // byte[]? requestData = parameter != null - // ? Encoding.UTF8.GetBytes(JsonSerializer.Serialize(parameter)) - // : null; +// // // K�sz�ts�k el a request data-t +// // // Ha nincs param�ter, null-t k�ld�nk (nem �res byte t�mb�t!) +// // byte[]? requestData = parameter != null +// // ? Encoding.UTF8.GetBytes(JsonSerializer.Serialize(parameter)) +// // : null; - // // A Hub met�dus neve: OnReceiveMessage (3 param�ter: messageTag, messageBytes, requestId) - // await connection.InvokeAsync("OnReceiveMessage", tag, requestData, (int?)null); +// // // A Hub met�dus neve: OnReceiveMessage (3 param�ter: messageTag, messageBytes, requestId) +// // await connection.InvokeAsync("OnReceiveMessage", tag, requestData, (int?)null); - // var completed = await Task.WhenAny(responseReceived.Task, Task.Delay(15000)); +// // var completed = await Task.WhenAny(responseReceived.Task, Task.Delay(15000)); - // if (completed == responseReceived.Task) - // { - // Console.WriteLine($"[{endpointName}] Response tag: {receivedTag}"); - // Console.WriteLine($"[{endpointName}] Response JSON: {receivedJson?.Substring(0, Math.Min(500, receivedJson?.Length ?? 0))}..."); +// // if (completed == responseReceived.Task) +// // { +// // Console.WriteLine($"[{endpointName}] Response tag: {receivedTag}"); +// // Console.WriteLine($"[{endpointName}] Response JSON: {receivedJson?.Substring(0, Math.Min(500, receivedJson?.Length ?? 0))}..."); - // // Ellen�rizz�k, hogy valid JSON-e (ha van adat) - // if (!string.IsNullOrEmpty(receivedJson)) - // { - // try - // { - // using var jsonDoc = JsonDocument.Parse(receivedJson); - // Assert.IsTrue( - // jsonDoc.RootElement.ValueKind == JsonValueKind.Array || - // jsonDoc.RootElement.ValueKind == JsonValueKind.Object || - // jsonDoc.RootElement.ValueKind == JsonValueKind.Null, - // $"[{endpointName}] Response is not a valid JSON"); +// // // Ellen�rizz�k, hogy valid JSON-e (ha van adat) +// // if (!string.IsNullOrEmpty(receivedJson)) +// // { +// // try +// // { +// // using var jsonDoc = JsonDocument.Parse(receivedJson); +// // Assert.IsTrue( +// // jsonDoc.RootElement.ValueKind == JsonValueKind.Array || +// // jsonDoc.RootElement.ValueKind == JsonValueKind.Object || +// // jsonDoc.RootElement.ValueKind == JsonValueKind.Null, +// // $"[{endpointName}] Response is not a valid JSON"); - // // Custom validation - // validateResponse?.Invoke(receivedJson); - // } - // catch (JsonException ex) - // { - // Assert.Fail($"[{endpointName}] Invalid JSON response: {ex.Message}"); - // } - // } - // } - // else - // { - // Assert.AreEqual(HubConnectionState.Connected, connection.State, - // $"[{endpointName}] Connection was closed - check SANDBOX logs for DI errors"); - // } - // } - // catch (Exception ex) - // { - // Assert.Fail($"[{endpointName}] SignalR error: {ex.Message}. Check SANDBOX logs for missing DI registrations."); - // } - // finally - // { - // if (connection.State == HubConnectionState.Connected) - // { - // await connection.StopAsync(); - // } - // } - //} +// // // Custom validation +// // validateResponse?.Invoke(receivedJson); +// // } +// // catch (JsonException ex) +// // { +// // Assert.Fail($"[{endpointName}] Invalid JSON response: {ex.Message}"); +// // } +// // } +// // } +// // else +// // { +// // Assert.AreEqual(HubConnectionState.Connected, connection.State, +// // $"[{endpointName}] Connection was closed - check SANDBOX logs for DI errors"); +// // } +// // } +// // catch (Exception ex) +// // { +// // Assert.Fail($"[{endpointName}] SignalR error: {ex.Message}. Check SANDBOX logs for missing DI registrations."); +// // } +// // finally +// // { +// // if (connection.State == HubConnectionState.Connected) +// // { +// // await connection.StopAsync(); +// // } +// // } +// //} - #endregion -} +// #endregion +//} diff --git a/FruitBankHybrid.Shared/Components/Grids/Cargos/GridCargoPartner.razor b/FruitBankHybrid.Shared/Components/Grids/Cargos/GridCargoPartner.razor new file mode 100644 index 00000000..26898ca6 --- /dev/null +++ b/FruitBankHybrid.Shared/Components/Grids/Cargos/GridCargoPartner.razor @@ -0,0 +1,124 @@ +@using System.Collections.ObjectModel +@using AyCode.Blazor.Components.Components.Grids +@using AyCode.Core.Helpers +@using AyCode.Core.Loggers +@using AyCode.Utils.Extensions +@using FruitBank.Common.Dtos +@using FruitBank.Common.Entities +@using FruitBankHybrid.Shared.Components.Grids.Shippings +@using FruitBankHybrid.Shared.Databases +@using FruitBankHybrid.Shared.Services.Loggers +@using FruitBankHybrid.Shared.Services.SignalRs + +@inject IEnumerable LogWriters +@inject FruitBankSignalRClient FruitBankSignalRClient + + + + + + + + + + + + + + + + + + + + + + +@* + @if (IsMasterGrid) + { + var partner = ((CargoPartner)context.DataItem); + var shippingDocuments = partner?.ShippingDocuments ?? []; + + + + @{ + var observableShippingDocuments = new AcObservableCollection(shippingDocuments); + + } + + + + @{ + var observableShippingItems = new AcObservableCollection(shippingDocuments.SelectMany(sd => sd.ShippingItems ?? [])); + + } + + + } + + *@ + @if (IsMasterGrid) + { + + } + + + + + +@code { + //[Inject] public required ObjectLock ObjectLock { get; set; } + [Inject] public required DatabaseClient Database { get; set; } + + [Parameter] public bool IsMasterGrid { get; set; } = false; + [Parameter] public AcObservableCollection? CargoPartners { get; set; } + [Parameter] public AcObservableCollection? Shippings { get; set; } + + const string ExportFileName = "ExportResult"; + string GridSearchText = ""; + bool EditItemsEnabled { get; set; } + int FocusedRowVisibleIndex { get; set; } + public GridCargoPartnerBase Grid { get; set; } + string GridCss => !IsMasterGrid ? "hide-toolbar" : string.Empty; + + private int _activeTabIndex; + private LoggerClient _logger; + + protected override async Task OnInitializedAsync() + { + _logger = new LoggerClient(LogWriters.ToArray()); + await ReloadDataFromDb(false); + } + + private async Task ReloadDataFromDb(bool forceReload = false) + { + if (!IsMasterGrid) return; + + if (Grid == null) return; + + using (await ObjectLock.GetSemaphore().UseWaitAsync()) + if (forceReload) await Grid.ReloadDataSourceAsync(); + + if (forceReload) Grid.Reload(); + } + + async Task Grid_FocusedRowChanged(GridFocusedRowChangedEventArgs args) + { + if (Grid == null) return; + + if (Grid.IsEditing() && !Grid.IsEditingNewRow()) + await Grid.SaveChangesAsync(); + + FocusedRowVisibleIndex = args.VisibleIndex; + EditItemsEnabled = true; + } +} + diff --git a/FruitBankHybrid.Shared/Components/Grids/Cargos/GridCargoPartnerBase.cs b/FruitBankHybrid.Shared/Components/Grids/Cargos/GridCargoPartnerBase.cs new file mode 100644 index 00000000..f2bc0519 --- /dev/null +++ b/FruitBankHybrid.Shared/Components/Grids/Cargos/GridCargoPartnerBase.cs @@ -0,0 +1,67 @@ +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; + +namespace FruitBankHybrid.Shared.Components.Grids.Cargos; + +public class GridCargoPartnerBase: FruitBankGridBase, IGrid +{ + private bool _isFirstInitializeParameterCore; + private bool _isFirstInitializeParameters; + + public GridCargoPartnerBase() : base() + { + GetAllMessageTag = SignalRTags.GetCargoPartners; + AddMessageTag = SignalRTags.AddCargoPartner; + UpdateMessageTag = SignalRTags.UpdateCargoPartner; + + //RemoveMessageTag = SignalRTags.; + } + + protected override async Task OnInitializedAsync() + { + 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... + + _isFirstInitializeParameterCore = false; + } + } +} \ No newline at end of file diff --git a/FruitBankHybrid.Shared/Components/Grids/Partners/GridPartner.razor b/FruitBankHybrid.Shared/Components/Grids/Partners/GridPartner.razor index 6ebfc14e..b9f725cf 100644 --- a/FruitBankHybrid.Shared/Components/Grids/Partners/GridPartner.razor +++ b/FruitBankHybrid.Shared/Components/Grids/Partners/GridPartner.razor @@ -29,6 +29,7 @@ + diff --git a/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor b/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor index df376a76..28071eff 100644 --- a/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor +++ b/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor @@ -2,6 +2,7 @@ @using FruitBank.Common.Dtos @using FruitBank.Common.Entities @using FruitBankHybrid.Shared.Components +@using FruitBankHybrid.Shared.Components.Grids.Cargos @using FruitBankHybrid.Shared.Components.Grids.Partners @using FruitBankHybrid.Shared.Components.Grids.Shippings @using FruitBankHybrid.Shared.Databases @@ -25,6 +26,9 @@ + + + diff --git a/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor.cs b/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor.cs index 2be9b868..3ccc8f96 100644 --- a/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor.cs +++ b/FruitBankHybrid.Shared/Pages/ShippingsAdmin.razor.cs @@ -15,6 +15,7 @@ using FruitBankHybrid.Shared.Services.Loggers; using FruitBankHybrid.Shared.Services.SignalRs; using Mango.Nop.Core.Loggers; using Microsoft.AspNetCore.Components; +using FruitBankHybrid.Shared.Components.Grids.Cargos; namespace FruitBankHybrid.Shared.Pages; @@ -29,6 +30,7 @@ public partial class ShippingsAdmin : ComponentBase private GridProductDtoTemplate gridProductDtoTemplate; private GridPartner gridPartner; + private GridCargoPartner gridCargoPartner; private GridShipping gridShipping; private GridShippingDocument gridShippingDocument; private GridShippingItemTemplate gridShippingItemTemplate; @@ -39,6 +41,7 @@ public partial class ShippingsAdmin : ComponentBase public AcObservableCollection ShippingItems { get; set; } = []; public List ShippingItemPallets { get; set; } = []; public AcObservableCollection Partners { get; set; } = []; + public AcObservableCollection CargoPartners { get; set; } = []; public bool AutoCollapseDetailRow { get; set; } diff --git a/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs b/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs index be680dcb..9340b88d 100644 --- a/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs +++ b/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs @@ -60,22 +60,20 @@ namespace FruitBankHybrid.Shared.Services.SignalRs public Task?> GetMeasuringModels() => GetAllAsync>(SignalRTags.GetMeasuringModels); - public Task?> GetPartners() - => GetAllAsync>(SignalRTags.GetPartners); - #region Partner - - public Task GetPartnerById(int id) - => GetByIdAsync(SignalRTags.GetPartnerById, id); - - public Task AddPartner(Partner partner) - => PostDataAsync(SignalRTags.AddPartner, partner); - - public Task UpdatePartner(Partner partner) - => PostDataAsync(SignalRTags.UpdatePartner, partner); - + public Task?> GetPartners() => GetAllAsync>(SignalRTags.GetPartners); + public Task GetPartnerById(int id) => GetByIdAsync(SignalRTags.GetPartnerById, id); + public Task AddPartner(Partner partner) => PostDataAsync(SignalRTags.AddPartner, partner); + public Task UpdatePartner(Partner partner) => PostDataAsync(SignalRTags.UpdatePartner, partner); #endregion Partner + #region CargoPartner + public Task?> GetCargoPartners() => GetAllAsync>(SignalRTags.GetCargoPartners); + public Task GetCargoPartnerById(int id) => GetByIdAsync(SignalRTags.GetCargoPartnerById, id); + public Task AddCargoPartner(CargoPartner cargoPartner) => PostDataAsync(SignalRTags.AddCargoPartner, cargoPartner); + public Task UpdateCargoPartner(CargoPartner cargoPartner) => PostDataAsync(SignalRTags.UpdateCargoPartner, cargoPartner); + #endregion CargoPartner + #region Shipping public Task?> GetShippings()