release: Mark VIII 1.0

This commit is contained in:
c4ch3c4d3
2026-08-11 20:24:24 -07:00
commit 3e1805dab8
86 changed files with 20678 additions and 0 deletions
@@ -0,0 +1,103 @@
# 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-toggle` iOS 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 `.switch` CSS
(iOS-style slider; defined in `app.css` but 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`) →
one `POST /api/pineap/set_config` with 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).
- 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 `.switch` slider 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` — rewrite
`views.pineap_open` (layout + staged-save behavior).
No backend changes. No test-module changes.
## Verification
1. JS delimiter balance check (Python checker; no node available).
2. All 13 backend unittest modules pass (unchanged).
3. Deploy via `scripts/deploy.ps1` (password supplied securely), restart
`/etc/init.d/pagerwebui`.
4. 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`/`hostapd` after Save); untouched toggles are not sent;
user walks the tab visually.