diff --git a/CutList.Web/Components/Pages/Jobs/Edit.razor b/CutList.Web/Components/Pages/Jobs/Edit.razor
new file mode 100644
index 0000000..16b35a5
--- /dev/null
+++ b/CutList.Web/Components/Pages/Jobs/Edit.razor
@@ -0,0 +1,810 @@
+@page "/jobs/new"
+@page "/jobs/{Id:int}"
+@inject JobService JobService
+@inject MaterialService MaterialService
+@inject StockItemService StockItemService
+@inject NavigationManager Navigation
+@using CutList.Core.Formatting
+@using CutList.Web.Data.Entities
+
+
Loading...
+} +else if (IsNew) +{ + +No parts added yet.
+Add the parts you need to cut, selecting the material for each.
+| Material | +Length | +Qty | +Name | +Actions | +
|---|---|---|---|---|
| @part.Material.DisplayName | +@ArchUnits.FormatFromInches((double)part.LengthInches) | +@part.Quantity | +@(string.IsNullOrWhiteSpace(part.Name) ? "-" : part.Name) | ++ + + | +
No stock configured for this job.
+Add stock from your inventory or define custom lengths.
+If no stock is selected, the optimizer will use all available stock for the materials in your parts list.
+| Material | +Length | +Qty | +Priority | +Source | +Actions | +
|---|---|---|---|---|---|
| @stock.Material?.DisplayName | +@ArchUnits.FormatFromInches((double)stock.LengthInches) | +@(stock.Quantity == -1 ? "Unlimited" : stock.Quantity.ToString()) | +@stock.Priority | ++ @if (stock.IsCustomLength) + { + Custom + } + else + { + Inventory + } + | ++ + + | +
Loading...
+} +else if (jobs.Count == 0) +{ +| Job # | +Name | +Customer | +Cutting Tool | +Last Modified | +Actions | +
|---|---|---|---|---|---|
| @job.JobNumber | +@(job.Name ?? "-") | +@(job.Customer ?? "-") | +@(job.CuttingTool?.Name ?? "-") | +@((job.UpdatedAt ?? job.CreatedAt).ToLocalTime().ToString("g")) | ++ Edit + Optimize + + + | +
Loading...
+} +else if (job == null) +{ +Customer: @job.Customer
+ } +Some items could not be placed. This usually means no stock lengths are configured for the material, or parts are too long.
+Total Stock Bars
+Total Pieces
+Total Waste
+Efficiency
+Ready to cut from existing inventory
+Need to order from supplier
+| # | +Stock Length | +Cuts | +Waste | +
|---|---|---|---|
| @binNumber | +@ArchUnits.FormatFromInches(bin.Length) | ++ @foreach (var item in bin.Items) + { + + @(string.IsNullOrWhiteSpace(item.Name) ? ArchUnits.FormatFromInches(item.Length) : $"{item.Name} ({ArchUnits.FormatFromInches(item.Length)})") + + } + | +@ArchUnits.FormatFromInches(bin.RemainingLength) | +