Add CargoTruck CRUD, grid tabs, and related tests

- Introduced LicencePlate to CargoTruck and Shippings navigation to CargoPartner.
- Implemented CargoTruck CRUD methods in IFruitBankDataControllerCommon and FruitBankSignalRClient.
- Expanded tests for CargoTruck and improved assertions for CargoPartner and Partner.
- Updated CargoPartner grid to show CargoTrucks and Shippings in detail tabs.
- Minor formatting and settings.local.json Bash command update.
This commit is contained in:
Loretta 2026-05-29 12:16:48 +02:00
parent 69010921d7
commit 41ccb10ef7
7 changed files with 127 additions and 32 deletions

View File

@ -11,7 +11,8 @@
"Bash(while read:*)", "Bash(while read:*)",
"Bash(do sed -i '1a using AyCode.Core.Serializers.Toons;\\\\n' \"$f\")", "Bash(do sed -i '1a using AyCode.Core.Serializers.Toons;\\\\n' \"$f\")",
"Bash(done)", "Bash(done)",
"Bash(rm \"C:/Users/Fullepi/.claude/projects/H--Applications-Mango-Source-FruitBankHybridApp/memory/feedback_framework_docs_no_consumer_types.md\")" "Bash(rm \"C:/Users/Fullepi/.claude/projects/H--Applications-Mango-Source-FruitBankHybridApp/memory/feedback_framework_docs_no_consumer_types.md\")",
"Bash(cd \"H:/Applications/Aycode/Source/AyCode.Core/AyCode.Services.Server/bin/FruitBank\" && ls -la --time-style=full-iso Debug/net9.0/AyCode.Core.dll Release/net9.0/AyCode.Core.dll 2>&1)"
] ]
} }
} }

View File

@ -14,4 +14,7 @@ public sealed class CargoPartner : PartnerBase, ICargoPartner
{ {
[Association(ThisKey = nameof(Id), OtherKey = nameof(CargoTruck.CargoPartnerId), CanBeNull = true)] [Association(ThisKey = nameof(Id), OtherKey = nameof(CargoTruck.CargoPartnerId), CanBeNull = true)]
public List<CargoTruck>? CargoTrucks { get; set; } public List<CargoTruck>? CargoTrucks { get; set; }
//[Association(ThisKey = nameof(Id), OtherKey = nameof(Shipping.CargoPartnerId), CanBeNull = true)]
public List<Shipping>? Shippings { get; set; }
} }

View File

@ -11,4 +11,5 @@ namespace FruitBank.Common.Entities;
public sealed class CargoTruck: MgEntityBase//, ICargoPartner public sealed class CargoTruck: MgEntityBase//, ICargoPartner
{ {
public int CargoPartnerId { get; set; } public int CargoPartnerId { get; set; }
public string LicencePlate { get; set; }
} }

View File

@ -26,6 +26,13 @@ public interface IFruitBankDataControllerCommon
public Task<CargoPartner?> UpdateCargoPartner(CargoPartner cargoPartner); public Task<CargoPartner?> UpdateCargoPartner(CargoPartner cargoPartner);
#endregion CargoPartner #endregion CargoPartner
#region CargoTruck
public Task<List<CargoTruck>?> GetCargoTrucks();
public Task<CargoTruck?> GetCargoTruckById(int id);
public Task<CargoTruck?> AddCargoTruck(CargoTruck cargoTruck);
public Task<CargoTruck?> UpdateCargoTruck(CargoTruck cargoTruck);
#endregion CargoTruck
#region Shipping #region Shipping
public Task<List<Shipping>?> GetShippings(); public Task<List<Shipping>?> GetShippings();
Task<List<Shipping>?> GetNotMeasuredShippings(); Task<List<Shipping>?> GetNotMeasuredShippings();

View File

