This commit is contained in:
2026-03-23 17:12:35 -05:00
parent 92328713f4
commit d59a0a563d
9 changed files with 346 additions and 40 deletions

View File

@@ -1,7 +1,12 @@
import { addKitComponent, buildAssembly } from "@/lib/actions";
import { getAssembliesWithComponents, getParts } from "@/lib/repository";
export default function AssembliesPage() {
export default async function AssembliesPage({
searchParams
}: {
searchParams?: Promise<{ error?: string; success?: string }>;
}) {
const params = (await searchParams) ?? {};
const parts = getParts();
const assemblies = parts.filter((part) => part.kind === "assembly");
const components = parts.filter((part) => part.kind === "part");
@@ -9,6 +14,8 @@ export default function AssembliesPage() {
return (
<div className="grid">
{params.error ? <section className="panel"><p className="muted" style={{ color: "var(--danger)" }}>{params.error}</p></section> : null}
{params.success ? <section className="panel"><p className="muted" style={{ color: "var(--success)" }}>{params.success}</p></section> : null}
<section className="two-up">
<article className="panel">
<h2 className="section-title">Bill of Materials</h2>
@@ -16,26 +23,26 @@ export default function AssembliesPage() {
<form action={addKitComponent} className="form-grid">
<div className="form-row">
<label htmlFor="assemblySku">Assembly SKU</label>
<select className="select" id="assemblySku" name="assemblySku">{assemblies.map((assembly) => <option key={assembly.id} value={assembly.sku}>{assembly.sku} - {assembly.name}</option>)}</select>
<select className="select" id="assemblySku" name="assemblySku" disabled={assemblies.length === 0}>{assemblies.map((assembly) => <option key={assembly.id} value={assembly.sku}>{assembly.sku} - {assembly.name}</option>)}</select>
</div>
<div className="form-row">
<label htmlFor="componentSku">Component SKU</label>
<select className="select" id="componentSku" name="componentSku">{components.map((component) => <option key={component.id} value={component.sku}>{component.sku} - {component.name}</option>)}</select>
<select className="select" id="componentSku" name="componentSku" disabled={components.length === 0}>{components.map((component) => <option key={component.id} value={component.sku}>{component.sku} - {component.name}</option>)}</select>
</div>
<div className="form-row"><label htmlFor="component-qty">Quantity Per Assembly</label><input className="input" id="component-qty" name="quantity" type="number" min="0.01" step="0.01" defaultValue="1" /></div>
<button className="button" type="submit">Save Component</button>
<button className="button" type="submit" disabled={assemblies.length === 0 || components.length === 0}>Save Component</button>
</form>
</article>
<article className="panel">
<h2 className="section-title">Build Assembly</h2>
<p className="section-copy">Consume component stock and create finished kit inventory in one transaction flow.</p>
<p className="section-copy">Consume component stock and create finished kit inventory in one transaction flow. This only works after the assembly has a BOM and enough component stock exists.</p>
<form action={buildAssembly} className="form-grid">
<div className="form-row">
<label htmlFor="build-assembly">Assembly SKU</label>
<select className="select" id="build-assembly" name="assemblySku">{assemblies.map((assembly) => <option key={assembly.id} value={assembly.sku}>{assembly.sku} - {assembly.name}</option>)}</select>
<select className="select" id="build-assembly" name="assemblySku" disabled={assemblies.length === 0}>{assemblies.map((assembly) => <option key={assembly.id} value={assembly.sku}>{assembly.sku} - {assembly.name}</option>)}</select>
</div>
<div className="form-row"><label htmlFor="build-qty">Build Quantity</label><input className="input" id="build-qty" name="quantity" type="number" min="1" step="1" defaultValue="1" /></div>
<button className="button secondary" type="submit">Build Now</button>
<button className="button secondary" type="submit" disabled={assemblies.length === 0}>Build Now</button>
</form>
</article>
</section>