Apply four low-risk fixes from final code review of the consolidated
add-stock modal: reset newStock on modal close, dedupe stock-item
loading through the existing helper, correct stale empty-state copy
about inventory fallback, and remove a stray blank line left from the
old form deletion.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Editing an inventory-sourced job stock row opened the Edit Stock modal
with the Stock Length dropdown blank instead of showing the row's
current length. EditStock() correctly set newStock.StockItemId from
the row, but then called the fire-and-forget OnStockMaterialChanged(),
which (a) unconditionally reset StockItemId to null, and (b) never
triggered a re-render since its Task wasn't awaited by the event
handler pipeline. Made EditStock async and await a dedicated loader
that populates availableStockItems without touching StockItemId, so
Blazor re-renders once the candidate lengths arrive.
Found during Task 2 manual verification of the unified Add Stock
modal (Step 6).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Replaces the three separate surfaces (bulk import modal, inline custom-length
form, inline edit forms) with one "Add Stock" button and modal that handles
both add and edit, for both inventory-sourced and custom-length stock.
Three small leftovers from Task 7 / the inventory-quantity-tracking
removal that a final review caught:
- Edit.razor's custom-stock quantity input still had min="1" even
though its own helper text says "Use -1 for unlimited", validation
already accepts -1, and the add-form defaults Quantity to -1 - so
the field rendered pre-populated with a value the browser's native
min validation flagged as invalid. Matches the min="-1" fix already
applied to the catalog-stock input in Task 7.
- optimize_job's MCP tool description still claimed the optimizer
falls back to "available inventory" when no stock is configured -
that auto-discovery fallback was removed in Task 3. An LLM reads
this description as ground truth, so stale wording here actively
misleads tool use. Also tightened add_job_stock's stockItemId/
isCustomLength wording, which still said "inventory" for what is
now just the stock catalog.
- CLAUDE.md's CutListPackingService summary said InStockBins comes
"from inventory", nudging future readers back toward the
auto-discovery mental model this plan removed.
Custom-length job stock already supported -1 (unlimited); catalog-
sourced stock only allowed >= 1. Closes that inconsistency per
docs/superpowers/specs/2026-08-01-remove-inventory-quantity-tracking-design.md.
Also updates the Results tab's unplaced-items message now that
insufficient configured quantity is a normal cause, not an edge case.
First step of removing inventory quantity tracking (see
docs/superpowers/specs/2026-08-01-remove-inventory-quantity-tracking-design.md).
UI no longer shows on-hand counts or offers transaction entry; the
underlying field/service methods are removed in follow-up commits.
Adds a Dockerfile and Gitea Actions workflow to build/push the
CutList.Web image to the registry on push to master, enabling
containerized deployment to forge. Also updates CLAUDE.md to reflect
the CutList.Mcp project, REST API surface, and CatalogService, and
tweaks the cut-length badge styling in the job editor.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Drop the Stock/Purchase source badge column from the results cut list
table (purchase list card remains). Bump cut length badges to fs-6 for
better readability.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Display raw inches in parentheses next to the architectural format
in both Parts and Stock tables for easier reference.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wrap job editor initialization in try/catch to display errors instead of
crashing the circuit. Make LoadSavedResults async. Add a simple Error
page for the production exception handler.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Part form now supports adding multiple parts at once via a table with
add/remove row controls; edit mode stays single-row
- Shape and size dropdowns lock when editing an existing part
- Results tab replaces split in-stock/purchase cards with a unified table
per material showing source badges (Stock/Purchase) for each bar
- New Purchase List card summarizes materials to order with quantities
- Print styles use repeating thead headers per material for multi-page
cut lists; large cards can now break across pages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move optimization results UI from separate Results.razor page into
the Edit.razor tabbed editor. Results are now loaded from saved JSON
on page load instead of re-running on every visit. Remove the
standalone optimize button from Jobs index.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add "Add to Order List" button on Results page that creates PurchaseItems
from optimization results and locks the job. Add Orders Index page with
tabbed view (Pending/Ordered/All), supplier assignment, status
transitions, and MaterialFilter. Add manual order item creation page.
Add Orders link to navigation menu.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Locked jobs show a warning banner with unlock button on the Edit page.
All form fields, part/stock add/edit/delete buttons are disabled via
fieldset when locked. Jobs Index shows a lock icon badge next to locked
job numbers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The print CSS was hiding all .card elements, which contained the
actual results content. Replaced with compact print-friendly styles:
summary cards display as an inline row, redundant stock summary is
hidden, and spacing is tightened throughout.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Integrate MaterialFilter component for filtering by shape,
type, grade, and free-text search. Pagination now reflects
filtered results.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use Bootstrap Icons for Edit, Delete, Copy, and Optimize actions
to reduce table column widths and improve visual consistency.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Integrate Pager component into Jobs, Materials, Stock, Suppliers,
and Tools index pages with a page size of 25. Handles page
adjustment on delete when the last page becomes empty.
Also removes the Description column from the Materials table.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shared Blazor component with page windowing, ellipsis for large
page counts, and "Showing X-Y of Z" summary text.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds brief explanatory paragraphs to Jobs, Materials, and Stock index
pages to help users understand each section's purpose.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allows importing multiple stock items from inventory at once, matching
against materials already in the job's parts list. Includes select
all/none, quantity, and priority controls.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Disable Shape dropdown on existing materials since changing shape would
require completely different dimension properties.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace inline part form with Bootstrap modal dialog for better UX
- Add SortOrder to material dropdown ordering in Parts and Stock tabs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Navigation:
- Rename Projects to Jobs in NavMenu
- Add new icon for multi-material boxes
Home page:
- Update references from Projects to Jobs
Materials pages:
- Add Type and Grade columns to index
- Shape-specific dimension editing with typed inputs
- Error handling with detailed messages
Stock pages:
- Show Shape, Type, Grade, Size columns
- Display QuantityOnHand with badges
Shared components:
- LengthInput: Add nullable binding mode for optional dimensions
- LengthInput: Format on blur for better UX
- CutListReport: Update for Job model references
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove files superseded by the Job model:
- Project, ProjectPart entities (replaced by Job, JobPart, JobStock)
- ProjectService (replaced by JobService)
- Projects UI pages (replaced by Jobs pages)
- MaterialStockLength entity (consolidated into StockItem)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Rename the Project concept to Job for clarity:
- Add Job, JobPart, JobStock entities
- JobStock supports both inventory stock and custom lengths
- Add JobNumber field for job identification
- Add priority-based stock allocation for cut optimization
- Include Jobs UI pages (Index, Edit, Results)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Stock Items index page listing all stock items
- Add Stock Items edit page with supplier offerings management
- Update Suppliers edit page to manage offerings (select from stock
items instead of material+length)
- Add Stock Items navigation link to sidebar
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds printWithTitle function to set document title before printing for
better file naming when saving as PDF.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Updates Results page to display packing results grouped by material,
showing in-stock vs. to-be-purchased breakdown with order summaries.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Redesigns Project Edit with a tabbed interface and adds material
selection (shape -> size) when adding parts. Updates Index to show
customer instead of material.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Extends the Material Edit page with a side panel to manage available
stock lengths, including quantity tracking and CRUD operations.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add a new web-based frontend for cut list optimization using:
- Blazor Server with .NET 8
- Entity Framework Core with MSSQL LocalDB
- Full CRUD for Materials, Suppliers, Projects, and Cutting Tools
- Supplier stock length management for quick project setup
- Integration with CutList.Core for bin packing optimization
- Print-friendly HTML reports with efficiency statistics
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>