Files
bambuddy/backend/app
maziggy 44450a3aa4 fix(vp): gate the slicer's AMS pick behind the toggle and scope its badges (#2700)
Round-3 review of the "Save AMS mapping" PR.

    The queue item's ams_mapping was set unconditionally, on the reasoning that
    honouring the slicer's own pick is a correctness fix rather than a feature.
    It is both. Storing a resolved mapping makes _ensure_ams_mapping return
    early, so _compute_ams_mapping_for_printer never runs — and that function is
    where prefer_lowest_filament lives, along with the AMS-filament-backup gate
    that qualifies it (#1766), the inventory-remain overrides, and the per-slot
    force-colour overrides. Every existing queue-mode VP pointed at a printer
    would have quietly lost all of it on upgrade, without a setting to turn it
    back on.

    So save_ams_mapping now gates the queue item too, not just the archive
    persistence. Off is exactly the old behaviour. The correctness case the PR
    was written for — two spools of the same red PLA, and the slot the user
    picked in the slicer thrown away — is still fixed, for anyone who asks for
    it.

    Force color match wins over it when both are on. Its only effect on a
    fixed-printer item is the filament_overrides written onto the queue item,
    and those are read inside the function a stored mapping skips, so the two
    toggles sitting next to each other on the same card silently cancelled. The
    dispatch now matches strictly, as asked, while the slicer's pick is still
    saved onto the archive — that is what the toggle's name promises, and a
    later reprint is a separate decision from this print. The queue-add fallback
    applies the same rule to a request that carries force-colour overrides.

    A mapping shorter than a plate's highest slot id cannot address that plate's
    own slots, and _ensure_ams_mapping would have kept it anyway, since it only
    rejects an all-unresolved one. Each plate now checks the length it needs and
    falls back to a computed mapping if the array does not reach. Bambu Studio
    sends a file-global array, so this normally never fires; it also means a
    multi-plate Send All degrades safely if that ever stops being true.

    The badges claimed more than they delivered. Both rendered whenever a saved
    mapping existed, ignoring which printer it belonged to, while the tooltips
    promised the reprint would reuse those exact spools — true only on the
    printer the trays were resolved against. The queue row's flag is now
    computed against that row's own printer, which is precisely when dispatch
    reuses the mapping, and the archive card names the printer instead of
    implying any of them will do. It hides itself when that printer no longer
    exists. Retranslated in all 13 locales.

    Frontend tests, which the PR had none of. The printer-scoping rule is now a
    pure function rather than an inline expression, covered for the mismatched
    printer, the no-printer-selected case that would otherwise compare undefined
    against undefined, and malformed extra_data. The toggle's undo bookkeeping
    is covered for unresolved slots, short mappings, and hand-made picks —
    preserved when the toggle never wrote that slot, replaced when it did, which
    is behaviour worth pinning either way.

    Also reverts all three queue-mode switches when a save fails, not just the
    new one; without it the card shows a setting the server rejected.
2026-08-02 09:51:39 +02:00
..
…
…