# REPORT — TASK-D1: Settings split + Tárhely page (unified drive view) → v0.97.0 **Date:** 2026-07-02 · **Deployed:** guest 9201 (`gitea.dooplex.hu/admin/felhom-controller:0.97.0`, healthy) ## 1. Baseline felhom-controller `main` @ `52e97b1` (v0.96.0, TASK-D0 final) — matched the spec exactly; **main had NOT moved** past 52e97b1 at session start. ## 2. Old-section → new-page mapping (every h3 accounted for) | Old settings.html section (h3) | New page | |---|---| | Rendszer konfiguráció | `/settings` (settings_system.html) | | Verzió és frissítés | `/settings` | | Vezérlő újraindítása | `/settings` | | Kiszolgáló újraindítása | `/settings` | | Adattárolók | `/storage` (storage.html) | | Hálózati tárhely (NAS) | `/storage` | | Meghajtók (ügynök nézet) → merged into Adattárolók + Rendszermeghajtók / Nem regisztrált groups | `/storage` | | Értesítések | `/settings/notifications` (settings_notifications.html) | | Alkalmazás-email | `/settings/notifications` | | Jelszó módosítás | `/settings/security` (settings_security.html) | | Földrajzi korlátozás | `/settings/security` | | Veszhelyzeti informaciok → **Vészhelyzeti információk** (typo fixed) | `/settings/security` | The "Meghajtók (ügynök nézet)" standalone section was deliberately dissolved into the unified view (enrichment of the registry cards + the two new groups) — noted here as the one consciously restructured section. `TestSettingsSectionInventory` asserts all 11 remaining headings survive in the union of the four templates and that the misspelling is gone. ## 3. Files created / modified / deleted **Created:** `settings_system.html`, `settings_notifications.html`, `settings_security.html` (templates); `scripts/template_id_gate.py`, `scripts/emoji_gate.py`; `internal/web/settings_split_test.go`. **Renamed:** `settings.html` → `storage.html` (git rename, 51% similarity). **Modified:** `internal/web/server.go` (routes), `internal/web/handlers.go` (builders + rewired handlers), `internal/web/templates/layout.html` (sidebar), `templates/style.css` (nav group CSS; deleted `.sidebar-settings-link` + `.badge-lock` + `.lock-ico`), `templates/{backups,debug,deploy}.html` (emoji), CHANGELOG.md, CONTEXT.md, controller/README.md, REPORT.md. ## 4. Per-commit hashes (pushed to `main`) | Commit | Content | |---|---| | `d50a919` | Part 1: routes + per-page data builders + redirect tests | | `f8e18a9` | Part 2: template split + sidebar + integrity gate | | `cb6f04c` | Part 3: unified drive view + overlay migration | | `622d932` | Part 3 leftovers: 8 emoji removed + Python emoji gate | ## 5. Tests + red-proofs `go build ./... && go vet ./... && go test ./...` green after every commit; final run 18 packages ok. Web-package test functions +8 (TestSettingsSplitPagesRender, TestSettingsSectionInventory, TestWizardRoutesMovedWith301, TestStorageActionRedirectsToStorage, TestPasswordErrorRerendersSecurityPage, TestStorageNoNativeConfirm, TestStorageAgentDownNote, TestNoEmojiInTemplates). - **Redirect red-proof (Scenario D/E):** `TestStorageActionRedirectsToStorage` + `TestWizardRoutesMovedWith301` run against the stashed pre-split handlers **failed** — `Location = "/settings?storage_msg=success&…"` (want `/storage?…`) and the 301s returned empty Location. With the new code: pass. - **Integrity-gate red-proof (§10):** a storage function (`getElementById('migrate-progress')`) planted in `settings_notifications.html` made the gate **fail** with `static #migrate-progress not defined in settings_notifications.html`; reverted → OK. - **Section inventory:** all 11 old h3 headings present in the union; the misspelled "Veszhelyzeti informaciok" asserted absent. ## 6. Integrity gate output (per template) `python scripts/template_id_gate.py` → **OK — every JS element-ID reference resolves within its own template.** Justified dynamic-ID exception list (in the script's `ALLOW`): the layout.html modals that are built entirely in JS then looked up (`alert-modal`, `delete-modal`, `remove-modal` and their inner button/checkbox IDs), and `sync-btn`/`sync-toast` which live on stacks.html but are touched by shared layout JS behind an `if(!btn)return` guard. Template-parameterized IDs (`id="field-{{.EnvVar}}"` → `field-SUBDOMAIN`, `agent-extra-{{.Path}}`, `migrate-target-{{.Path}}`, `label-wrap-{{.Path}}`, etc.) and JS-created IDs (`dialog-go`, `dialog-type`, `confirm-go`, `geo-edit-`) are resolved by prefix/JS-string matching, not allowlisted. ## 7. Emoji gate + badge/confirm greps - `python scripts/emoji_gate.py` — **before: 8** (backups 📁/🔄, debug 🔄/🔒, deploy 📦/★, storage 📦×2); **after: 0.** Go `TestNoEmojiInTemplates` keeps it enforced. - **confirm() grep (Scenario F):** zero native `confirm(`/`prompt(` in the four split templates (the surviving `openConfirm`/`confirmEject`/`confirmWipe` are the pre-existing type-to-confirm overlay, not native dialogs). - **badge grep:** `.badge-lock` / `.lock-ico` deleted after confirming zero template/JS references. Other `.badge*` classes (NAS health, orphaned, backups tables) remain in use and were NOT deleted (rule §9.8: grep-zero before delete) — restyled flat by the D0 CSS. ## 8. Deployment + live validation (claude-in-chrome) ``` gitea.dooplex.hu/admin/felhom-controller:0.97.0 Up 9 seconds (healthy) ``` Checks performed on `https://felhom.demo-felhom.eu` (screenshots per page): 1. **All four pages + /storage render**, each with its own sections and the correct sidebar active state (Tárhely main-nav item; Beállítások group → Rendszer / Értesítések / Biztonság és hozzáférés). Sidebar shows 0.97.0. 2. **301 in the browser:** `GET /settings/storage/init` landed on `/storage/init` (title "Új meghajtó inicializálása"). 3. **Unified view (Scenario B):** DOM-asserted — 3 registry cards enriched in place (role tag "Felhasználói adat" + durable-id `uuid:…`, 8 enrichment metarows total); **Rendszermeghajtók** group visible with 3 read-only rows (local, local-lvm, felhom-pbs) and **0 action buttons**; unregistered group hidden; warn note empty (agent reachable). Zero emoji in the rendered body. 4. **Overlay (Scenario F, live):** `storageDisconnect` opened the v2 `.confirm-overlay` ("Meghajtó leválasztása", verbatim text, Leválasztás/Mégsem) — NOT a native dialog — and **Cancel** closed it cleanly (`#dialog-root` empty); the drive was untouched. 5. **End-to-end storage action (Scenario D, live):** renamed felhom-usb's label via the real pencil form → redirected to `/storage?storage_msg=success&…`, the flash "Megnevezés módosítva: Teszt USB D1" rendered on /storage and the card title updated → **renamed back** to the original "Tárhely (felhom-usb)" (verified). ## 9. NOT yet live-validated - **Agent-down degradation (Scenario C):** static/unit only — the agent must not be stopped on the live host. The warn-note element + error path are asserted by `TestStorageAgentDownNote`. - **Destructive storage ops through the moved UI** (eject/wipe/decommission/migrate): the endpoints are unchanged and unit-tested, but exercising the relocated overlay paths on real data awaits a supervised session. ## 10. Observations (structural, NOT acted on) 1. Each split page carries its own copy of the ~14-line overlay `openDialog` helper (system, security, storage) — intentional per spec §2.1 (no shared JS bundle). A future shared static JS asset would DRY this if the no-bundle constraint is lifted. 2. `storage.html` is still large (~700 lines) — it absorbed the full drive registry, NAS, migrate, and unified-view JS. Splitting the NAS-add form into a partial is a candidate for a later pass. 3. `.badge*` markup persists on secondary pages (backups tables, NAS health, orphaned) — a full tag/metarow migration there is D2 territory. 4. ~50 inline `style="…"` attributes remain across the split pages (carried verbatim from the monolith); reducible where a v2 class now covers them. 5. The unified view enriches only **connected** user-data registry cards; a disconnected/decommissioned registry card is not agent-joined (it has no live mount) — correct today, but if the agent ever reports a re-appeared device the card won't auto-enrich until reload.