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.
This commit is contained in:
Loretta 2026-05-28 19:48:18 +02:00
parent a32f91271d
commit 69010921d7
10 changed files with 501 additions and 276 deletions

View File

@ -19,6 +19,13 @@ public interface IFruitBankDataControllerCommon
public Task<Partner?> UpdatePartner(Partner partner); public Task<Partner?> UpdatePartner(Partner partner);
#endregion Partner #endregion Partner
#region CargoPartner
public Task<List<CargoPartner>?> GetCargoPartners();
public Task<CargoPartner?> GetCargoPartnerById(int id);
public Task<CargoPartner?> AddCargoPartner(CargoPartner cargoPartner);
public Task<CargoPartner?> UpdateCargoPartner(CargoPartner cargoPartner);
#endregion CargoPartner
#region Shipping #region Shipping
public Task<List<Shipping>?> GetShippings(); public Task<List<Shipping>?> GetShippings();
Task<List<Shipping>?> GetNotMeasuredShippings(); Task<List<Shipping>?> GetNotMeasuredShippings();

View File

@ -15,6 +15,16 @@ public class SignalRTags : AcSignalRTags
public const int AddPartner = 25; public const int AddPartner = 25;
public const int UpdatePartner = 26; 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 GetShippings = 40;
public const int GetNotMeasuredShippings = 41; public const int GetNotMeasuredShippings = 41;
public const int GetShippingById = 42; public const int GetShippingById = 42;

View File

