docs: CHANGELOG v0.97.0 + REPORT (TASK-D1) + CONTEXT + README page-IA section
This commit is contained in:
@@ -1,5 +1,59 @@
|
||||
## Changelog
|
||||
|
||||
### v0.97.0 — TASK-D1: settings split + Tárhely page (unified drive view) (2026-07-02)
|
||||
|
||||
The 1451-line settings monolith becomes four pages; storage is promoted to a first-class main-nav
|
||||
page with a unified (registry + agent) drive view; native browser dialogs migrate to the overlay
|
||||
pattern. **IA/appearance only** — no `/api/storage/*` payload, storage semantics, or agent-client
|
||||
change. Four commits (d50a919, f8e18a9, cb6f04c, 622d932).
|
||||
|
||||
- **Routing (server.go):** new `GET /storage` (Tárhely), `GET /settings/notifications` (GET→page /
|
||||
POST→save split on the same path), `GET /settings/security`; the enrollment wizards move to
|
||||
`/storage/init` + `/storage/attach`, with **301** permanent redirects from the old
|
||||
`/settings/storage/{init,attach}`.
|
||||
- **Data builders (handlers.go):** `settingsData()` decomposed into `settingsBaseData` +
|
||||
`systemPageData` / `storagePageData` / `notificationsPageData` / `securityPageData`; each GET
|
||||
handler and each error-re-rendering POST handler uses exactly its page's builder + template. All
|
||||
five storage action redirects now land on `/storage?storage_msg=…`.
|
||||
- **Template split:** `settings.html` deleted; sections moved verbatim into `settings_system.html`
|
||||
(Rendszer konfiguráció, Verzió és frissítés, Vezérlő/Kiszolgáló újraindítása),
|
||||
`settings_notifications.html` (Értesítések, Alkalmazás-email), `settings_security.html` (Jelszó
|
||||
módosítás, Földrajzi korlátozás, Vészhelyzeti információk — misspelled heading + section copy
|
||||
accents fixed), and `storage.html`. The NAS + migrate sections (previously nested inside
|
||||
`{{if .StoragePaths}}` and invisible with zero drives) are now unconditional on `/storage`.
|
||||
- **Sidebar (layout.html):** Tárhely main-nav item (hard-drive icon) + a "Beállítások" group with
|
||||
Rendszer / Értesítések / Biztonság és hozzáférés sub-links (active state per page); orphaned
|
||||
`.sidebar-settings-link` CSS deleted, `.nav-group-label` / `.nav-links-sub` added.
|
||||
- **Unified drive view (storage.html):** registry cards render server-side as before; the agent
|
||||
`/api/disks` list ENRICHES each connected user-data card in place (role tag via `i-lock`, drive
|
||||
class, durable-id mono line, agent-only register/eject/wipe actions) joined on mount path — one
|
||||
card per drive. Two extra groups: **Rendszermeghajtók** (system/backup, read-only, lock tag, no
|
||||
actions) and **Nem regisztrált meghajtók** (register action only). Agent-down → one warn note
|
||||
(`Az ügynök nem elérhető…`), all registry cards still render (graceful degradation). Agent-view
|
||||
helpers emit design-system `.tag` markup (no `.badge`); the 🔒 emoji is gone.
|
||||
- **Overlay migration:** every native `confirm()`/`prompt()` on the four pages routes through a
|
||||
light `.confirm-overlay` dialog (`openDialog`; texts verbatim) — storage remove forms,
|
||||
netStorageRemove, storageMigrateAll, storageDisconnect, storageDecommission (migrate + the
|
||||
type-to-confirm anyway branch preserved like-for-like), storageReEnroll, triggerUpdate,
|
||||
controller/server restart, and the two geo Hungary-removal confirms. One froze a browser tab
|
||||
during D0 validation; none remain.
|
||||
- **D0 leftovers:** the D0 grep gate false-negatived multibyte emoji on Windows — a Python
|
||||
codepoint gate (`scripts/emoji_gate.py`) found and removed **8** survivors (📁🔄🔒📦 across
|
||||
backups/debug/deploy/storage; the ★ default-marker → „(alapértelmezett)"). Orphaned
|
||||
`.badge-lock`/`.lock-ico` CSS deleted (grep-zero first).
|
||||
- **Gates & tests (+8):** `scripts/template_id_gate.py` (JS element-ID integrity — every
|
||||
`getElementById`/`querySelector('#…')` resolves in its own template; red-proven by a misplaced
|
||||
function), `scripts/emoji_gate.py` (0), Go tests for the four-page render + cross-leak, the h3
|
||||
section inventory (all 11 old headings accounted for), 301s, storage redirect + flash, password
|
||||
inline re-render, no-native-confirm scan, agent-down warn-note, and codepoint emoji scan.
|
||||
Redirect + inventory tests red-proven against pre-split code. `go build/vet/test ./...` green.
|
||||
- Live-validated on 9201 via claude-in-chrome: all four pages + the 301 redirect, the unified view
|
||||
(3 enriched cards with role tags + durable-ids, Rendszermeghajtók group read-only with 0 action
|
||||
buttons), the Leválasztás overlay opened + cancelled (drive untouched), and a full label-rename
|
||||
round-trip through the real UI (flash on /storage, renamed back). NOT live-validated: agent-down
|
||||
degradation (static/unit only — the agent must not be stopped on the live host); destructive
|
||||
storage ops (endpoints unchanged; the moved UI paths await a supervised session).
|
||||
|
||||
### v0.96.0 — TASK-D0: design system v2 re-skin (appearance only) (2026-07-02)
|
||||
|
||||
Full customer-UI re-skin to the approved Felhom design system v2 — navy token palette, exception-based
|
||||
|
||||
+24
-1
@@ -7,7 +7,30 @@
|
||||
>
|
||||
> Ask Claude Code: "Please update CONTEXT.md with what we did today"
|
||||
|
||||
Last updated: 2026-07-02 (v0.96.0 — TASK-D0 design system v2 re-skin; live on 9201)
|
||||
Last updated: 2026-07-02 (v0.97.0 — TASK-D1 settings split + Tárhely unified drive view; live on 9201)
|
||||
|
||||
> **2026-07-02 — v0.97.0 (deployed on 9201): TASK-D1 — settings split + Tárhely page (IA only).**
|
||||
> The 1451-line `settings.html` monolith is split into four pages: `/storage` (new main-nav
|
||||
> **Tárhely**: Adattárolók + NAS + unified agent drive view + wizard entry), `/settings` (Rendszer:
|
||||
> konfig, verzió/frissítés, vezérlő+kiszolgáló újraindítás), `/settings/notifications` (Értesítések
|
||||
> + Alkalmazás-email), `/settings/security` (Jelszó, Földrajzi korlátozás, Vészhelyzeti információk).
|
||||
> Sidebar gains the Tárhely item + a "Beállítások" group with three sub-links. **No storage/agent/API
|
||||
> behavior change** — pages moved, logic didn't; every `/api/storage/*` endpoint + POST action
|
||||
> unchanged. **Decisions:** (a) storage flashes + wizards moved to `/storage`; old
|
||||
> `/settings/storage/{init,attach}` **301** to `/storage/{init,attach}`. (b) The two duplicated drive
|
||||
> views MERGED: registry cards render server-side, then JS enriches each connected user-data card in
|
||||
> place from the agent `/api/disks` (role tag, durable-id, agent actions) joined on mount path, plus
|
||||
> two groups — **Rendszermeghajtók** (system/backup, read-only, lock tag, NO actions) and **Nem
|
||||
> regisztrált** (register only); agent-down → one warn note, registry cards still render. (c) Every
|
||||
> native `confirm()`/`prompt()` on the four pages now routes through a light `.confirm-overlay`
|
||||
> (`openDialog`; texts verbatim; type-to-confirm kept only where it existed) — the D0 tab-freeze is
|
||||
> gone. **Contract for future UI:** new templates must pass `scripts/template_id_gate.py` (every JS
|
||||
> element-ID resolves in its own template) and `scripts/emoji_gate.py` (0 emoji — the D0 grep gate
|
||||
> false-negatived multibyte emoji on Windows; 8 survivors removed). `.badge-lock`/`.lock-ico` CSS
|
||||
> deleted; other `.badge*` still used on secondary pages (D2 to finish). **Next: D2** (badge→tag on
|
||||
> backups/secondary pages; storage.html is still ~700 lines — NAS-add partial candidate). NOT
|
||||
> live-validated: agent-down degradation (don't stop the live agent — static/unit only); destructive
|
||||
> storage ops via the moved overlay paths (endpoints unchanged; supervised session).
|
||||
|
||||
> **2026-07-02 — v0.96.0 (deployed on 9201): TASK-D0 — design system v2 re-skin (appearance only).**
|
||||
> The whole customer UI (dashboard AND setup wizard) now renders in the approved v2 language: navy
|
||||
|
||||
@@ -1,133 +1,135 @@
|
||||
# REPORT — TASK-D0: Controller UI re-skin foundation (design system v2) → v0.96.0
|
||||
# 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.96.0`, healthy)
|
||||
**Date:** 2026-07-02 · **Deployed:** guest 9201 (`gitea.dooplex.hu/admin/felhom-controller:0.97.0`, healthy)
|
||||
|
||||
## 1. Baselines
|
||||
## 1. Baseline
|
||||
|
||||
- felhom-controller `main` @ `a390e6be293ec70e56d81f90852bc8c2278981e7` (v0.95.0) — **exactly matched
|
||||
the spec; main had NOT moved past a390e6b** at session start.
|
||||
- felhom.eu `main` @ `8c8196e82b69592bd5c0f2166de0987134921590` — matched.
|
||||
felhom-controller `main` @ `52e97b1` (v0.96.0, TASK-D0 final) — matched the spec exactly; **main had
|
||||
NOT moved** past 52e97b1 at session start.
|
||||
|
||||
## 2. Commits pushed to `main`
|
||||
## 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 |
|
||||
|---|---|
|
||||
| `b073cc4` | Part 1: vendored fonts + Lucide sprite + setup CSS fix + tests |
|
||||
| `5dc277f` | Part 2: v2 tokens/components, funcmap remap, layout + dashboard + stacks |
|
||||
| `f100cef` | Part 3: deploy + backups + monitoring; template-wide var() rename |
|
||||
| `7df061c` | Part 4: settings visual pass + remaining pages; grep gate zero |
|
||||
| `4906524` | fix(backups): off-box `LastRun` RFC3339-string 500 (pre-existing, found in click-through) |
|
||||
| felhom.eu `a336fe3` | docs: `documentation/design/design-system.md` (canonical v2 reference) |
|
||||
| `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 |
|
||||
|
||||
## 3. Files created / modified
|
||||
## 5. Tests + red-proofs
|
||||
|
||||
**Created:** `controller/internal/web/static/fonts/{pjs-latin.woff2 27.3K, pjs-latin-ext.woff2 21.7K,
|
||||
jbm-latin.woff2 31.4K, jbm-latin-ext.woff2 11.6K}` (4 variable-font files, ~92 KB total — Google now
|
||||
serves variable fonts, so one file covers all weights per subset instead of the estimated ~14 files);
|
||||
`templates/icons.html` (30-icon Lucide sprite); `internal/web/fonts_test.go`,
|
||||
`internal/web/funcmap_test.go`, `internal/setup/css_test.go`;
|
||||
`felhom.eu/documentation/design/design-system.md`.
|
||||
`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).
|
||||
|
||||
**Modified:** `internal/web/{embed.go (fonts FS + StyleCSS()), server.go (/static/fonts/ route),
|
||||
funcmap.go (stateColor/usageColor/tempColor remap + timeAgoStr)}`;
|
||||
`internal/setup/handlers.go` (handleCSS → embedded CSS; minimalCSS retokened);
|
||||
`templates/style.css` (rewritten in place); all 19 web templates; setup templates (v2 token
|
||||
fallbacks); CHANGELOG.md, CONTEXT.md, controller/README.md, REPORT.md.
|
||||
- **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.
|
||||
|
||||
## 4. Tests + red-proofs
|
||||
## 6. Integrity gate output (per template)
|
||||
|
||||
- `go build ./... && go vet ./... && go test ./...` **green after every commit**; final full run exit 0,
|
||||
18 packages ok. Test functions 256 → **263** (+7).
|
||||
- **funcmap red-proof:** truth-table tests run against the stashed pre-change funcmap **failed exactly
|
||||
as required** — `stateColor("stopped") = "red", want "neutral"` and `usageColor(0) = "green", want
|
||||
"nominal"` (plus tempColor). Restored; all pass.
|
||||
- **setup-CSS red-proof:** Scenario E test against the pre-fix `handleCSS` **failed** with
|
||||
`body length = 3592, want > 10000` (minimalCSS served). With the fix: passes, and asserts the
|
||||
`--bg-0: #0A1220` literal + byte-equality with `web.StyleCSS()`.
|
||||
- Template-parse tests (`TestTemplatesParse`, `TestTemplatesParseWithFuncmap`) already existed and
|
||||
cover Group G; they pass with the new funcmap + icons partial.
|
||||
`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.
|
||||
|
||||
## 5. Grep gate (Test Group F) — counts before → after
|
||||
## 7. Emoji gate + badge/confirm greps
|
||||
|
||||
All 34 patterns measured identically over `controller/internal/{web,setup}` (*.go, *.html, *.css):
|
||||
- `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.
|
||||
|
||||
| Pattern | Before | After | Pattern | Before | After |
|
||||
|---|---|---|---|---|---|
|
||||
| fonts.googleapis.com | 1 | 0 | system-bar-green | 4 | 0 |
|
||||
| border-radius: 999px | 5 | 0 | system-bar-yellow | 4 | 0 |
|
||||
| box-shadow | 31 | 0 | system-bar-red | 4 | 0 |
|
||||
| #0d1117 | 3 | 0 | state-text-green | 9 | 0 |
|
||||
| #161b22 | 1 | 0 | state-text-red | 7 | 0 |
|
||||
| #1c2128 | 4 | 0 | state-text-yellow | 3 | 0 |
|
||||
| #30363d | 6 | 0 | state-text-orange | 1 | 0 |
|
||||
| #238636 | 5 | 0 | ⚙ / ✏ / ✕ / ⏳ | 1/2/1/2 | 0 |
|
||||
| #da3633 | 4 | 0 | ✅ / ❌ | 14/5 | 0 |
|
||||
| #d29922 | 3 | 0 | ⚠ | 18 | 0 |
|
||||
| #db6d28 | 2 | 0 | ℹ️ | 3 | 0 |
|
||||
|
||||
**Total: 143 → 0.** (🔧🔒📦🔗🔴🟡💾 were 0 in both.) Beyond the gate, related glyphs (✓✗⟳⏸🔄🔍) were
|
||||
also swept, and pre-existing never-defined `var(--success/--danger/--primary/--warning/--accent)`
|
||||
references in templates were mapped to v2 tokens.
|
||||
|
||||
## 6. Deployment + live validation (claude-in-chrome)
|
||||
## 8. Deployment + live validation (claude-in-chrome)
|
||||
|
||||
```
|
||||
gitea.dooplex.hu/admin/felhom-controller:0.96.0 Up 8 seconds (healthy)
|
||||
gitea.dooplex.hu/admin/felhom-controller:0.97.0 Up 9 seconds (healthy)
|
||||
```
|
||||
Startup logs clean (hub report pushed, 5 health probes ok). Sidebar shows 0.96.0.
|
||||
Checks performed on `https://felhom.demo-felhom.eu` (screenshots per page):
|
||||
|
||||
Chrome checks performed on `https://felhom.demo-felhom.eu` (screenshots taken per page; ő-glyph zoom
|
||||
saved to disk):
|
||||
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).
|
||||
|
||||
1. **Full click-through:** dashboard, Alkalmazások (filters render, grid kept), app-info (calcom),
|
||||
deploy page for actualbudget (**opened only — not deployed**; two-segment memory meter renders:
|
||||
solid-blue committed + 35%-opacity new), backups, monitoring (charts render in the new palette —
|
||||
cpu sky-blue, memory violet; JS-generated host-storage meters blue), logs (mono, blue Élő dot),
|
||||
settings (all sections; drive cards with pencil icons, run/USB tags, crit-outline danger buttons).
|
||||
2. **Type-to-confirm dialog:** opened the drive-list eject („Meghajtó leválasztása", type-to-confirm
|
||||
input, disabled crit-outline Megerősítés) and **cancelled** it; verified afterward the drive is
|
||||
still mounted and zero disconnect/eject calls hit the API.
|
||||
3. **Scenario D:** zero requests to fonts.googleapis.com/gstatic; `/static/fonts/*.woff2` → 200
|
||||
(pjs-latin, pjs-latin-ext, jbm-latin loaded); `document.fonts.check("1em 'Plus Jakarta Sans'")`
|
||||
and JBM both `true`; „…rendszermentéstől" ő renders in the brand face (zoom screenshot saved).
|
||||
4. **Scenario A (DOM-asserted via JS):** 0 elements with green (35,134,54) backgrounds, 0 elements
|
||||
with box-shadow, 0 border-radius values other than 0/2px/50%; „Leállítva 0" stat renders muted;
|
||||
running rows blue tag + blue 2px edge.
|
||||
5. **Login/logout:** NOT exercisable live — the demo node runs with auth disabled (`/login` is 404,
|
||||
no logout link; the known pre-existing unauth-demo state). Login page covered by template-parse
|
||||
tests; the two-tone H1 was added (`Otthoni <span>vezérlőpult</span>`).
|
||||
## 9. NOT yet live-validated
|
||||
|
||||
## 7. Bug found & fixed during validation
|
||||
- **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.
|
||||
|
||||
`GET /backups` returned **500** on first visit: `backups.html` passed `OffboxTarget.LastRun` (an
|
||||
RFC3339 **string** persisted in settings.json) to `timeAgo` (expects `time.Time`). Pre-existing since
|
||||
v0.93.0 (NAS Part B) — it fires on any node where an off-box backup has ever run; the demo node
|
||||
qualified. Fixed in `4906524` with a `timeAgoStr` funcmap helper (parses RFC3339, falls back to the
|
||||
raw string); 0.96.0 image rebuilt + redeployed, /backups now renders („Rendben … tegnap").
|
||||
## 10. Observations (structural, NOT acted on)
|
||||
|
||||
## 8. NOT yet live-validated
|
||||
|
||||
- **Setup wizard visual rendering** — cannot be exercised without re-provisioning; covered by the
|
||||
Scenario E unit test (embedded v2 CSS served). Await the next supervised reinstall.
|
||||
- **warn/crit meter states on real hardware** — the demo node is healthy (all meters nominal);
|
||||
covered at unit level (usageColor thresholds) and by the meter-flag template logic.
|
||||
- **`.meter-flag` strings live** — same reason (no disk over 70%).
|
||||
|
||||
## 9. Observations (structural, NOT acted on — appearance-only scope)
|
||||
|
||||
1. **settings.html remains monolithic** (~1450 lines, duplicated drive views: template-rendered
|
||||
registered-storage cards + JS-rendered agent drive list) — D1 scope. ~50 inline `style="…"`
|
||||
attributes remain there and across pages (reduced only where a v2 class covered them).
|
||||
2. **Native `confirm()` dialogs** in settings storage actions (`storageDisconnect`, stale-data
|
||||
delete) vs the custom type-to-confirm overlay elsewhere — inconsistent UX and they block
|
||||
browser automation; suggest migrating to the overlay in D1.
|
||||
3. Old `stat-running`/`stat-stopped` class names still appear in backups.html markup (now no-op —
|
||||
CSS deleted); harmless, cleanable in D1.
|
||||
4. `badge`/`meta-badge`/`db-type-badge`/`validation-badge` markup survives on secondary pages,
|
||||
restyled flat by the v2 CSS (2px, dim tokens) — full tag/metarow markup migration on those pages
|
||||
can complete in D1–D2.
|
||||
5. The catchall + setup pages are standalone (no sprite); they use inline SVGs / plain text. If
|
||||
icon needs grow there, consider embedding the sprite per-page.
|
||||
6. Baseline grep showed 🔧 at 0 despite layout.html's `🔧 Debug` — some emoji encodings differ from
|
||||
the gate's literals; the gate was still measured identically before/after, and independent broader
|
||||
sweeps confirmed no emoji remain.
|
||||
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.
|
||||
|
||||
+13
-1
@@ -110,6 +110,18 @@ backups, monitoring and notifications. All Proxmox/disk operations are delegated
|
||||
JetBrains Mono, variable woff2, latin+latin-ext) and a 30-icon Lucide sprite are vendored in the
|
||||
binary** (`internal/web/static/fonts/` served at `/static/fonts/`; `templates/icons.html`) — no CDN,
|
||||
no emoji. The setup wizard serves the same embedded stylesheet via `web.StyleCSS()`.
|
||||
- **Page IA (v0.97.0, TASK-D1)** — the settings monolith is split into four pages, each with its own
|
||||
data builder (`systemPageData`/`storagePageData`/`notificationsPageData`/`securityPageData`, sharing
|
||||
`settingsBaseData`) and template. Routes: `/settings` (Rendszer), `/settings/notifications`
|
||||
(GET→page, POST→save on the same path), `/settings/security`, and `/storage` (main-nav **Tárhely**).
|
||||
The enrollment wizards live at `/storage/{init,attach}`; `/settings/storage/{init,attach}` **301**
|
||||
to them; all storage action successes redirect to `/storage?storage_msg=…`. `/storage` shows a
|
||||
**unified drive view**: server-rendered registry cards enriched in place from the agent `/api/disks`
|
||||
(role/durable-id/actions, joined on mount path), plus read-only **Rendszermeghajtók** and
|
||||
**Nem regisztrált meghajtók** groups; agent-down degrades to a single warn note. Consequential
|
||||
actions use an in-page `.confirm-overlay` (`openDialog`), never native `confirm()`/`prompt()`.
|
||||
**Enforcement:** `scripts/template_id_gate.py` (JS element-ID integrity) + `scripts/emoji_gate.py`
|
||||
(no emoji — run after any template change; the Go `TestNoEmojiInTemplates` mirrors it).
|
||||
- **Europe/Budapest timezone** — All scheduled jobs, timestamps, and UI labels use Hungarian timezone.
|
||||
|
||||
### Module Map
|
||||
@@ -1970,7 +1982,7 @@ controller/
|
||||
│ ├── alerts.go # State-based alert generation
|
||||
│ ├── funcmap.go # Template functions (state colors, Hungarian formatting)
|
||||
│ ├── embed.go # go:embed for templates + Chart.js
|
||||
│ └── templates/ # 19 HTML files + style.css + icons.html sprite (Hungarian UI, design system v2)
|
||||
│ └── templates/ # 21 HTML files (4-page settings split) + style.css + icons.html sprite (Hungarian UI, design system v2)
|
||||
├── configs/
|
||||
│ ├── controller.yaml.example # Full config reference
|
||||
│ └── example-felhom-metadata.yml # .felhom.yml format reference
|
||||
|
||||
Reference in New Issue
Block a user