-
+
Shape
-
+
-- Select --
@foreach (var shape in DistinctShapes)
{
@@ -135,7 +136,7 @@ else
Size
-
+
-- Select --
@foreach (var material in FilteredMaterials)
{
@@ -143,19 +144,63 @@ else
}
-
- Length
-
-
-
- Quantity
-
-
-
- Name (optional)
-
-
+
+ @if (editingPart != null)
+ {
+ @* Edit mode: single row *@
+
+
+ Length
+
+
+
+ Quantity
+
+
+
+ Name (optional)
+
+
+
+ }
+ else
+ {
+ @* Add mode: multi-row table *@
+
+
+ Add Row
+
+ }
+
@if (!string.IsNullOrEmpty(partErrorMessage))
{
@partErrorMessage
@@ -164,7 +209,14 @@ else
@@ -291,6 +343,8 @@ else
private JobPart? editingPart;
private string? partErrorMessage;
private MaterialShape? selectedShape;
+ private int partSelectedMaterialId;
+ private List
partRows = new();
// Stock form
private bool showStockForm;
@@ -541,15 +595,28 @@ else
editingPart = null;
newPart = new JobPart { JobId = Id!.Value, Quantity = 1 };
selectedShape = null;
+ partSelectedMaterialId = 0;
+ partRows = new List { new PartRow() };
showPartForm = true;
partErrorMessage = null;
}
private void OnShapeChanged()
{
+ partSelectedMaterialId = 0;
newPart.MaterialId = 0;
}
+ private void AddPartRow()
+ {
+ partRows.Add(new PartRow());
+ }
+
+ private void RemovePartRow(PartRow row)
+ {
+ partRows.Remove(row);
+ }
+
private void EditPart(JobPart part)
{
editingPart = part;
@@ -564,6 +631,8 @@ else
SortOrder = part.SortOrder
};
selectedShape = part.Material?.Shape;
+ partSelectedMaterialId = part.MaterialId;
+ partRows.Clear();
showPartForm = true;
partErrorMessage = null;
}
@@ -584,31 +653,59 @@ else
return;
}
- if (newPart.MaterialId == 0)
+ if (partSelectedMaterialId == 0)
{
partErrorMessage = "Please select a size";
return;
}
- if (newPart.LengthInches <= 0)
+ if (editingPart != null)
{
- partErrorMessage = "Length must be greater than zero";
- return;
- }
+ // Edit mode: single part
+ if (newPart.LengthInches <= 0)
+ {
+ partErrorMessage = "Length must be greater than zero";
+ return;
+ }
+ if (newPart.Quantity < 1)
+ {
+ partErrorMessage = "Quantity must be at least 1";
+ return;
+ }
- if (newPart.Quantity < 1)
- {
- partErrorMessage = "Quantity must be at least 1";
- return;
- }
-
- if (editingPart == null)
- {
- await JobService.AddPartAsync(newPart);
+ newPart.MaterialId = partSelectedMaterialId;
+ await JobService.UpdatePartAsync(newPart);
}
else
{
- await JobService.UpdatePartAsync(newPart);
+ // Add mode: multiple rows
+ for (int i = 0; i < partRows.Count; i++)
+ {
+ var row = partRows[i];
+ if (row.LengthInches <= 0)
+ {
+ partErrorMessage = $"Row {i + 1}: Length must be greater than zero";
+ return;
+ }
+ if (row.Quantity < 1)
+ {
+ partErrorMessage = $"Row {i + 1}: Quantity must be at least 1";
+ return;
+ }
+ }
+
+ foreach (var row in partRows)
+ {
+ var part = new JobPart
+ {
+ JobId = Id!.Value,
+ MaterialId = partSelectedMaterialId,
+ LengthInches = row.LengthInches,
+ Quantity = row.Quantity,
+ Name = row.Name ?? string.Empty
+ };
+ await JobService.AddPartAsync(part);
+ }
}
job = (await JobService.GetByIdAsync(Id!.Value))!;
@@ -931,113 +1028,158 @@ else