@ -79,6 +79,17 @@ namespace FruitBankHybrid.Shared.Tests
} }
#endregion Partner #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 #region Shipping
[TestMethod] [TestMethod]
public async Task GetShippingsTest() public async Task GetShippingsTest()
@ -456,7 +467,7 @@ namespace FruitBankHybrid.Shared.Tests
[DataRow(5, true)] [DataRow(5, true)]
//[DataRow(6, false)] //[DataRow(6, false)]
[DataRow(33, true)] [DataRow(33, true)]
[DataRow(64, false)] //[DataRow(64, false)]
[DataRow(7, true)] [DataRow(7, true)]
public async Task GetProductDtoByIdTest(int productId, bool isMeasurableExcepted) public async Task GetProductDtoByIdTest(int productId, bool isMeasurableExcepted)
{ {

View File

@ -1,316 +1,316 @@
using AyCode.Core.Enums; //using AyCode.Core.Enums;
using AyCode.Core.Loggers; //using AyCode.Core.Loggers;
using AyCode.Utils.Extensions; //using AyCode.Utils.Extensions;
using FruitBank.Common; //using FruitBank.Common;
using FruitBank.Common.Dtos; //using FruitBank.Common.Dtos;
using FruitBank.Common.Entities; //using FruitBank.Common.Entities;
using FruitBank.Common.Interfaces; //using FruitBank.Common.Interfaces;
using FruitBank.Common.Loggers; //using FruitBank.Common.Loggers;
using FruitBankHybrid.Shared.Services.SignalRs; //using FruitBankHybrid.Shared.Services.SignalRs;
using System.Diagnostics.CodeAnalysis; //using System.Diagnostics.CodeAnalysis;
using FruitBank.Common.SignalRs; //using FruitBank.Common.SignalRs;
using AyCode.Services.SignalRs; //using AyCode.Services.SignalRs;
namespace FruitBankHybrid.Shared.Tests; //namespace FruitBankHybrid.Shared.Tests;
/// <summary> ///// <summary>
/// Teszt a TestSignalREndpoint-hoz. ///// Teszt a TestSignalREndpoint-hoz.
/// FONTOS: A SANDBOX-ot manu<6E>lisan kell elind<6E>tani a tesztek futtat<61>sa el<65>tt! ///// FONTOS: A SANDBOX-ot manu<6E>lisan kell elind<6E>tani a tesztek futtat<61>sa el<65>tt!
/// Ind<6E>t<EFBFBD>s: dotnet run --project Mango.Sandbox.EndPoints --urls http://localhost:59579 ///// Ind<6E>t<EFBFBD>s: dotnet run --project Mango.Sandbox.EndPoints --urls http://localhost:59579
/// </summary> ///// </summary>
[TestClass] //[TestClass]
public class SandboxEndpointSimpleTests //public class SandboxEndpointSimpleTests
{ //{
private static readonly string SandboxUrl = FruitBankConstClient.BaseUrl; //"http://localhost:59579"; // private static readonly string SandboxUrl = FruitBankConstClient.BaseUrl; //"http://localhost:59579";
private static readonly string HubUrl = $"{SandboxUrl}/fbHub"; // private static readonly string HubUrl = $"{SandboxUrl}/fbHub";
// Teszt SignalR Tags (TestSignalRTags-b<>l) // // Teszt SignalR Tags (TestSignalRTags-b<>l)
private const int PingTag = SignalRTags.PingTag; // private const int PingTag = SignalRTags.PingTag;
private const int EchoTag = SignalRTags.EchoTag; // private const int EchoTag = SignalRTags.EchoTag;
private const int GetTestItemsTag = 9003; // private const int GetTestItemsTag = 9003;
private FruitBankSignalRClient _signalRClient = null!; // private FruitBankSignalRClient _signalRClient = null!;
[TestInitialize] // [TestInitialize]
public void TestInit() // public void TestInit()
{ // {
if (!SandboxUrl.Contains("localhost:")) throw new Exception("NEM LOCALHOST-ON TESZTEL<45>NK!"); // if (!SandboxUrl.Contains("localhost:")) throw new Exception("NEM LOCALHOST-ON TESZTEL<45>NK!");
_signalRClient = TestSignalRClientFactory.Create(nameof(SandboxEndpointSimpleTests)); // _signalRClient = TestSignalRClientFactory.Create(nameof(SandboxEndpointSimpleTests));
} // }
#region HTTP Endpoint Tests // #region HTTP Endpoint Tests
[TestMethod] // [TestMethod]
public async Task HealthEndpoint_ReturnsSuccess() // public async Task HealthEndpoint_ReturnsSuccess()
{ // {
using var httpClient = new HttpClient(); // using var httpClient = new HttpClient();
var response = await httpClient.GetAsync($"{SandboxUrl}/health"); // var response = await httpClient.GetAsync($"{SandboxUrl}/health");
Assert.IsTrue(response.IsSuccessStatusCode, $"Health endpoint returned {response.StatusCode}"); // Assert.IsTrue(response.IsSuccessStatusCode, $"Health endpoint returned {response.StatusCode}");
} // }
[TestMethod] // [TestMethod]
public async Task RootEndpoint_ReturnsSandboxIsRunning() // public async Task RootEndpoint_ReturnsSandboxIsRunning()
{ // {
using var httpClient = new HttpClient(); // using var httpClient = new HttpClient();
var response = await httpClient.GetStringAsync(SandboxUrl); // var response = await httpClient.GetStringAsync(SandboxUrl);
Assert.AreEqual("SANDBOX is running!", response); // Assert.AreEqual("SANDBOX is running!", response);
} // }
#endregion // #endregion
#region SignalR Connection Tests // #region SignalR Connection Tests
[TestMethod] // [TestMethod]
public async Task SignalR_Negotiate_ReturnsSuccess() // public async Task SignalR_Negotiate_ReturnsSuccess()
{ // {
using var httpClient = new HttpClient(); // using var httpClient = new HttpClient();
var response = await httpClient.PostAsync($"{HubUrl}/negotiate?negotiateVersion=1", null); // var response = await httpClient.PostAsync($"{HubUrl}/negotiate?negotiateVersion=1", null);
Assert.IsTrue(response.IsSuccessStatusCode, $"SignalR negotiate returned {response.StatusCode}"); // Assert.IsTrue(response.IsSuccessStatusCode, $"SignalR negotiate returned {response.StatusCode}");
} // }
[TestMethod] // [TestMethod]
public async Task SignalR_Connect_Succeeds() // public async Task SignalR_Connect_Succeeds()
{ // {
var testItems = await _signalRClient.GetAllAsync<List<TestItem>>(GetTestItemsTag); // var testItems = await _signalRClient.GetAllAsync<List<TestItem>>(GetTestItemsTag);
Assert.IsNotNull(testItems); // Assert.IsNotNull(testItems);
} // }
public class TestItem // public class TestItem
{ // {
public int Id { get; set; } // public int Id { get; set; }
public string Name { get; set; } = string.Empty; // public string Name { get; set; } = string.Empty;
public decimal Value { get; set; } // public decimal Value { get; set; }
} // }
//[TestMethod] ////[TestMethod]
//public async Task SignalR_Connect_Succeeds() // //public async Task SignalR_Connect_Succeeds()
//{ // //{
// var connection = new HubConnectionBuilder() // // var connection = new HubConnectionBuilder()
// .WithUrl(HubUrl) // // .WithUrl(HubUrl)
// .Build(); // // .Build();
// try // // try
// { // // {
// await connection.StartAsync(); // // await connection.StartAsync();
// Assert.AreEqual(HubConnectionState.Connected, connection.State); // // Assert.AreEqual(HubConnectionState.Connected, connection.State);
// } // // }
// finally // // finally
// { // // {
// await connection.StopAsync(); // // await connection.StopAsync();
// } // // }
//} // //}
//#endregion // //#endregion
//#region TestSignalREndpoint Tests // //#region TestSignalREndpoint Tests
//[TestMethod] // //[TestMethod]
//public async Task SignalR_Ping_ReturnsResponse() // //public async Task SignalR_Ping_ReturnsResponse()
//{ // //{
// var testMessage = "Hello SignalR!"; // // var testMessage = "Hello SignalR!";
// await TestSignalREndpoint(PingTag, testMessage, "Ping", response => // // await TestSignalREndpoint(PingTag, testMessage, "Ping", response =>
// { // // {
// Assert.IsNotNull(response, "Response should not be null"); // // Assert.IsNotNull(response, "Response should not be null");
// // Parse JSON response // // // Parse JSON response
// using var jsonDoc = JsonDocument.Parse(response); // // using var jsonDoc = JsonDocument.Parse(response);
// var root = jsonDoc.RootElement; // // var root = jsonDoc.RootElement;
// // Ellen<65>rizz<7A>k, hogy van Message property // // // Ellen<65>rizz<7A>k, hogy van Message property
// Assert.IsTrue(root.TryGetProperty("Message", out var messageElement) || // // Assert.IsTrue(root.TryGetProperty("Message", out var messageElement) ||
// root.TryGetProperty("message", out messageElement), // // root.TryGetProperty("message", out messageElement),
// "Response should contain 'Message' property"); // // "Response should contain 'Message' property");
// Console.WriteLine($"[Ping] Received message: {messageElement.GetString()}"); // // Console.WriteLine($"[Ping] Received message: {messageElement.GetString()}");
// }); // // });
//} // //}
//[TestMethod] // //[TestMethod]
//public async Task SignalR_Echo_ReturnsEchoedData() // //public async Task SignalR_Echo_ReturnsEchoedData()
//{ // //{
// var request = new { Id = 42, Name = "TestName" }; // // var request = new { Id = 42, Name = "TestName" };
// await TestSignalREndpoint(EchoTag, request, "Echo", response => // // await TestSignalREndpoint(EchoTag, request, "Echo", response =>
// { // // {
// Assert.IsNotNull(response, "Response should not be null"); // // Assert.IsNotNull(response, "Response should not be null");
// using var jsonDoc = JsonDocument.Parse(response); // // using var jsonDoc = JsonDocument.Parse(response);
// var root = jsonDoc.RootElement; // // var root = jsonDoc.RootElement;
// // Ellen<65>rizz<7A>k az Id-t // // // Ellen<65>rizz<7A>k az Id-t
// Assert.IsTrue(root.TryGetProperty("Id", out var idElement) || // // Assert.IsTrue(root.TryGetProperty("Id", out var idElement) ||
// root.TryGetProperty("id", out idElement), // // root.TryGetProperty("id", out idElement),
// "Response should contain 'Id' property"); // // "Response should contain 'Id' property");
// Assert.AreEqual(42, idElement.GetInt32(), "Id should be 42"); // // Assert.AreEqual(42, idElement.GetInt32(), "Id should be 42");
// // Ellen<65>rizz<7A>k a Name-et // // // Ellen<65>rizz<7A>k a Name-et
// Assert.IsTrue(root.TryGetProperty("Name", out var nameElement) || // // Assert.IsTrue(root.TryGetProperty("Name", out var nameElement) ||
// root.TryGetProperty("name", out nameElement), // // root.TryGetProperty("name", out nameElement),
// "Response should contain 'Name' property"); // // "Response should contain 'Name' property");
// Assert.AreEqual("TestName", nameElement.GetString(), "Name should be 'TestName'"); // // 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] // //[TestMethod]
//public async Task SignalR_GetTestItems_ReturnsItemList() // //public async Task SignalR_GetTestItems_ReturnsItemList()
//{ // //{
// await TestSignalREndpoint(GetTestItemsTag, null, "GetTestItems", response => // // await TestSignalREndpoint(GetTestItemsTag, null, "GetTestItems", response =>
// { // // {
// Assert.IsNotNull(response, "Response should not be null"); // // Assert.IsNotNull(response, "Response should not be null");
// using var jsonDoc = JsonDocument.Parse(response); // // using var jsonDoc = JsonDocument.Parse(response);
// var root = jsonDoc.RootElement; // // var root = jsonDoc.RootElement;
// // Ellen<65>rizz<7A>k, hogy t<>mb-e // // // Ellen<65>rizz<7A>k, hogy t<>mb-e
// Assert.AreEqual(JsonValueKind.Array, root.ValueKind, "Response should be an array"); // // Assert.AreEqual(JsonValueKind.Array, root.ValueKind, "Response should be an array");
// Assert.IsTrue(root.GetArrayLength() > 0, "Array should have items"); // // Assert.IsTrue(root.GetArrayLength() > 0, "Array should have items");
// Console.WriteLine($"[GetTestItems] Received {root.GetArrayLength()} items"); // // Console.WriteLine($"[GetTestItems] Received {root.GetArrayLength()} items");
// // Ellen<65>rizz<7A>k az els<6C> elemet // // // Ellen<65>rizz<7A>k az els<6C> elemet
// var firstItem = root[0]; // // var firstItem = root[0];
// Assert.IsTrue(firstItem.TryGetProperty("Id", out _) || firstItem.TryGetProperty("id", out _), // // Assert.IsTrue(firstItem.TryGetProperty("Id", out _) || firstItem.TryGetProperty("id", out _),
// "Item should have 'Id' property"); // // "Item should have 'Id' property");
// Assert.IsTrue(firstItem.TryGetProperty("Name", out _) || firstItem.TryGetProperty("name", out _), // // Assert.IsTrue(firstItem.TryGetProperty("Name", out _) || firstItem.TryGetProperty("name", out _),
// "Item should have 'Name' property"); // // "Item should have 'Name' property");
// }); // // });
//} // //}
//#endregion // //#endregion
//#region EREDETI BUSINESS ENDPOINT TESZTEK - KIKOMMENTEZVE // //#region EREDETI BUSINESS ENDPOINT TESZTEK - KIKOMMENTEZVE
//// =========================================== // //// ===========================================
//// === Az al<61>bbi tesztek az eredeti 3 endpoint-ot tesztelik === // //// === Az al<61>bbi tesztek az eredeti 3 endpoint-ot tesztelik ===
//// === Vissza<7A>ll<6C>t<EFBFBD>shoz: t<>r<EFBFBD>ld a kommenteket <20>s regisztr<74>ld az endpoint-okat a Program.cs-ben === // //// === Vissza<7A>ll<6C>t<EFBFBD>shoz: t<>r<EFBFBD>ld a kommenteket <20>s regisztr<74>ld az endpoint-okat a Program.cs-ben ===
//// =========================================== // //// ===========================================
//// [TestMethod] // //// [TestMethod]
//// public async Task SignalR_GetMeasuringUsers_ReturnsJson() // //// public async Task SignalR_GetMeasuringUsers_ReturnsJson()
//// { // //// {
//// await TestSignalREndpoint(GetMeasuringUsersTag, null, "GetMeasuringUsers"); // //// await TestSignalREndpoint(GetMeasuringUsersTag, null, "GetMeasuringUsers");
//// } // //// }
//// [TestMethod] // //// [TestMethod]
//// public async Task SignalR_GetStockQuantityHistoryDtos_ReturnsJson() // //// public async Task SignalR_GetStockQuantityHistoryDtos_ReturnsJson()
//// { // //// {
//// await TestSignalREndpoint(GetStockQuantityHistoryDtosTag, null, "GetStockQuantityHistoryDtos"); // //// await TestSignalREndpoint(GetStockQuantityHistoryDtosTag, null, "GetStockQuantityHistoryDtos");
//// } // //// }
//// [TestMethod] // //// [TestMethod]
//// public async Task SignalR_GetStockQuantityHistoryDtosByProductId_ReturnsJson() // //// public async Task SignalR_GetStockQuantityHistoryDtosByProductId_ReturnsJson()
//// { // //// {
//// // ProductId = 10 // //// // ProductId = 10
//// await TestSignalREndpoint(GetStockQuantityHistoryDtosByProductIdTag, 10, "GetStockQuantityHistoryDtosByProductId"); // //// await TestSignalREndpoint(GetStockQuantityHistoryDtosByProductIdTag, 10, "GetStockQuantityHistoryDtosByProductId");
//// } // //// }
//// [TestMethod] // //// [TestMethod]
//// public async Task SignalR_GetShippingDocumentsByShippingId_ReturnsJson() // //// public async Task SignalR_GetShippingDocumentsByShippingId_ReturnsJson()
//// { // //// {
//// // ShippingId = 5 // //// // ShippingId = 5
//// await TestSignalREndpoint(GetShippingDocumentsByShippingIdTag, 5, "GetShippingDocumentsByShippingId"); // //// await TestSignalREndpoint(GetShippingDocumentsByShippingIdTag, 5, "GetShippingDocumentsByShippingId");
//// } // //// }
//// [TestMethod] // //// [TestMethod]
//// public async Task SignalR_GetOrderDtoById_ReturnsJson() // //// public async Task SignalR_GetOrderDtoById_ReturnsJson()
//// { // //// {
//// // OrderId = 15 // //// // OrderId = 15
//// await TestSignalREndpoint(GetOrderDtoByIdTag, 15, "GetOrderDtoById"); // //// await TestSignalREndpoint(GetOrderDtoByIdTag, 15, "GetOrderDtoById");
//// } // //// }
//// [TestMethod] // //// [TestMethod]
//// public async Task SignalR_GetStockTakingItemsById_ReturnsJson() // //// public async Task SignalR_GetStockTakingItemsById_ReturnsJson()
//// { // //// {
//// // StockTakingItemId = 200 // //// // StockTakingItemId = 200
//// await TestSignalREndpoint(GetStockTakingItemsByIdTag, 200, "GetStockTakingItemsById"); // //// await TestSignalREndpoint(GetStockTakingItemsByIdTag, 200, "GetStockTakingItemsById");
//// } // //// }
//#endregion // //#endregion
//#region Helper Methods // //#region Helper Methods
//private async Task TestSignalREndpoint(int tag, object? parameter, string endpointName, Action<string?>? validateResponse = null) // //private async Task TestSignalREndpoint(int tag, object? parameter, string endpointName, Action<string?>? validateResponse = null)
//{ // //{
// var connection = new HubConnectionBuilder() // // var connection = new HubConnectionBuilder()
// .WithUrl(HubUrl) // // .WithUrl(HubUrl)
// .Build(); // // .Build();
// string? receivedJson = null; // // string? receivedJson = null;
// int receivedTag = -1; // // int receivedTag = -1;
// var responseReceived = new TaskCompletionSource<bool>(); // // var responseReceived = new TaskCompletionSource<bool>();
// connection.On<int, byte[]>("ReceiveMessage", (responseTag, data) => // // connection.On<int, byte[]>("ReceiveMessage", (responseTag, data) =>
// { // // {
// receivedTag = responseTag; // // receivedTag = responseTag;
// if (data != null && data.Length > 0) // // if (data != null && data.Length > 0)
// { // // {
// receivedJson = Encoding.UTF8.GetString(data); // // receivedJson = Encoding.UTF8.GetString(data);
// } // // }
// responseReceived.TrySetResult(true); // // responseReceived.TrySetResult(true);
// }); // // });
// try // // try
// { // // {
// await connection.StartAsync(); // // await connection.StartAsync();
// Assert.AreEqual(HubConnectionState.Connected, connection.State, $"Failed to connect to SignalR hub for {endpointName}"); // // Assert.AreEqual(HubConnectionState.Connected, connection.State, $"Failed to connect to SignalR hub for {endpointName}");
// // K<>sz<73>ts<74>k el a request data-t // // // K<>sz<73>ts<74>k el a request data-t
// // Ha nincs param<61>ter, null-t k<>ld<6C>nk (nem <20>res byte t<>mb<6D>t!) // // // Ha nincs param<61>ter, null-t k<>ld<6C>nk (nem <20>res byte t<>mb<6D>t!)
// byte[]? requestData = parameter != null // // byte[]? requestData = parameter != null
// ? Encoding.UTF8.GetBytes(JsonSerializer.Serialize(parameter)) // // ? Encoding.UTF8.GetBytes(JsonSerializer.Serialize(parameter))
// : null; // // : null;
// // A Hub met<65>dus neve: OnReceiveMessage (3 param<61>ter: messageTag, messageBytes, requestId) // // // A Hub met<65>dus neve: OnReceiveMessage (3 param<61>ter: messageTag, messageBytes, requestId)
// await connection.InvokeAsync("OnReceiveMessage", tag, requestData, (int?)null); // // 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) // // if (completed == responseReceived.Task)
// { // // {
// Console.WriteLine($"[{endpointName}] Response tag: {receivedTag}"); // // Console.WriteLine($"[{endpointName}] Response tag: {receivedTag}");
// Console.WriteLine($"[{endpointName}] Response JSON: {receivedJson?.Substring(0, Math.Min(500, receivedJson?.Length ?? 0))}..."); // // Console.WriteLine($"[{endpointName}] Response JSON: {receivedJson?.Substring(0, Math.Min(500, receivedJson?.Length ?? 0))}...");
// // Ellen<65>rizz<7A>k, hogy valid JSON-e (ha van adat) // // // Ellen<65>rizz<7A>k, hogy valid JSON-e (ha van adat)
// if (!string.IsNullOrEmpty(receivedJson)) // // if (!string.IsNullOrEmpty(receivedJson))
// { // // {
// try // // try
// { // // {
// using var jsonDoc = JsonDocument.Parse(receivedJson); // // using var jsonDoc = JsonDocument.Parse(receivedJson);
// Assert.IsTrue( // // Assert.IsTrue(
// jsonDoc.RootElement.ValueKind == JsonValueKind.Array || // // jsonDoc.RootElement.ValueKind == JsonValueKind.Array ||
// jsonDoc.RootElement.ValueKind == JsonValueKind.Object || // // jsonDoc.RootElement.ValueKind == JsonValueKind.Object ||
// jsonDoc.RootElement.ValueKind == JsonValueKind.Null, // // jsonDoc.RootElement.ValueKind == JsonValueKind.Null,
// $"[{endpointName}] Response is not a valid JSON"); // // $"[{endpointName}] Response is not a valid JSON");
// // Custom validation // // // Custom validation
// validateResponse?.Invoke(receivedJson); // // validateResponse?.Invoke(receivedJson);
// } // // }
// catch (JsonException ex) // // catch (JsonException ex)
// { // // {
// Assert.Fail($"[{endpointName}] Invalid JSON response: {ex.Message}"); // // Assert.Fail($"[{endpointName}] Invalid JSON response: {ex.Message}");
// } // // }
// } // // }
// } // // }
// else // // else
// { // // {
// Assert.AreEqual(HubConnectionState.Connected, connection.State, // // Assert.AreEqual(HubConnectionState.Connected, connection.State,
// $"[{endpointName}] Connection was closed - check SANDBOX logs for DI errors"); // // $"[{endpointName}] Connection was closed - check SANDBOX logs for DI errors");
// } // // }
// } // // }
// catch (Exception ex) // // catch (Exception ex)
// { // // {
// Assert.Fail($"[{endpointName}] SignalR error: {ex.Message}. Check SANDBOX logs for missing DI registrations."); // // Assert.Fail($"[{endpointName}] SignalR error: {ex.Message}. Check SANDBOX logs for missing DI registrations.");
// } // // }
// finally // // finally
// { // // {
// if (connection.State == HubConnectionState.Connected) // // if (connection.State == HubConnectionState.Connected)
// { // // {
// await connection.StopAsync(); // // await connection.StopAsync();
// } // // }
// } // // }
//} // //}
#endregion // #endregion
} //}

View File

@ -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<IAcLogWriterClientBase> LogWriters
@inject FruitBankSignalRClient FruitBankSignalRClient
<MgGridWithInfoPanel ShowInfoPanel="@IsMasterGrid">
<GridContent>
<GridCargoPartnerBase @ref="Grid"
DataSource="CargoPartners"
AutoSaveLayoutName="GridCargoPartner"
SignalRClient="FruitBankSignalRClient"
Logger="_logger"
CssClass="@GridCss"
ValidationEnabled="false"
OnGridFocusedRowChanged="Grid_FocusedRowChanged">
<Columns>
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" />
<DxGridDataColumn FieldName="Name" />
<DxGridDataColumn FieldName="TaxId" />
<DxGridDataColumn FieldName="CertificationNumber" />
<DxGridDataColumn FieldName="@nameof(Partner.CountryCode)" />
<DxGridDataColumn FieldName="PostalCode" />
<DxGridDataColumn FieldName="@nameof(CargoPartner.Country)" />
<DxGridDataColumn FieldName="State" />
<DxGridDataColumn FieldName="County" />
<DxGridDataColumn FieldName="City" />
<DxGridDataColumn FieldName="Street" />
<DxGridDataColumn FieldName="Created" ReadOnly="true" />
<DxGridDataColumn FieldName="Modified" ReadOnly="true" />
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
</Columns>
@* <DetailRowTemplate>
@if (IsMasterGrid)
{
var partner = ((CargoPartner)context.DataItem);
var shippingDocuments = partner?.ShippingDocuments ?? [];
<DxTabs>
<DxTabPage Text="Szállítólevelek">
@{
var observableShippingDocuments = new AcObservableCollection<ShippingDocument>(shippingDocuments);
<GridShippingDocument ShippingDocuments="@observableShippingDocuments" ParentDataItem="@partner" Partners="@Partners"></GridShippingDocument>
}
</DxTabPage>
<DxTabPage Text="Szállítmány tételek">
@{
var observableShippingItems = new AcObservableCollection<ShippingItem>(shippingDocuments.SelectMany(sd => sd.ShippingItems ?? []));
<GridShippingItemTemplate ShippingItems="@observableShippingItems" ParentDataItem="@partner" />
}
</DxTabPage>
</DxTabs>
}
</DetailRowTemplate>
*@ <ToolbarTemplate>
@if (IsMasterGrid)
{
<MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" />
}
</ToolbarTemplate>
</GridCargoPartnerBase>
</GridContent>
</MgGridWithInfoPanel>
@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<CargoPartner>? CargoPartners { get; set; }
[Parameter] public AcObservableCollection<Shipping>? 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<GridCargoPartner> _logger;
protected override async Task OnInitializedAsync()
{
_logger = new LoggerClient<GridCargoPartner>(LogWriters.ToArray());
await ReloadDataFromDb(false);
}
private async Task ReloadDataFromDb(bool forceReload = false)
{
if (!IsMasterGrid) return;
if (Grid == null) return;
using (await ObjectLock.GetSemaphore<CargoPartner>().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;
}
}

View File

@ -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<CargoPartner>, 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;
}
}
}

