fix(mesh): failed flash silently bounced back to the picker, hiding the error

The step-3 template's condition for showing the picker vs. the progress/
result view was `!flashJob?.active && flashJob?.stage !== 'done'`. That's
true for "no job started yet" (flashJob is null) — but ALSO true for a job
that just FAILED (active:false, stage:'failed'), since 'failed' !== 'done'.
So a failed flash silently reverted to the family/board picker instead of
showing the failure state (error message + log tail) — reported live as
"it went to the download screen and then back to the flash screen" with no
visible error.

Now shows the picker only when no job has been started yet (`!flashJob`);
once a job exists, the progress/result view is always shown, whether it's
still running, succeeded, or failed — the existing error/log-tail markup in
that view already handles all three, it just wasn't being reached.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
ssmithx 2026-07-23 02:43:10 +00:00
parent 992bf636e0
commit 39e88529b3

View File

@ -108,7 +108,12 @@
<!-- Step 3: erase + reflash destructive, opt-in only --> <!-- Step 3: erase + reflash destructive, opt-in only -->
<div v-else-if="step === 'flash'"> <div v-else-if="step === 'flash'">
<template v-if="!flashJob?.active && flashJob?.stage !== 'done'"> <!-- Once a job exists (started via startFlash), ALWAYS show the
progress/result view below including on failure. The old
condition (`!active && stage !== 'done'`) was also true for a
FAILED job (active:false, stage:'failed'), which silently sent
the user back to this picker instead of showing the error. -->
<template v-if="!flashJob">
<p class="text-white/60 text-xs mb-3"> <p class="text-white/60 text-xs mb-3">
Downloads the latest firmware from upstream and writes it to Downloads the latest firmware from upstream and writes it to
<span class="font-mono text-orange-300">{{ devicePath }}</span>. <span class="font-mono text-orange-300">{{ devicePath }}</span>.