fix(web): truthful operator status and save feedback across the server pages - #317
Merged
Merged
Conversation
Contributor
There was a problem hiding this comment.
Copilot wasn't able to review any files in this pull request.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
dorkmo
added a commit
that referenced
this pull request
Sep 14, 2026
dorkmo
force-pushed
the
website-config-roundtrip-calibration
branch
from
September 14, 2026 14:33
fe3a319 to
ce5c5d7
Compare
dorkmo
force-pushed
the
website-status-and-feedback
branch
from
September 14, 2026 14:33
a9e8d5f to
29a139f
Compare
dorkmo
force-pushed
the
website-config-roundtrip-calibration
branch
from
September 14, 2026 16:22
ce5c5d7 to
4333343
Compare
dorkmo
force-pushed
the
website-status-and-feedback
branch
from
September 14, 2026 16:22
29a139f to
9dc30fb
Compare
dorkmo
force-pushed
the
website-config-roundtrip-calibration
branch
from
September 14, 2026 19:03
4333343 to
d35a73d
Compare
dorkmo
force-pushed
the
website-status-and-feedback
branch
from
September 14, 2026 19:03
9dc30fb to
50b4d9f
Compare
dorkmo
force-pushed
the
website-config-roundtrip-calibration
branch
from
September 14, 2026 19:32
d35a73d to
53c0854
Compare
dorkmo
force-pushed
the
website-status-and-feedback
branch
from
September 14, 2026 19:32
50b4d9f to
a5ca903
Compare
dorkmo
force-pushed
the
website-config-roundtrip-calibration
branch
from
September 14, 2026 19:52
53c0854 to
9aa1ba2
Compare
dorkmo
force-pushed
the
website-status-and-feedback
branch
from
September 14, 2026 19:52
a5ca903 to
688b7cb
Compare
dorkmo
force-pushed
the
website-config-roundtrip-calibration
branch
from
September 14, 2026 20:11
9aa1ba2 to
aa60921
Compare
dorkmo
force-pushed
the
website-status-and-feedback
branch
from
September 14, 2026 20:11
688b7cb to
a94c81c
Compare
dorkmo
force-pushed
the
website-config-roundtrip-calibration
branch
from
September 14, 2026 20:31
aa60921 to
10d60da
Compare
dorkmo
force-pushed
the
website-config-roundtrip-calibration
branch
from
September 14, 2026 21:22
d8a475e to
1b421bb
Compare
dorkmo
force-pushed
the
website-status-and-feedback
branch
from
September 14, 2026 21:22
451bd31 to
80ba638
Compare
dorkmo
force-pushed
the
website-config-roundtrip-calibration
branch
from
September 14, 2026 21:39
1b421bb to
be491d4
Compare
dorkmo
force-pushed
the
website-status-and-feedback
branch
from
September 14, 2026 21:39
80ba638 to
cef08c2
Compare
dorkmo
force-pushed
the
website-config-roundtrip-calibration
branch
from
September 14, 2026 21:55
be491d4 to
f3552d5
Compare
dorkmo
force-pushed
the
website-status-and-feedback
branch
from
September 14, 2026 21:55
cef08c2 to
faeb2ff
Compare
dorkmo
force-pushed
the
website-config-roundtrip-calibration
branch
from
September 14, 2026 22:15
f3552d5 to
9ccd11f
Compare
dorkmo
force-pushed
the
website-status-and-feedback
branch
from
September 14, 2026 22:15
faeb2ff to
2bdaecf
Compare
…r pages
S-W06 (operator status; CLAUDE M-30, M-31, M-41, L-25, L-51):
- Dashboard renders float switches as "Float Switch" with ON/OFF instead
of "Tank Level --" with an inches-per-24h delta and a trend sparkline,
and a level of exactly 0 in reads 0.0" instead of "--".
- An "Update requested" pill now expires after the client's reply window
(10 min grid, 60 min solar); the button comes back as "Retry Update"
with a tooltip, and the 10 s polling stops with the pill.
- /api/clients no longer overwrites the client-level alarm type with the
newest sensor's (a multi-sensor client showed "ALARM: clear").
- Site Config keeps the fault string and mA the server sends, so its FAULT
badge and mA readout work; float switches read ON/OFF there too.
- The outdated-client count uses the existing compareFirmwareVersions()
so clients running newer firmware than the release are not "outdated".
- Client Console deletion asks for confirmation instead of a PIN prompt;
the server validates the session, not the PIN, for that request.
S-W07 (logs, save feedback, secondary APIs; CLAUDE M-26, M-27, M-57,
M-58, M-61, L-18, L-19, L-20, L-21, L-22, L-49):
- Transmission Log filter options are built from the vocabulary
logTransmission() emits plus whatever the loaded entries contain
("error" was unreachable; two options matched nothing), and the CSV
export uses the same filter as the table, including the detail search.
- Contacts and Server Settings report a saved:false reply as an error
(in memory only, lost at reboot) instead of "saved successfully".
- GitHub route alias, FTP user and FTP password are rejected with a 400
when longer than 31 characters instead of being truncated silently;
the inputs carry maxlength=31.
- GET /api/location decodes the client parameter, so real dev: UIDs no
longer always read "Not yet received" on the Client Console.
- Year-over-year history splits the sensor key at the last colon.
- Login shows the server's reason (lockout countdown, first-login setup)
for anything other than a 401.
- Config Generator: opening ?uid= for a client with no snapshot starts a
new configuration instead of an error; at most 8 sensors can be added
or collected, and handleConfigPost rejects more; the daily report time
is not computed from a guessed 05:00 UTC when the contacts schedule has
not loaded (the load is retried and the download refused until then).
- Server Settings loads its settings once per page open instead of twice.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
dorkmo
force-pushed
the
website-config-roundtrip-calibration
branch
from
September 14, 2026 22:34
9ccd11f to
738760d
Compare
dorkmo
force-pushed
the
website-status-and-feedback
branch
from
September 14, 2026 22:34
2bdaecf to
bd877e0
Compare
dorkmo
changed the base branch from
website-config-roundtrip-calibration
to
master
September 15, 2026 14:34
dorkmo
added a commit
that referenced
this pull request
Sep 15, 2026
…statuses Adds CODE_REVIEW_09152026_WEBSITE_PRS_314_317_CLAUDE.md (what each PR changed, how it was verified, the eleven Copilot review rounds, what remains) and marks S-W01/02/03 done and S-W05/06/07 merged with residuals in TODO.md, with the merge commits. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
dorkmo
added a commit
that referenced
this pull request
Sep 15, 2026
…ess config round-trips, calibration identity, operator status, UID hardening Server-only release; client and viewer are version bumps only (notefile schema, command formats and the config payload are unchanged). Details in release-notes/v2.2.15.md and CODE REVIEW/CODE_REVIEW_09152026_WEBSITE_PRS_314_317_CLAUDE.md. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Third website PR from the 2026-09 master review: S-W06 (operator status can be misleading) and S-W07 (logs, save feedback, secondary API usability). All changes are in
TankAlarm-112025-Server-BluesOpta.ino; the server-side parts are small, targeted handler fixes.S-W06 — operator status
--for OFF, anin/24hdelta and a trend sparkline--(indistinguishable from no data)0.0"/api/clientsclient-levelat(M-41)ts[]mapper droppedflt/ma, so the FAULT badge and mA readout were dead and a current-loop fault rendered as a numbercompareFirmwareVersions(); only older-than countsrequireValidPin()validates the session and ignores the valueS-W07 — logs, feedback, secondary APIs
logTransmission()emits (13 types, 14 statuses) plus whatever the loaded entries contain, soerror,ota,alarm,applied,stalled… are selectable and no option is dead. The CSV export now uses the same filtered set as the table, including the detail-text search it used to omit. Badge colours added forerror,applied,stalled.400 … too long (max 31 characters)instead of being silently cut; the inputs carrymaxlength="31".GET /api/location(M-61): theclient=parameter goes throughgetQueryParam()(URL-decoded), sodev%3A…matches the stored UID and the Client Console location readout works for real UIDs.?sensor=splits at the last colon.Login failed (HTTP n)); 401 still reads "Invalid PIN".?uid=for a client with no snapshot (404 or noconfig) starts a new configuration with the UID filled in and one sensor card, with an explanatory toast; Add Sensor stops at 8 with a toast,collectConfigrefuses more, andhandleConfigPostrejects a config with more than 8 sensors (the client keepsMAX_MONITORS = 8and dropped the rest); if the contacts directory has not loaded, the download is refused and the load retried instead of deriving the daily report time from a hard-coded 05:00 UTC./api/clients?summary=1fetch measured) instead of twice.Verification
Browser, against a loopback fixture serving the pages extracted from this branch (placeholder data), zero
errorevents on every page exercised:Float Switch / OFFwith no delta or sparkline; pressure tank in alarm showsALARM: HIGH; a request older than its window renders Retry Update with the tooltip, a 100 s-old one renders the ETA pill.40.0 in 12.50 mA,OFF,FAULT OPEN.error→ 1 row; search "needle" (detail only) → 1 row and the CSV export has exactly that row.1111→ "Invalid PIN",9999→ "Too many failed attempts. Try again in 30 seconds",0000→ "Please set a 4-digit PIN on first login".saved:falsereply shows the in-memory-only error toast.?uid=dev:000000000009(404) → UID filled, one card, commissioning toast; nine Add Sensor clicks → 8 cards and the cap toast.approveDeletioncallsconfirm, neverprompt, and sends{"client":"…"}only./api/clients?summary=1request;maxlength31 on the three inputs.arduino:mbed_opta 4.5.0,--warnings all: 1,028,012 B (52%) flash on this stacked branch (+2984 B over fix(web): lossless config generator round-trips and calibration sensor identity #316; the same change on amasterbase measured +2,984 B), 360,720 B (68%) static RAM (unchanged); warning set identical to themasterbuild (line numbers aside). CI'scompile-checkandcheck-web-pagesboth pass on this PR.check_web_pages.py(from fix(web): bind six dead controls programmatically, restrict client UIDs, clamp config inputs, add page checker to CI #315): every<script>block on all 18 pages passesnode --check, 0 problems.Not in this PR
🤖 Generated with Claude Code