@ -42,22 +42,22 @@ namespace FruitBankHybrid.Shared.Tests
var partners = await _signalRClient.GetPartners(); var partners = await _signalRClient.GetPartners();
Assert.IsNotNull(partners); Assert.IsNotNull(partners);
Assert.IsTrue(partners.Count != 0); Assert.IsNotEmpty(partners);
} }
//[DataTestMethod] //[TestMethod]
//[DataRow(1)] //[DataRow(1)]
public async Task<Partner> GetPartnerByIdTest(int partnerId) public async Task<Partner> GetPartnerByIdTest(int partnerId)
{ {
var partner = await _signalRClient.GetPartnerById(partnerId); var partner = await _signalRClient.GetPartnerById(partnerId);
Assert.IsNotNull(partner); Assert.IsNotNull(partner);
Assert.IsTrue(partner.Id == partnerId); Assert.AreEqual(partnerId, partner.Id);
return partner; return partner;
} }
[DataTestMethod] [TestMethod]
[DataRow(2)] [DataRow(2)]
public async Task UpdatePartnerTest(int partnerId) public async Task UpdatePartnerTest(int partnerId)
{ {
@ -75,7 +75,7 @@ namespace FruitBankHybrid.Shared.Tests
partner = await _signalRClient.UpdatePartner(partner); partner = await _signalRClient.UpdatePartner(partner);
Assert.IsNotNull(partner); Assert.IsNotNull(partner);
Assert.IsTrue(partner.Id == partnerId); Assert.AreEqual(partnerId, partner.Id);
} }
#endregion Partner #endregion Partner
@ -83,13 +83,88 @@ namespace FruitBankHybrid.Shared.Tests
[TestMethod] [TestMethod]
public async Task GetCargoPartnersTest() public async Task GetCargoPartnersTest()
{ {
var partners = await _signalRClient.GetPartners(); var partners = await _signalRClient.GetCargoPartners();
Assert.IsNotNull(partners); Assert.IsNotNull(partners);
Assert.IsTrue(partners.Count != 0); Assert.IsNotEmpty(partners);
}
//[TestMethod]
//[DataRow(1)]
public async Task<CargoPartner> GetCargoPartnerByIdTest(int cargoPartnerId)
{
var cargoPartner = await _signalRClient.GetCargoPartnerById(cargoPartnerId);
Assert.IsNotNull(cargoPartner);
Assert.AreEqual(cargoPartnerId, cargoPartner.Id);
return cargoPartner;
}
[TestMethod]
[DataRow(1)]
public async Task UpdateCargoPartnerTest(int cargoPartnerId)
{
var cargoPartner = await GetCargoPartnerByIdTest(cargoPartnerId);
var newName = GetFixtureName(cargoPartner.Name);
cargoPartner.Name = newName;
cargoPartner = await _signalRClient.UpdateCargoPartner(cargoPartner);
Assert.IsNotNull(cargoPartner);
Assert.IsTrue(cargoPartner.Name == newName);
cargoPartner.Name = GetOriginalName(cargoPartner.Name);
cargoPartner = await _signalRClient.UpdateCargoPartner(cargoPartner);
Assert.IsNotNull(cargoPartner);
Assert.AreEqual(cargoPartnerId, cargoPartner.Id);
} }
#endregion CargoPartner #endregion CargoPartner
#region CargoTruck
[TestMethod]
public async Task GetCargoTrucksTest()
{
var cargoTrucks = await _signalRClient.GetCargoTrucks();
Assert.IsNotNull(cargoTrucks);
Assert.IsNotEmpty(cargoTrucks);
}
//[TestMethod]
//[DataRow(1)]
public async Task<CargoTruck> GetCargoTruckByIdTest(int cargoTruckId)
{
var cargoTruck = await _signalRClient.GetCargoTruckById(cargoTruckId);
Assert.IsNotNull(cargoTruck);
Assert.AreEqual(cargoTruckId, cargoTruck.Id);
return cargoTruck;
}
[TestMethod]
[DataRow(1)]
public async Task UpdateCargoTruckTest(int cargoTruckId)
{
var cargoTruck = await GetCargoTruckByIdTest(cargoTruckId);
var newLicencePlate = GetFixtureName(cargoTruck.LicencePlate);
cargoTruck.LicencePlate = newLicencePlate;
cargoTruck = await _signalRClient.UpdateCargoTruck(cargoTruck);
Assert.IsNotNull(cargoTruck);
Assert.IsTrue(cargoTruck.LicencePlate == newLicencePlate);
cargoTruck.LicencePlate = GetOriginalName(cargoTruck.LicencePlate);
cargoTruck = await _signalRClient.UpdateCargoTruck(cargoTruck);
Assert.IsNotNull(cargoTruck);
Assert.AreEqual(cargoTruckId, cargoTruck.Id);
}
#endregion CargoTruck
#region Shipping #region Shipping
[TestMethod] [TestMethod]
public async Task GetShippingsTest() public async Task GetShippingsTest()
@ -97,7 +172,7 @@ namespace FruitBankHybrid.Shared.Tests
var shippings = await _signalRClient.GetShippings(); var shippings = await _signalRClient.GetShippings();
Assert.IsNotNull(shippings); Assert.IsNotNull(shippings);
Assert.IsTrue(shippings.Count != 0); Assert.IsNotEmpty(shippings);
} }
[TestMethod] [TestMethod]

View File

