From a65dcff85ae7efeab5db61d8e0ae3fb449e61152 Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Sat, 11 Jul 2026 10:05:08 +0200 Subject: [PATCH] storage_network: full redesign on the canonical form pattern + protocol-honest guidance (v0.113.0 UI) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Kills the details/summary-button hack and the nonexistent form-row/form-input classes (the unstyled-look root cause); rebuilds on the storage_attach pattern (settings-card / form-group / form-control / form-actions / alert-*). SMB listed first (consumer reality), NFS two-recipe guidance (map-all-users simple recipe + full-fidelity anonuid= with a live computed host-id), §3.2 staged poll progress (Kapcsolódás/Csatolási teszt/Írásteszt/Regisztrálás), categorized Hungarian errors with a collapsible raw-detail block, orphan rows with an Árva badge + remove-only action. C8 render smoke guards the class regression. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6 --- .../web/storage_network_template_test.go | 56 ++++ .../web/templates/storage_network.html | 291 ++++++++++++------ 2 files changed, 252 insertions(+), 95 deletions(-) create mode 100644 controller/internal/web/storage_network_template_test.go diff --git a/controller/internal/web/storage_network_template_test.go b/controller/internal/web/storage_network_template_test.go new file mode 100644 index 0000000..0a05bb5 --- /dev/null +++ b/controller/internal/web/storage_network_template_test.go @@ -0,0 +1,56 @@ +package web + +import ( + "bytes" + "strings" + "testing" +) + +// C8 — template smoke for the redesigned NAS page: it renders through the PRODUCTION template tree +// and uses the canonical form classes; the nonexistent classes (`form-row`/`form-input`) and the +// summary-styled-as-button hack — the root causes of the unstyled look this task fixed — must never +// come back. Companion red-proof: reintroduce `class="form-input"` on an input → FAIL. +func TestStorageNetworkTemplate_CanonicalClasses(t *testing.T) { + s := testServer(t) + s.loadTemplates() + data := map[string]interface{}{ + "Page": "storage-network", "Title": "Hálózati tárhely", + "NetworkStoragePaths": []networkStorageItem{ + {Name: "media", Label: "NAS media", Protocol: "nfs", Server: "10.0.0.5", Export: "/srv/media", Path: "/mnt/felhom-drives/media", Health: "ok"}, + {Name: "ghost", Label: "Árva megosztás: ghost", Protocol: "nfs", Server: "10.0.0.5", Export: "/srv/ghost", Path: "/mnt/felhom-drives/ghost", Health: "idle", Orphan: true}, + }, + } + var buf bytes.Buffer + if err := s.tmpl.ExecuteTemplate(&buf, "storage_network", data); err != nil { + t.Fatalf("render storage_network: %v", err) + } + html := buf.String() + + for _, want := range []string{ + `class="form-control"`, // the canonical input class + `class="form-group"`, // the canonical field wrapper + "SMB (Synology, QNAP", // protocol-honest ordering: SMB listed first + "NFS (TrueNAS, Linux szerver)", // no bare "ajánlott" claim + "Árva", // the orphan badge renders + "minden felhasználó leképezése", // the Route-A guidance block + "ns-hostid", // the live computed host-id span + "/api/storage/netstorage/add/status", // the poll-driven progress wiring + } { + if !strings.Contains(html, want) { + t.Errorf("rendered page missing %q", want) + } + } + for _, banned := range []string{ + "form-row", // nonexistent class — the old unstyled-look root cause + "form-input", // nonexistent class + ` -

Tárhely — Hálózati tárhely (NAS)

+
+ ← Vissza +

Tárhely — Hálózati tárhely (NAS)

+
- -
-

NAS-megosztások

-

- Egy NAS-megosztás (NFS vagy SMB) csatlakoztatása nagy méretű médiatartalomhoz (film, fotó, zene). - A megosztás kiválasztható médiaalkalmazás adatkönyvtáraként. A hálózati tárhely nem fizikai - meghajtó — nincs leszerelés/áthelyezés, csak eltávolítás. -

