From 14fd3ba8909b40266ced24b247dd908b656e550e Mon Sep 17 00:00:00 2001 From: Michele Bigi Date: Fri, 11 Sep 2026 07:48:28 +0200 Subject: [PATCH] Show BOM, schematic, and PCB as three upload boxes on the first wizard screen. The extra board step made the flow look like only two files were required. Co-authored-by: Cursor --- frontend/content/changelog.md | 6 ++ frontend/package.json | 2 +- .../dashboard/create-project-dialog.tsx | 86 ++++++------------- frontend/src/lib/version.ts | 2 +- 4 files changed, 35 insertions(+), 61 deletions(-) diff --git a/frontend/content/changelog.md b/frontend/content/changelog.md index 5680749..08da673 100644 --- a/frontend/content/changelog.md +++ b/frontend/content/changelog.md @@ -2,6 +2,12 @@ What's new in Pinscope. +## 2.26.2 — 2026-09-11 — Three file boxes + +New project: BOM, schematic, and PCB on the first screen. PCB is optional. + +- [Changed] No extra wizard step for the board. + ## 2.26.1 — 2026-09-11 — Ask for the KiCad board The create-project wizard has a dedicated PCB step (skip still allowed). Report load errors show the API detail instead of a generic fetch failure. diff --git a/frontend/package.json b/frontend/package.json index c309ec1..57f9202 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "2.26.1", + "version": "2.26.2", "private": true, "scripts": { "sync-version": "node scripts/sync-version.mjs", diff --git a/frontend/src/components/dashboard/create-project-dialog.tsx b/frontend/src/components/dashboard/create-project-dialog.tsx index b67dc52..ffa5ad2 100644 --- a/frontend/src/components/dashboard/create-project-dialog.tsx +++ b/frontend/src/components/dashboard/create-project-dialog.tsx @@ -352,7 +352,6 @@ function summarizeLcscModel(model: Record): string { type WizardStep = | "details" - | "pcb" | "columns" | "subdesigns" | "lcsc-passives" @@ -362,7 +361,6 @@ type WizardStep = const ALL_STEPS: { key: WizardStep; label: string }[] = [ { key: "details", label: "Project Details" }, - { key: "pcb", label: "Board (optional)" }, { key: "columns", label: "BOM Columns" }, { key: "subdesigns", label: "Sub-designs" }, { key: "lcsc-passives", label: "Resolving Passive Specs" }, @@ -592,9 +590,6 @@ export function CreateProjectDialog({ const [netlistFiles, setNetlistFiles] = useState([]); const netlistFile = netlistFiles[0] ?? null; const [pcbFile, setPcbFile] = useState(null); - const skipPcbStep = - Boolean(pcbFile) || - netlistFiles.some((f) => f.name.toLowerCase().endsWith(".zip")); const [netlistNetCount, setNetlistNetCount] = useState(null); const [netlistError, setNetlistError] = useState(null); @@ -885,7 +880,6 @@ export function CreateProjectDialog({ // lcsc-passives drains to zero before the auto-advance effect // moves us off the step on the next tick). if (s.key === step) return true; - if (s.key === "pcb") return !skipPcbStep; if (s.key === "subdesigns") return hasSubdesignChoice; if (s.key === "lcsc-passives") return hasLcscPassives; if (s.key === "datasheets") return hasIcs; @@ -893,7 +887,7 @@ export function CreateProjectDialog({ if (s.key === "passives") return hasPassives; return true; }); - }, [step, skipPcbStep, hasSubdesignChoice, hasLcscPassives, hasIcs, hasSimple, hasPassives]); + }, [step, hasSubdesignChoice, hasLcscPassives, hasIcs, hasSimple, hasPassives]); const stepIndex = activeSteps.findIndex((s) => s.key === step); @@ -928,9 +922,8 @@ export function CreateProjectDialog({ }, []); const handleNetlistChange = useCallback((incoming: File[]) => { - const { netlist, pcb, bom } = splitProjectFiles(incoming); + const { netlist, pcb } = splitProjectFiles(incoming); if (pcb[0]) setPcbFile(pcb[0]); - if (bom[0]) handleBomChange([bom[0]]); const files = netlist; const file = files[0] || null; setNetlistFiles(files); @@ -976,7 +969,7 @@ export function CreateProjectDialog({ ); } }); - }, [handleBomChange]); + }, []); const resetAndClose = useCallback(() => { setOpen(false); @@ -1746,7 +1739,6 @@ export function CreateProjectDialog({ const canAdvance = (): boolean => { if (step === "details") return !!(name.trim() && bomFile && netlistFile && !netlistError); - if (step === "pcb") return true; if (step === "columns") return !!(refCol && mpnCol); if (step === "subdesigns") return !!(selectedSubdesignIds && selectedSubdesignIds.size > 0); @@ -1787,9 +1779,6 @@ export function CreateProjectDialog({ const res = await runEarlyNetlistUpload(); if (!res.ok) return; } - setStep(skipPcbStep ? "columns" : "pcb"); - } - else if (step === "pcb") { setStep("columns"); } else if (step === "columns") { @@ -1867,8 +1856,7 @@ export function CreateProjectDialog({ const goBack = () => { setError(null); - if (step === "pcb") setStep("details"); - else if (step === "columns") setStep(skipPcbStep ? "details" : "pcb"); + if (step === "columns") setStep("details"); else if (step === "subdesigns") setStep("columns"); else if (step === "lcsc-passives") { if (hasSubdesignChoice) setStep("subdesigns"); @@ -2046,7 +2034,7 @@ export function CreateProjectDialog({ )} @@ -2124,7 +2112,7 @@ export function CreateProjectDialog({ onKeyDown={(e) => e.key === "Enter" && canAdvance() && goNext()} /> -
+

- CSV or Excel.{" "} - - How to export → - + .csv or .xlsx

@@ -2159,48 +2139,36 @@ export function CreateProjectDialog({

) : netlistNetCount !== null ? (

- {netlistNetCount} nets detected -

- ) : netlistFiles.length > 0 ? ( -

- {pcbFile - ? "Board included." - : netlistFiles.length > 1 - ? `${netlistFiles.length} schematic files.` - : "Ready."} + {netlistNetCount} nets

) : (

- Drop the KiCad folder, or one netlist.{" "} - - How to export → - + Netlist or .kicad_sch

)}
+
+ { + const picked = splitProjectFiles(files).pcb[0] ?? files[0] ?? null; + setPcbFile( + picked?.name.toLowerCase().endsWith(".kicad_pcb") + ? picked + : null, + ); + }} + /> +

+ Optional .kicad_pcb +

+
)} - {step === "pcb" && ( -
-

- Optional. Skip if you only want schematic review. -

- setPcbFile(files[0] ?? null)} - /> -
- )} - {/* ---- Step 2: BOM Columns ---- */} {step === "columns" && csvData && (
diff --git a/frontend/src/lib/version.ts b/frontend/src/lib/version.ts index 672eb8b..0b1e231 100644 --- a/frontend/src/lib/version.ts +++ b/frontend/src/lib/version.ts @@ -1,4 +1,4 @@ // AUTO-GENERATED by scripts/sync-version.mjs from content/changelog.md. // Do not edit by hand — change the top "## X.Y.Z" heading in the changelog. -export const APP_VERSION = "2.26.1"; +export const APP_VERSION = "2.26.2"; export const APP_VERSION_DATE = "2026-09-11";