View File

@ -29,6 +29,7 @@
<DxGridDataColumn FieldName="Name" /> <DxGridDataColumn FieldName="Name" />
<DxGridDataColumn FieldName="TaxId" /> <DxGridDataColumn FieldName="TaxId" />
<DxGridDataColumn FieldName="CertificationNumber" /> <DxGridDataColumn FieldName="CertificationNumber" />
<DxGridDataColumn FieldName="@nameof(Partner.CountryCode)" />
<DxGridDataColumn FieldName="PostalCode" /> <DxGridDataColumn FieldName="PostalCode" />
<DxGridDataColumn FieldName="@nameof(Partner.Country)" /> <DxGridDataColumn FieldName="@nameof(Partner.Country)" />
<DxGridDataColumn FieldName="State" /> <DxGridDataColumn FieldName="State" />

View File

@ -2,6 +2,7 @@
@using FruitBank.Common.Dtos @using FruitBank.Common.Dtos
@using FruitBank.Common.Entities @using FruitBank.Common.Entities
@using FruitBankHybrid.Shared.Components @using FruitBankHybrid.Shared.Components
@using FruitBankHybrid.Shared.Components.Grids.Cargos
@using FruitBankHybrid.Shared.Components.Grids.Partners @using FruitBankHybrid.Shared.Components.Grids.Partners
@using FruitBankHybrid.Shared.Components.Grids.Shippings @using FruitBankHybrid.Shared.Components.Grids.Shippings
@using FruitBankHybrid.Shared.Databases @using FruitBankHybrid.Shared.Databases
@ -25,6 +26,9 @@
<DxTabPage Text="Beszállítók" Visible="@(LoggedInModel.IsAdministrator)"> <DxTabPage Text="Beszállítók" Visible="@(LoggedInModel.IsAdministrator)">
<GridPartner @ref="gridPartner" Partners="@Partners" IsMasterGrid="true"></GridPartner> <GridPartner @ref="gridPartner" Partners="@Partners" IsMasterGrid="true"></GridPartner>
</DxTabPage> </DxTabPage>
<DxTabPage Text="Fuvarozók" Visible="@(LoggedInModel.IsAdministrator)">
<GridCargoPartner @ref="gridCargoPartner" CargoPartners="CargoPartners" IsMasterGrid="true"></GridCargoPartner>
</DxTabPage>
<DxTabPage Text="Szállítmányok"> <DxTabPage Text="Szállítmányok">
<GridShipping @ref="gridShipping" Shippings="@Shippings" Partners="@Partners" IsMasterGrid="true"></GridShipping> <GridShipping @ref="gridShipping" Shippings="@Shippings" Partners="@Partners" IsMasterGrid="true"></GridShipping>
</DxTabPage> </DxTabPage>