@ -18,11 +18,11 @@
<GridCargoPartnerBase @ref="Grid" <GridCargoPartnerBase @ref="Grid"
DataSource="CargoPartners" DataSource="CargoPartners"
AutoSaveLayoutName="GridCargoPartner" AutoSaveLayoutName="GridCargoPartner"
SignalRClient="FruitBankSignalRClient" SignalRClient="FruitBankSignalRClient"
Logger="_logger" Logger="_logger"
CssClass="@GridCss" CssClass="@GridCss"
ValidationEnabled="false" ValidationEnabled="false"
OnGridFocusedRowChanged="Grid_FocusedRowChanged"> OnGridFocusedRowChanged="Grid_FocusedRowChanged">
<Columns> <Columns>
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" /> <DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" ReadOnly="true" />
@ -41,37 +41,38 @@
<DxGridDataColumn FieldName="Modified" ReadOnly="true" /> <DxGridDataColumn FieldName="Modified" ReadOnly="true" />
<DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn> <DxGridCommandColumn Visible="!IsMasterGrid" Width="120"></DxGridCommandColumn>
</Columns> </Columns>
@* <DetailRowTemplate> <DetailRowTemplate>
@if (IsMasterGrid) @if (IsMasterGrid)
{ {
var partner = ((CargoPartner)context.DataItem); var partner = ((CargoPartner)context.DataItem);
var shippingDocuments = partner?.ShippingDocuments ?? []; var shipping = partner?.Shippings ?? [];
var cargoTrucks = partner?.CargoTrucks ?? [];
<DxTabs> <DxTabs>
<DxTabPage Text="Szállítólevelek"> <DxTabPage Text="Kamionok">
@{ @{
var observableShippingDocuments = new AcObservableCollection<ShippingDocument>(shippingDocuments); // var observableShippingDocuments = new AcObservableCollection<CargoTruck>(cargoTrucks);
<GridShippingDocument ShippingDocuments="@observableShippingDocuments" ParentDataItem="@partner" Partners="@Partners"></GridShippingDocument> // <GridShippingDocument ShippingDocuments="@observableShippingDocuments" ParentDataItem="@partner" Partners="@Partners" IsMasterGrid="false"></GridShippingDocument>
} }
</DxTabPage> </DxTabPage>
<DxTabPage Text="Szállítmány tételek"> <DxTabPage Text="Szállítmányok">
@{ @{
var observableShippingItems = new AcObservableCollection<ShippingItem>(shippingDocuments.SelectMany(sd => sd.ShippingItems ?? [])); var observableShippings = new AcObservableCollection<Shipping>(shipping);
<GridShippingItemTemplate ShippingItems="@observableShippingItems" ParentDataItem="@partner" /> <GridShipping Shippings="@observableShippings" IsMasterGrid="false" />
} }
</DxTabPage> </DxTabPage>
</DxTabs> </DxTabs>
} }
</DetailRowTemplate> </DetailRowTemplate>
*@ <ToolbarTemplate> <ToolbarTemplate>
@if (IsMasterGrid) @if (IsMasterGrid)
{ {
<MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" /> <MgGridToolbarTemplate Grid="Grid" OnReloadDataClick="() => ReloadDataFromDb(true)" />
} }
</ToolbarTemplate> </ToolbarTemplate>
</GridCargoPartnerBase> </GridCargoPartnerBase>
</GridContent> </GridContent>
</MgGridWithInfoPanel> </MgGridWithInfoPanel>
@code { @code {

View File

@ -57,8 +57,7 @@ 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);
#region Partner #region Partner
public Task<List<Partner>?> GetPartners() => GetAllAsync<List<Partner>>(SignalRTags.GetPartners); public Task<List<Partner>?> GetPartners() => GetAllAsync<List<Partner>>(SignalRTags.GetPartners);
@ -74,6 +73,14 @@ namespace FruitBankHybrid.Shared.Services.SignalRs
public Task<CargoPartner?> UpdateCargoPartner(CargoPartner cargoPartner) => PostDataAsync(SignalRTags.UpdateCargoPartner, cargoPartner); public Task<CargoPartner?> UpdateCargoPartner(CargoPartner cargoPartner) => PostDataAsync(SignalRTags.UpdateCargoPartner, cargoPartner);
#endregion CargoPartner #endregion CargoPartner
#region CargoTruck
public Task<List<CargoTruck>?> GetCargoTrucks() => GetAllAsync<List<CargoTruck>>(SignalRTags.GetCargoTrucks);
public Task<CargoTruck?> GetCargoTruckById(int id) => GetByIdAsync<CargoTruck?>(SignalRTags.GetCargoTruckById, id);
public Task<CargoTruck?> AddCargoTruck(CargoTruck cargoTruck) => PostDataAsync(SignalRTags.AddCargoTruck, cargoTruck);
public Task<CargoTruck?> UpdateCargoTruck(CargoTruck cargoTruck) => PostDataAsync(SignalRTags.UpdateCargoTruck, cargoTruck);
#endregion CargoTruck
#region Shipping #region Shipping
public Task<List<Shipping>?> GetShippings() public Task<List<Shipping>?> GetShippings()