Files
brewpi/web/TODO.md
T
jensandClaude Sonnet 4.6 83fd16e46c Add Sud New/Load/Save and Start/Stop to the browser client
Ports on_action_sud_new/_save/_load() and on_action_sud_start/_stop()
from client/brewpi_gui.py: Load/Save stand in for the native file
dialogs with <input type="file">/FileReader and a Blob/<a download>,
New sends the same hardcoded empty-doc Load, and Start/Stop are gated
by updateSudActions() mirroring update_sud_actions()'s enabled/disabled
logic. Also fixes the status line's step number being one below what
the Progress tab's plates show for the same step (same bug just fixed
in the desktop client).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0189FkmyJkY77HqsNomr1DwV
2026-06-25 00:08:30 +02:00

75 lines
4.2 KiB
Markdown

# web/ (browser client) vs. client/brewpi_gui.py parity backlog
`web/app.js` ported the Manual tab's direct controls and the Progress tab
wholesale from `client/brewpi_gui.py` (see README.md's "Browser client").
Everything below is what that v1 pass deliberately left out - either
flagged as deferred in the plan, or only noticed once the port was done
and checked against the Qt source side by side.
- [x] **No way to actually run a brew.** ~~There's no Start/Pause/Stop/
Confirm anywhere in `web/index.html`~~ Start/Stop are now wired up
(`btn-sud-start`/`btn-sud-stop` in `app.js`, gated by `updateSudActions()`
mirroring `update_sud_actions()`'s enabled/disabled logic). Still
missing: Pause, and `{"Sud": {"Confirm": true}}` - that one needs
`sudUserMessage`/`sudState` (next item) to know *when* it's actually
waiting on one.
- [ ] **`WAIT_USER` never surfaces to the user.** `sudUserMessage` is
tracked in `app.js` but nothing ever shows it - `show_user_message()`
(`client/brewpi_gui.py:877-882`) pops a modal the instant `WAIT_USER` is
newly entered (`prev_state != WAIT_USER`) and sends `Confirm` itself
when the user dismisses it. Needs the same "newly entered" edge
detection in `onSudChanged()`'s `State` branch (the `wasRunning`
tracking there is close, but checks running-vs-not, not specifically
the `WAIT_USER` transition) plus a modal (a plain `<dialog>` works,
no library needed) that sends `Confirm` on close.
- [x] **No schedule management.** New/Load/Save are now wired up in
`app.js`: Load is `<input type="file">` + `FileReader` +
`{"Sud": {"Load": ...}}`; Save sends `{"Sud": {"Save": true}}` and
downloads (`Blob`+`<a download>`) whichever `Json` push answers it
(tracked via `sudSavePending`, mirroring `brewpi_gui.py`'s
`sud_save_path`); New sends the same hardcoded empty-doc `Load` Qt does.
- [ ] **No temperature-controller state/cooldown indicator.** Qt shows
the raw FSM state (`label_state.setText(msg['State'])` - e.g.
`"States.HOLD"`) and a separate blinking "Cool down" label specifically
for `States.COOL` (`set_tc_cooling()`, `client/brewpi_gui.py:820-829`,
driven by `on_tempctrl_changed()`'s `'State'` branch). `app.js`'s
`onTempCtrlChanged()` never reads `msg.State` at all right now - worth
a small label in the Controller panel, reusing the same 500ms
blink-timer pattern the Progress tab's LEDs already have.
- [ ] **No transient status notifications.** Qt's status bar shows
short-lived messages on certain events - e.g. `"Sud schedule updated:
{name}"` for 5s on every `Name` push (`client/brewpi_gui.py:1043-1045`).
`web/`'s status line only ever shows the persistent Sud/env summaries;
there's nowhere for one-shot events to surface at all.
- [ ] **Nothing persists across reloads.** `client/user_config.py` keeps
the last ambient temperature and Sud file-dialog directory in
`~/.config/brewpi/gui.json` across restarts. `web/`'s ambient-temp
field always starts blank until the first `System.AmbientTemp` push;
`localStorage` would be the natural equivalent (and the host field
could remember the last-used server too, which the desktop GUI doesn't
even need since it's one app per machine).
- [ ] **No reconnect handling.** A dropped WebSocket (`ws.onclose`) just
flips the UI to "Disconnected" and stops - the user has to click
Connect again by hand. `WsClient` (`ws/client/ws_client.py`, used by
the desktop GUI) - check whether it already retries and mirror that, or
add a simple backoff retry loop in `connect()`.
- [ ] **Automatic tab (forecast-vs-actual plot) and Plot tab (live strip
charts) don't exist.** Flagged in the original plan and in README.md's
"Browser client" section as deferred pending a charting decision, not
an oversight - listed here too so this file alone is a complete picture
of the gap. `SudForecastPlot`/`RealtimePlot`
(`client/brewpi_gui.py:121-258`) are the reference for what each needs
to show.
- [ ] **No authentication.** Also already called out in README.md - matches
the WebSocket server's own complete lack of it, not a new gap, but
worth a line here too since "browser, reachable from anywhere on the
network" is a wider exposure than the desktop app ever was.