4.7 KiB
4.7 KiB
Design: Open AP tab — Mark VII "PineAP Settings" card
Date: 2026-08-11 Status: Approved
Problem
The PineAP Open AP tab (#/pineap/open) renders as a flat list of nine
plain checkboxes inside a single .pineap-title-card. The Mark VII PineAP page's
settings card ("PineAP") uses a titled card with a subtitle, iOS-style slide
toggles (mat-slide-toggle) grouped into sections, and a Save button. The Open
AP tab should be restyled to that anatomy, with behavior switched from
immediate-apply to a batched Mk7-style Save.
Reference (Mark VII)
The Mk7 "PineAP" settings card (from the firmware bundle):
- 20px card title "PineAP" + muted subtitle "Quickly set the general behavior of PineAP"
- The Passive/Active/Advanced button group (already on our Overview tab — not duplicated here)
- Settings as
mat-slide-toggleiOS switches - A small accent save button (
savePineAPSettings)
Design
Layout
A full-width .pineap-card-settings card containing:
- Title row (
.pineap-card-title-flex): title "PineAP", muted subtitle "Quickly set the general behavior of PineAP", and a Save button on the right (accent/primary.btn). - Grouped slide-toggle settings using the repo's existing
.switchCSS (iOS-style slider; defined inapp.cssbut currently unused):- Karma: Enable PineAP, Karma
- SSID Pool: Capture SSIDs to Pool, Advertise AP Impersonation Pool
- Logging: Log Handshakes, Log Partial Handshakes, Log PCAP, Log WiGLE, Log Recon
- Footer (muted):
PineAP MAC: X Target MAC: Y
Behavior (Mk7-style Save, batched)
- Flipping a switch stages the value locally and marks the field dirty — no API call is made until Save.
- Save applies only the dirty fields, batched per backend route:
- Logging + Capture SSIDs (set_config fields
loghandshake,logpartialhandshake,logpcap,logwigle,logrecon,autossidpool) → onePOST /api/pineap/set_configwith the dirty fields. The backend merges over the current daemon config, so untouched settings keep their values. pineap_disabled(Enable PineAP) →POST /api/pineap/enable {enable}if dirty.karma→POST /api/pineap/mimic {enable}if dirty.advertise→POST /api/pineap/ssidpool/advertise {enable}if dirty.- All dirty routes fire together (
Promise.allSettled); toast "Settings saved" if all fulfilled, else "Some settings failed" (error).
- Logging + Capture SSIDs (set_config fields
- Dirty-only apply preserves the unreadable live Karma state: the Pager daemon cannot report Karma, so leaving the switch untouched means Save does not change it.
load()runs once on entry and after a successful Save to populate the switches from the daemon (get_config,hostapd,wifi/get_ap). No polling on this tab (unchanged), so staged values are never clobbered.- If nothing is dirty, Save toasts "No changes".
Mapping table (field → route, dirty-only)
| Switch | Backend call | Dirty flag |
|---|---|---|
| Enable PineAP | POST /api/pineap/enable {enable} |
pineap_disabled |
| Karma | POST /api/pineap/mimic {enable} |
karma |
| Capture SSIDs to Pool | POST /api/pineap/set_config {autossidpool} |
autossidpool |
| Advertise AP Impersonation Pool | POST /api/pineap/ssidpool/advertise {enable} |
advertise |
| Log Handshakes | POST /api/pineap/set_config {loghandshake} |
loghandshake |
| Log Partial Handshakes | POST /api/pineap/set_config {logpartialhandshake} |
logpartialhandshake |
| Log PCAP | POST /api/pineap/set_config {logpcap} |
logpcap |
| Log WiGLE | POST /api/pineap/set_config {logwigle} |
logwigle |
| Log Recon | POST /api/pineap/set_config {logrecon} |
logrecon |
CSS additions (app.css)
.pineap-card-subtitle— muted, ~13px subtitle under the card title..pineap-settings-section— small muted group label (e.g. "Karma", "SSID Pool", "Logging"), 13px, with margin, used between the toggle groups.- Reuse the existing
.switchslider CSS (no change to it).
Files touched
payload/user/general/pager-webui/www/css/app.css— two new classes.payload/user/general/pager-webui/www/js/views.js— rewriteviews.pineap_open(layout + staged-save behavior).
No backend changes. No test-module changes.
Verification
- JS delimiter balance check (Python checker; no node available).
- All 13 backend unittest modules pass (unchanged).
- Deploy via
scripts/deploy.ps1(password supplied securely), restart/etc/init.d/pagerwebui. - On-device: Open AP tab shows the titled settings card with grouped slide
switches and Save; flipping a switch then Save applies the values (verify
via
get_config/hostapdafter Save); untouched toggles are not sent; user walks the tab visually.