View File

@ -15,6 +15,7 @@ using FruitBankHybrid.Shared.Services.Loggers;
using FruitBankHybrid.Shared.Services.SignalRs; using FruitBankHybrid.Shared.Services.SignalRs;
using Mango.Nop.Core.Loggers; using Mango.Nop.Core.Loggers;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using FruitBankHybrid.Shared.Components.Grids.Cargos;
namespace FruitBankHybrid.Shared.Pages; namespace FruitBankHybrid.Shared.Pages;
@ -29,6 +30,7 @@ public partial class ShippingsAdmin : ComponentBase
private GridProductDtoTemplate gridProductDtoTemplate; private GridProductDtoTemplate gridProductDtoTemplate;
private GridPartner gridPartner; private GridPartner gridPartner;
private GridCargoPartner gridCargoPartner;
private GridShipping gridShipping; private GridShipping gridShipping;
private GridShippingDocument gridShippingDocument; private GridShippingDocument gridShippingDocument;
private GridShippingItemTemplate gridShippingItemTemplate; private GridShippingItemTemplate gridShippingItemTemplate;
@ -39,6 +41,7 @@ public partial class ShippingsAdmin : ComponentBase
public AcObservableCollection<ShippingItem> ShippingItems { get; set; } = []; public AcObservableCollection<ShippingItem> ShippingItems { get; set; } = [];
public List<ShippingItemPallet> ShippingItemPallets { get; set; } = []; public List<ShippingItemPallet> ShippingItemPallets { get; set; } = [];
public AcObservableCollection<Partner> Partners { get; set; } = []; public AcObservableCollection<Partner> Partners { get; set; } = [];
public AcObservableCollection<CargoPartner> CargoPartners { get; set; } = [];
public bool AutoCollapseDetailRow { get; set; } public bool AutoCollapseDetailRow { get; set; }

