@page "/" @inject OverviewService OverviewService @using CutList.Core.Formatting CutList - Overview @if (loading) {

Loading overview…

} else {

Production planning

Cut planning at a glance.

See what is moving through the shop and the stock configurations that recur across jobs.

New job All jobs
@if (loadError is not null) { }
Jobs @overview.TotalJobs @overview.OpenJobs open for planning Parts required @overview.TotalParts Across all current jobs Stock options @overview.ActiveStockItems Active catalog lengths

Work queue

Recently created jobs

View all
@if (overview.RecentJobs.Count == 0) {

No jobs yet. Create a job to begin building your planning history.

Create first job
} else { }

Planning signal

Frequently specified stock

Manage stock

Based on stock configured on jobs. This shows recurring planning demand, not on-hand inventory.

@if (overview.FrequentStock.Count == 0) {

Add stock to jobs to reveal the configurations used most often.

} else {
    @for (var stockIndex = 0; stockIndex < overview.FrequentStock.Count; stockIndex++) { var stock = overview.FrequentStock[stockIndex];
  1. @((stockIndex + 1).ToString("D2"))
    @stock.MaterialName @ArchUnits.FormatFromInches((double)stock.LengthInches) stock length
    @stock.JobCount @(stock.JobCount == 1 ? "job" : "jobs")
  2. }
}
} @code { private OverviewSnapshot overview = new(0, 0, 0, 0, [], []); private bool loading = true; private string? loadError; protected override async Task OnInitializedAsync() { try { overview = await OverviewService.GetSnapshotAsync(); } catch (Exception ex) { loadError = $"The dashboard could not connect to its database ({ex.GetType().Name})."; } finally { loading = false; } } }