- {{if .NetworkStoragePaths}} -
- {{range .NetworkStoragePaths}} -
-
-
- {{.Label}} - {{.Protocol}} · {{.Server}}:{{.Export}} → {{.Path}} -
-
- {{if eq .Health "ok"}}Elérhető - {{else if eq .Health "idle"}}Készenlét - {{else if eq .Health "unreachable"}}Nem elérhető - {{else}}Ismeretlen{{end}} -
+

NAS-megosztások

+

+ Egy NAS-megosztás (NFS vagy SMB) csatlakoztatása nagy méretű médiatartalomhoz (film, fotó, zene). + A megosztás kiválasztható médiaalkalmazás adatkönyvtáraként. A hálózati tárhely nem fizikai + meghajtó — nincs leszerelés/áthelyezés, csak eltávolítás. +

+ {{if .NetworkStoragePaths}} +
+ {{range .NetworkStoragePaths}} +
+
+
+ {{.Label}} + {{.Protocol}} · {{.Server}}:{{.Export}} → {{.Path}} + {{if .Orphan}}A megosztás be van állítva a gazdagépen, de nincs regisztrálva — egy megszakadt csatlakoztatás maradványa. Távolítsa el, vagy adja hozzá újra ugyanezzel a névvel.{{end}}
-
- +
+ {{if .Orphan}}Árva + {{else if eq .Health "ok"}}Elérhető + {{else if eq .Health "idle"}}Készenlét + {{else if eq .Health "unreachable"}}Nem elérhető + {{else}}Ismeretlen{{end}}
- {{end}} +
+ +
- {{else}} -

Nincs hálózati tárhely beállítva.

{{end}} - -
- Hálózati tárhely hozzáadása -
-
-
-
-
-
-
-
-
-
- - A legtöbb médiaalkalmazás 1000-es uid-del fut.
- - -
-
-
- + {{else}} +

Nincs hálózati tárhely beállítva.

+ {{end}}
+ +
+

Hálózati tárhely hozzáadása

+

A csatlakoztatás előtt a rendszer ellenőrzi a megosztást: valóban + csatolható-e, és tudnak-e írni rá az alkalmazások. Hiba esetén semmi nem marad félkészen beállítva.

+
+
+ + +
+
+ + + A megosztás a /mnt/felhom-drives/<név> útvonalon lesz elérhető. +
+
+ + +
+
+ + +
+
+ + + A legtöbb médiaalkalmazás 1000-es azonosítóval fut. +
+
+
+ + +
+
+ + + A jelszót a gazda ügynök 0600-as fájlba írja; a vezérlő nem tárolja. +
+
+
+ +
+
+
+
+ +
+

Mit kell beállítani a NAS-on?

+
+ Útmutató megjelenítése +

Engedélyezze a Felhom gép IP-címét a megosztáson. Proxmox-fürt esetén minden csomópont IP-címét.

+

SMB (Synology, QNAP — a legtöbb NAS)

+

Hozzon létre (vagy jelöljön ki) egy felhasználót a NAS-on, és adjon neki írás-olvasás jogot a + megosztásra. Más beállítás nem szükséges — a fájlok a NAS-on ennek a felhasználónak a nevében + jönnek létre.

+

NFS

+

Egyszerű (a legtöbb NAS-hoz): kapcsolja be az exporton a „minden felhasználó leképezése” (map all + users / all squash) opciót írás-olvasás móddal — bármelyik helyi felhasználóra. A fájlok + tulajdonosa a rendszerben „nobody”-ként látszik; az alkalmazások túlnyomó többségének ez megfelelő.

+

Teljes értékű (TrueNAS / Linux szerver): export a következő opciókkal: + rw,all_squash,anonuid=101000,anongid=101000 + — így a tulajdonos-információk is hibátlanok.

+

A Synology/QNAP felületére szabott lépésről lépésre útmutató készül.

+
+
+ +