View File

@ -60,22 +60,20 @@ namespace FruitBankHybrid.Shared.Services.SignalRs
public Task<List<MeasuringModel>?> GetMeasuringModels() public Task<List<MeasuringModel>?> GetMeasuringModels()
=> GetAllAsync<List<MeasuringModel>>(SignalRTags.GetMeasuringModels); => GetAllAsync<List<MeasuringModel>>(SignalRTags.GetMeasuringModels);
public Task<List<Partner>?> GetPartners()
=> GetAllAsync<List<Partner>>(SignalRTags.GetPartners);
#region Partner #region Partner
public Task<List<Partner>?> GetPartners() => GetAllAsync<List<Partner>>(SignalRTags.GetPartners);
public Task<Partner?> GetPartnerById(int id) public Task<Partner?> GetPartnerById(int id) => GetByIdAsync<Partner?>(SignalRTags.GetPartnerById, id);
=> GetByIdAsync<Partner?>(SignalRTags.GetPartnerById, id); public Task<Partner?> AddPartner(Partner partner) => PostDataAsync(SignalRTags.AddPartner, partner);
public Task<Partner?> UpdatePartner(Partner partner) => PostDataAsync(SignalRTags.UpdatePartner, partner);
public Task<Partner?> AddPartner(Partner partner)
=> PostDataAsync(SignalRTags.AddPartner, partner);
public Task<Partner?> UpdatePartner(Partner partner)
=> PostDataAsync(SignalRTags.UpdatePartner, partner);
#endregion Partner #endregion Partner
#region CargoPartner
public Task<List<CargoPartner>?> GetCargoPartners() => GetAllAsync<List<CargoPartner>>(SignalRTags.GetCargoPartners);
public Task<CargoPartner?> GetCargoPartnerById(int id) => GetByIdAsync<CargoPartner?>(SignalRTags.GetCargoPartnerById, id);
public Task<CargoPartner?> AddCargoPartner(CargoPartner cargoPartner) => PostDataAsync(SignalRTags.AddCargoPartner, cargoPartner);
public Task<CargoPartner?> UpdateCargoPartner(CargoPartner cargoPartner) => PostDataAsync(SignalRTags.UpdateCargoPartner, cargoPartner);
#endregion CargoPartner
#region Shipping #region Shipping
public Task<List<Shipping>?> GetShippings() public Task<List<Shipping>?> GetShippings()