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
4.2 KiB
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.
-
No way to actually run a brew.
There's no Start/Pause/Stop/ Confirm anywhere inStart/Stop are now wired up (web/index.htmlbtn-sud-start/btn-sud-stopinapp.js, gated byupdateSudActions()mirroringupdate_sud_actions()'s enabled/disabled logic). Still missing: Pause, and{"Sud": {"Confirm": true}}- that one needssudUserMessage/sudState(next item) to know when it's actually waiting on one. -
WAIT_USERnever surfaces to the user.sudUserMessageis tracked inapp.jsbut nothing ever shows it -show_user_message()(client/brewpi_gui.py:877-882) pops a modal the instantWAIT_USERis newly entered (prev_state != WAIT_USER) and sendsConfirmitself when the user dismisses it. Needs the same "newly entered" edge detection inonSudChanged()'sStatebranch (thewasRunningtracking there is close, but checks running-vs-not, not specifically theWAIT_USERtransition) plus a modal (a plain<dialog>works, no library needed) that sendsConfirmon close. -
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>) whicheverJsonpush answers it (tracked viasudSavePending, mirroringbrewpi_gui.py'ssud_save_path); New sends the same hardcoded empty-docLoadQt 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 forStates.COOL(set_tc_cooling(),client/brewpi_gui.py:820-829, driven byon_tempctrl_changed()'s'State'branch).app.js'sonTempCtrlChanged()never readsmsg.Stateat 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 everyNamepush (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.pykeeps the last ambient temperature and Sud file-dialog directory in~/.config/brewpi/gui.jsonacross restarts.web/'s ambient-temp field always starts blank until the firstSystem.AmbientTemppush;localStoragewould 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 inconnect(). -
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.