8.2 KiB
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+TestWizardRoutesMovedWith301run 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 insettings_notifications.htmlmade the gate fail withstatic #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-<app>) 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. GoTestNoEmojiInTemplateskeeps it enforced.- confirm() grep (Scenario F): zero native
confirm(/prompt(in the four split templates (the survivingopenConfirm/confirmEject/confirmWipeare the pre-existing type-to-confirm overlay, not native dialogs). - badge grep:
.badge-lock/.lock-icodeleted 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):
- 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.
- 301 in the browser:
GET /settings/storage/initlanded on/storage/init(title "Új meghajtó inicializálása"). - 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. - Overlay (Scenario F, live):
storageDisconnectopened 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-rootempty); the drive was untouched. - 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)
- Each split page carries its own copy of the ~14-line overlay
openDialoghelper (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. storage.htmlis 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..badge*markup persists on secondary pages (backups tables, NAS health, orphaned) — a full tag/metarow migration there is D2 territory.- ~50 inline
style="…"attributes remain across the split pages (carried verbatim from the monolith); reducible where a v2 class now covers them. - 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.