|
1 | | -# Worklog — v1.8.9 (in progress) |
| 1 | +# Worklog — v1.8.10 (in progress) |
2 | 2 |
|
3 | 3 | ## Added |
4 | | -- Creality LAN discovery in the "Add printer → Scan" flow — mirrors the mobile Flutter scanner and the existing Snapmaker/FlashForge desktop flows. Choice modal (Scan vs Manual), live LAN scan panel with one-click add, and manual-IP probe. Two-stage probe: fast TCP `:9999` port-open filter in the main process, then a renderer WebSocket handshake (`get printerInfo`, heartbeat-aware frame accumulation, `isCrealityLike` validation) — unconfirmed hosts are dropped. Common Creality subnets (192.168.1, 192.168.40) always scanned; user extra subnets persisted in localStorage so they survive a Restart scan. Logs a clear error in the debug scan log when the IPC bridge isn't loaded (app needs a full relaunch). `cre:tcp-probe` IPC + `creTcpProbe` preload bridge — `main.js`, `preload.js`, `renderer/printers/creality/probe.js`, `renderer/printers/creality/add-flow.js`, `renderer/inventory.js` |
| 4 | +- `icon_cloud_3d.svg` icon asset + `.icon-cloud-3d` mask class — `assets/svg/icons/icon_cloud_3d.svg`, `renderer/css/70-detail-misc.css` |
| 5 | +- Storage view: the hover tooltip on a rack slot now shows the spool's **material image** (TigerTag+ `url_img`) as a **full-height left column**, with all the existing tooltip content (puck + brand/material/color/coord + weight bar + locked indicator) flowing in a right column. Falls back to the previous single-column layout when the spool has no image or the URL fails to load — `renderer/inventory.js` (`buildRackTooltipHTML`), `renderer/css/30-racks.css` (`.rht-row`, `.rht-col`, `.rht-mat-img`) |
| 6 | +- Bambu Lab LAN discovery in the "Add printer → Scan" flow — SSDP multicast `M-SEARCH` on `239.255.255.250:1900` (`urn:bambulab-com:device:3dprinter:1`, two paced probes + 4 s listen for unsolicited NOTIFYs), parses `DevModel/DevName/DevVersion/USN` headers into a candidate (ip, serial, model, name) for one-click add. Manual "Add by IP" uses a TLS cert sniff on `:8883` (subject/issuer contains `bambu`/`bbl`) to confirm. Maps DevModel codes + serial-prefixes onto the bbl printer catalog. `bambu:ssdp-discover` + `bambu:tls-probe` IPC + `bambulabSsdpDiscover`/`bambulabTlsProbe` preload bridges — `main.js`, `preload.js`, `renderer/printers/bambulab/probe.js`, `renderer/printers/bambulab/add-flow.js`, `renderer/inventory.js` |
| 7 | +- Elegoo LAN discovery in the "Add printer → Scan" flow — UDP unicast spray of `{"id":0,"method":7000}` to every host:52700 across the local `/24` prefixes (incl. common Elegoo subnets `192.168.1.x`/`192.168.40.x` + persisted user extras), 2.4 s listen, parses the JSON reply (sn, machine_model, host_name) into a candidate. Manual "Add by IP" sends the same payload twice 60 ms apart. Maps `machine_model` onto the eleg catalog (Centauri Carbon 2). `elegoo:udp-discover` + `elegoo:udp-probe` IPC + `elegooUdpDiscover`/`elegooUdpProbe` preload bridges — `main.js`, `preload.js`, `renderer/printers/elegoo/probe.js`, `renderer/printers/elegoo/add-flow.js`, `renderer/inventory.js` |
5 | 8 |
|
6 | 9 | ## Changed |
7 | | -- Creality printer settings: `Root` account + password are now optional (were required). Most Creality printers — incl. the Ender-3 V4 — expose the WebSocket without auth and the live driver connects fine with empty credentials — `renderer/printers/creality/settings.js` |
8 | | -- Friend (read-only) view now hides the write-action buttons (`+ Scan` and `Add product` / `Add device`) — they can't act on a friend's docs — `renderer/inventory.js` (`renderFriendBanner`) |
| 10 | +- Header backend-health indicator now uses the 3D cloud icon (`.icon-cloud-3d`); the other 8 `.icon-cloud` usages (brand "no connection" states, scan extra-subnets) are unchanged — `renderer/inventory.html` |
| 11 | +- Printers are reported online only once the connection is **really established** — i.e. after the first real frame/report/heartbeat is received — not the instant the transport socket opens. A connection attempt (`connecting`) now counts as offline everywhere, across all brands. Snapmaker & Creality flip to connected on the first WS frame (was: on WS open); Bambu & Elegoo on the first MQTT report (was: on broker connect); FlashForge already did this (first `/detail` poll). Elegoo `isOnline` also no longer returns "checking" for an in-flight attempt — `renderer/printers/{snapmaker,creality,bambulab,elegoo}/index.js` |
| 12 | +- Elegoo printer settings: the MQTT access code field is now **required** (was optional) and renamed from "MQTT password (optional)" to **"Access code"** — matches the label the printer's network-settings screen actually uses. Reuses the shared `printerLblAccessCode` string so the UI is consistent with Bambu. Hint updated to point at the printer's network settings (default still 123456) — `renderer/printers/elegoo/settings.js`, `renderer/locales/*.json` (`printerHintElegooMqtt`) |
| 13 | +- Printer Settings form is cleaner: the "Credentials" section header is no longer rendered across all brand forms (Bambu, Creality, Elegoo, FlashForge). The credentials fields still group together visually under the Connection block, but without an extra header label cluttering a short form. `renderSection()` now skips the header when a section has no `titleKey` — `renderer/printers/modal-helpers.js`, `renderer/printers/{bambulab,creality,elegoo,flashforge}/settings.js` |
| 14 | +- Removed the horizontal divider line between sections in Printer Settings (`.pba-section + .pba-section` border). Identity, connection, credentials all belong to the same connection setup and should read as one continuous form — the divider made them look like separate cards. Vertical spacing is preserved — `renderer/css/40-printers.css` |
9 | 15 |
|
10 | 16 | ## Fixed |
| 17 | +- Absolute-positioned icon buttons (password-eye on the printer-settings form `.pba-input-eye`, password-eye in the login modal `.lm-eye`, input-clear in the add-printer form `.adp-input-clear`) visibly jumped ~14 px down when clicked. The global `button:active { transform: translateY(1px); }` rule was overwriting each button's centering `transform: translateY(-50%)`. Each now has a dedicated `:active` override that re-applies the centering while keeping a 1 px press feedback — `renderer/css/40-printers.css`, `renderer/css/60-modals.css` |
| 18 | +- Printer-settings `.pba-input` (Bambu access code, Creality password, every secret field) silently changed size when the eye toggle flipped `type="password"` → `type="text"`: text grew from 13 → 14 px and the box from 36 → 40 px. A global `input[type="text"]` rule (60-modals.css L1354, specificity 0,1,1) was outranking `.pba-input` (0,1,0), and that global rule doesn't match `input[type="password"]` — so the two modes rendered differently. Doubled-selector overrides (`.pba-input.pba-input`, specificity 0,2,0) re-assert height/padding/font-size; the field now stays exactly the same dimension whether the password is hidden or shown — `renderer/css/40-printers.css` |
| 19 | +- **RFID rescan no longer wipes user-edited spool data, and the spool weight now syncs back onto the chip instead of being rolled back to a stale value.** The upsert previously did a full `set()` on the inventory doc on every rescan, erasing every user-edited Firestore field that isn't on the chip (container assignment, custom note, capacity, etc.) AND replacing the current `weight_available` with the chip's `measure_available_gr`. But the slider that updates the weight only writes to the DB — nothing ever writes it back to the chip — so the chip's value is almost always stale. Three-part fix: (1) switched to `set(..., { merge: true })` so user-edits survive; (2) weight is now only seeded from the chip on a **fresh write** (new chip, or after the intentional clean-slate delete on chip rewrite) — on a regular rescan the DB stays authoritative; (3) **auto-sync at scan**: when the DB weight differs from the chip's value, the app fires a surgical RFID write that rebuilds the payload from the Firestore doc and updates only page 0x17 (`Measure Available`, u24 BE) on the tag — fire-and-forget while the chip is still on the reader, so chip and DB converge automatically. New chips and chip-rewrite paths are unchanged — `renderer/inventory.js` (`_writeChipDoc` + RFID upsert loop) |
11 | 20 |
|
12 | 21 | ## Removed |
13 | 22 |
|
14 | 23 | ## i18n |
15 | | -- Added: `creAddChoiceTitle`, `creScanEmpty` — 9 locales (all other scan UI strings reuse the shared `snap*` keys) |
| 24 | +- Added: `bambuAddChoiceTitle`, `elegooAddChoiceTitle`, `bambuScanEmpty`, `elegooScanEmpty` — 9 locales (all other scan UI strings reuse the shared `snap*` keys) |
0 commit comments