Name is now required (it's the only thing identifying what got saved),
and printing is an explicit separate choice instead of an implicit
side-effect of naming something.
- Saved labels/receipts now show on one page instead of split across
Shipping labels and Receipts, each with a badge for its type/printer,
Edit (name+content, in place), Print, and Delete.
- ZPL labels get a real visual preview via Labelary's public render API;
ESC/POS ones show their raw content (no good general preview for that).
- The Receipts free-text field only ever encoded whatever was typed as
literal printable characters -- pasting mnemonic ESC/POS notation
(ESC/GS/LF as command names, 0xNN as raw bytes) just printed as text
instead of being interpreted. Added a small line-based parser for that
notation (ReceiptBuilder#raw appends already-resolved bytes verbatim),
verified byte-for-byte against an example with align/bold/barcode/cut.
- Home page is now just the print server overview, no more unrelated
network links (3D printers, Cockpit) left over from when this was a
general landing page.
- Navbar shows which section is active; Brother's per-printer buttons
now live under a dedicated Brother nav item instead of always-visible.
- Shipping labels: paste raw ZPL directly (no need to save to a file
first), with a Labelary preview link alongside it.
- Receipts: paste already-formatted ESC/POS text directly, printed as-is.
- Both can save what they just printed into a shared label repository
(lib/label_repository.rb, one JSON file per label under data/labels/)
for reprinting later -- saving happens independently of whether the
print itself succeeds, so a failed/offline printer doesn't lose the
content.
Custom ReceiptBuilder instead of the escpos gem -- its diacritics handling
needed the same manual UTF-8->CP852 encode call anyway, based on earlier
experiments in ~/test/epson/.
Drops /brother/select and the session-based "active printer" state:
the printer key now lives in the path (/brother/<printer>/*), so the
proxy is stateless and any path under it -- including brother_ql_web's
API, not just its UI -- is reachable without a prior "activation" step.