diff --git a/CHANGELOG.md b/CHANGELOG.md index 551924f..96aaa8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,14 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/). ### Sicherheit +## [0.23.0] – 2026-10-03 + +### Hinzugefügt +- Schlagworte stehen jetzt in der Host-Liste und oben im Host-Detail; ein Klick darauf filtert die Liste (#040) +- Filter „Alle Schlagworte“ in der Host-Liste (#040) +- Eine vorhandene Notiz zeigt ein Zettel-Symbol in der Liste; der Text erscheint beim Überfahren und steht oben im Host-Detail (#040) +- Suche und globale Suche finden Hosts auch über Schlagwort und Notiztext (#040) + ## [0.22.2] – 2026-10-03 ### Behoben diff --git a/DEVLOG.md b/DEVLOG.md index 8471721..8a49fae 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -2,7 +2,7 @@ ## Zeitübersicht -**Gesamt:** 21 h 03 min +**Gesamt:** 21 h 43 min | Issue | Zeit | |---|---| @@ -45,6 +45,7 @@ | #037 Rabatt je Position | 0 h 55 min | | #038 Überbreite auf dem Handy | 0 h 40 min | | #039 Zugang zur Laufzeit | 0 h 30 min | +| #040 Schlagworte sichtbar | 0 h 40 min | | Meilenstein | Zeit | |---|---| @@ -67,7 +68,7 @@ ## 2026-09-17 · Sitzung 1 · 19:36–laufend **Issue:** #001–#007 (Meilensteine v0.1.0 bis v0.4.0) -**Version:** 0.22.2 +**Version:** 0.23.0 ### Erledigt - Auftrag gelesen, Rückfragen gestellt @@ -204,6 +205,9 @@ - Dritte Stelle, die den Einkauf ohne Rabatt rechnete. Beim Ändern einer Rechengröße gehört jede Stelle gesucht, die sie selbst bildet – nicht nur die Abfragen - Bootstraps `d-*`-Klassen setzen `display` mit `!important`; für Spalten in der Kartenansicht braucht es eigene Klassen +- Schlagworte und Notizen sichtbar gemacht (#040). Beides gab es längst – nur eben versteckt in einem Reiter, und damit nutzlos zum Unterscheiden gleichnamiger Hosts +- Kein neues Feld gebaut: Ein zweites „Kommentar“ hätte dieselbe Angabe an zwei Orten gehalten + ### Nächster Schritt - #016 Benutzerhandbuch mit Screenshots, danach #017 Favicons und #019 CI-Pipeline - Für 1.0.0 fehlt noch: PMG (kein Host verfügbar) und der Fall „aktive Subscription auf PBS“ (#023) diff --git a/docs/anleitung/README.md b/docs/anleitung/README.md index cfb83d2..d5e3221 100644 --- a/docs/anleitung/README.md +++ b/docs/anleitung/README.md @@ -192,6 +192,19 @@ Dashboard vergleicht sie mit den Hosts, die sich tatsächlich melden: Hier laufen auf `hv-rz5-pve-02` und `hv-rz5-pve-03` noch keine Agents – das Dashboard sagt es zweimal deutlich. Sobald dort installiert wird, schließen sich die Warnungen von selbst. +### Gleichnamige Hosts auseinanderhalten + +In verschiedenen Kundennetzen heißen Hosts oft gleich – `hv-pve-01` gibt es womöglich dreimal. Dafür +gibt es Schlagworte und Notizen, zu finden im Host-Detail unter *Notizen und Tags*: + +- **Schlagworte** erscheinen als Abzeichen unter dem Hostnamen in der Liste. Ein Klick darauf zeigt + alle Hosts mit diesem Schlagwort; dasselbe geht über die Auswahl *Alle Schlagworte*. +- **Notizen** zeigen in der Liste ein Zettel-Symbol, dessen Text beim Überfahren erscheint. Im + Host-Detail steht die Notiz oben bei den Stammdaten. +- Beides wird mitdurchsucht – auch von der globalen Suche (Strg+K). + +Bewährt haben sich kurze, wiederverwendbare Worte: `cluster`, `backup`, `produktiv`, `aussenstelle`. + --- ## 5. Kunden und Standorte pflegen diff --git a/docs/anleitung/bilder/benutzer.png b/docs/anleitung/bilder/benutzer.png index 4b6b576..92b9990 100644 Binary files a/docs/anleitung/bilder/benutzer.png and b/docs/anleitung/bilder/benutzer.png differ diff --git a/docs/anleitung/bilder/host-detail.png b/docs/anleitung/bilder/host-detail.png index 98dbe57..5d83aa9 100644 Binary files a/docs/anleitung/bilder/host-detail.png and b/docs/anleitung/bilder/host-detail.png differ diff --git a/docs/anleitung/bilder/hosts-dunkel.png b/docs/anleitung/bilder/hosts-dunkel.png index 4281f89..6044187 100644 Binary files a/docs/anleitung/bilder/hosts-dunkel.png and b/docs/anleitung/bilder/hosts-dunkel.png differ diff --git a/docs/anleitung/bilder/hosts.png b/docs/anleitung/bilder/hosts.png index 4281f89..6044187 100644 Binary files a/docs/anleitung/bilder/hosts.png and b/docs/anleitung/bilder/hosts.png differ diff --git a/docs/anleitung/bilder/kunden.png b/docs/anleitung/bilder/kunden.png index cd87307..b575ca1 100644 Binary files a/docs/anleitung/bilder/kunden.png and b/docs/anleitung/bilder/kunden.png differ diff --git a/docs/anleitung/bilder/login.png b/docs/anleitung/bilder/login.png index 40f4441..46dbca5 100644 Binary files a/docs/anleitung/bilder/login.png and b/docs/anleitung/bilder/login.png differ diff --git a/docs/anleitung/bilder/mobil-hosts.png b/docs/anleitung/bilder/mobil-hosts.png index 14c9f1d..0e5fe6e 100644 Binary files a/docs/anleitung/bilder/mobil-hosts.png and b/docs/anleitung/bilder/mobil-hosts.png differ diff --git a/docs/anleitung/bilder/mobil-rechnungen.png b/docs/anleitung/bilder/mobil-rechnungen.png index 1b4286f..bc3e0c3 100644 Binary files a/docs/anleitung/bilder/mobil-rechnungen.png and b/docs/anleitung/bilder/mobil-rechnungen.png differ diff --git a/docs/anleitung/bilder/nicht-zugeordnet.png b/docs/anleitung/bilder/nicht-zugeordnet.png index b5fc5b7..a66c2ac 100644 Binary files a/docs/anleitung/bilder/nicht-zugeordnet.png and b/docs/anleitung/bilder/nicht-zugeordnet.png differ diff --git a/docs/anleitung/bilder/passkeys.png b/docs/anleitung/bilder/passkeys.png index fd7968e..2f9535d 100644 Binary files a/docs/anleitung/bilder/passkeys.png and b/docs/anleitung/bilder/passkeys.png differ diff --git a/docs/anleitung/bilder/rechnungen-dunkel.png b/docs/anleitung/bilder/rechnungen-dunkel.png index 7f979ae..c4e096d 100644 Binary files a/docs/anleitung/bilder/rechnungen-dunkel.png and b/docs/anleitung/bilder/rechnungen-dunkel.png differ diff --git a/docs/anleitung/bilder/rechnungen.png b/docs/anleitung/bilder/rechnungen.png index 8006da0..c4e096d 100644 Binary files a/docs/anleitung/bilder/rechnungen.png and b/docs/anleitung/bilder/rechnungen.png differ diff --git a/docs/anleitung/bilder/tokens.png b/docs/anleitung/bilder/tokens.png index e64995d..a88c254 100644 Binary files a/docs/anleitung/bilder/tokens.png and b/docs/anleitung/bilder/tokens.png differ diff --git a/docs/issues/040-schlagworte-sichtbar.md b/docs/issues/040-schlagworte-sichtbar.md new file mode 100644 index 0000000..ea6c3d5 --- /dev/null +++ b/docs/issues/040-schlagworte-sichtbar.md @@ -0,0 +1,26 @@ +# #040 Schlagworte und Notizen sichtbar machen +**Status:** erledigt +**Meilenstein:** v0.23.0 +**Labels:** ui +**Geschätzt:** 2 h **Tatsächlich:** 0 h 40 min + +## Auslöser +„Manche Hosts haben gleiche Namen.“ Zwei Hosts namens `hv-pve-01` bei verschiedenen Kunden sind in +der Liste nur am Kunden auseinanderzuhalten – und wenn beide zum selben Kunden gehören, gar nicht. + +## Ausgangslage +Schlagworte und Notizen gab es schon: im Host-Detail unter *Notizen und Tags*. Sie waren nur nirgends +zu sehen, außer in diesem einen Reiter. Damit taugten sie nicht zum Unterscheiden. + +## Behebung +- **Host-Liste:** Schlagworte als Abzeichen unter dem Namen, jedes anklickbar – ein Klick filtert die + Liste darauf. Eine vorhandene Notiz zeigt ein kleines Zettel-Symbol, dessen Text beim Überfahren erscheint. +- **Filterleiste:** Auswahl „Alle Schlagworte“, die nur tatsächlich vergebene Worte anbietet. +- **Host-Detail:** Schlagworte und Notiz stehen oben in der Host-Karte, nicht erst im Reiter. +- **Suche:** Die Hostsuche und die globale Suche (Strg+K) finden jetzt auch über Schlagwort und + Notiztext; die Trefferzeile nennt die Schlagworte. +- Sechs Tests, darunter zwei gleichnamige Hosts bei verschiedenen Kunden. + +## Entscheidung +Keine neue Datenstruktur. Schlagworte und Notizen waren bereits vorhanden und wurden nur nicht +gezeigt – ein zweites Feld „Kommentar“ hätte dieselbe Angabe an zwei Orten gehalten. diff --git a/docs/issues/README.md b/docs/issues/README.md index e4ea257..7a30946 100644 --- a/docs/issues/README.md +++ b/docs/issues/README.md @@ -43,4 +43,5 @@ Details und Architektur: [../architektur.md](../architektur.md). Zeiten werden a | [#037](037-rabatt-und-ablauf.md) | Rabatt je Position und der tatsächliche Ablauf | erledigt | v0.22.0 | 3 h | 0 h 55 min | | [#038](038-ueberbreite-handy.md) | Seite wird auf dem Handy herausgezoomt | erledigt | v0.22.1 | 2 h | 0 h 40 min | | [#039](039-zugang-zur-laufzeit.md) | Auf dem Telefon führte kein Weg zur Laufzeit | erledigt | v0.22.2 | 1 h | 0 h 30 min | -| | **Summe** | | | **163 h** | **21 h 03 min** | +| [#040](040-schlagworte-sichtbar.md) | Schlagworte und Notizen sichtbar machen | erledigt | v0.23.0 | 2 h | 0 h 40 min | +| | **Summe** | | | **165 h** | **21 h 43 min** | diff --git a/package.json b/package.json index f142512..af650d7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "proxledger", - "version": "0.22.2", + "version": "0.23.0", "private": true, "scripts": { "dev": "next dev", diff --git a/src/app/(dashboard)/hosts/[id]/page.tsx b/src/app/(dashboard)/hosts/[id]/page.tsx index 4584442..fceef16 100644 --- a/src/app/(dashboard)/hosts/[id]/page.tsx +++ b/src/app/(dashboard)/hosts/[id]/page.tsx @@ -108,6 +108,27 @@ export default async function HostDetailSeite({ params }: { params: Promise<{ id

{host.hostname}

{host.fqdn ?? "Kein FQDN gemeldet"}
{meldetNicht ? : null} + + {/* Schlagworte und Notiz stehen hier, nicht nur im Reiter – bei gleichnamigen + Hosts ist das die Stelle, an der man sie braucht (#040). */} + {host.tags.length > 0 ? ( +
+ {host.tags.map((tag) => ( + + {tag.name} + + ))} +
+ ) : null} + {host.notizen ? ( +

+ {host.notizen} +

+ ) : null} diff --git a/src/app/(dashboard)/hosts/page.tsx b/src/app/(dashboard)/hosts/page.tsx index b87eb97..02b82c6 100644 --- a/src/app/(dashboard)/hosts/page.tsx +++ b/src/app/(dashboard)/hosts/page.tsx @@ -68,6 +68,7 @@ export default async function HostsSeite({ searchParams }: { searchParams: SuchP const filter: HostFilter = { q: einzeln(roh.q), kunde: einzeln(roh.kunde), + tag: einzeln(roh.tag), status: einzeln(roh.status), produkt: einzeln(roh.produkt), ablauf: einzeln(roh.ablauf) as HostFilter["ablauf"], @@ -85,6 +86,7 @@ export default async function HostsSeite({ searchParams }: { searchParams: SuchP const basis: Record = { q: filter.q, kunde: filter.kunde, + tag: filter.tag, status: filter.status, produkt: filter.produkt, ablauf: filter.ablauf, @@ -117,7 +119,7 @@ export default async function HostsSeite({ searchParams }: { searchParams: SuchP } > - +
@@ -152,7 +154,28 @@ export default async function HostsSeite({ searchParams }: { searchParams: SuchP {host.hostname} {host.meldetNicht ? : null} + {host.notizen ? ( + // Gerade bei gleichnamigen Hosts hilft die Notiz beim Auseinanderhalten (#040). + + ) : null}
{host.ips.join(", ") || "–"}
+ {host.tags.length > 0 ? ( +
+ {host.tags.map((tag) => ( + + {tag.name} + + ))} +
+ ) : null}
{host.kunde ? ( diff --git a/src/components/hosts/HostFilterLeiste.tsx b/src/components/hosts/HostFilterLeiste.tsx index 5e40144..b31d228 100644 --- a/src/components/hosts/HostFilterLeiste.tsx +++ b/src/components/hosts/HostFilterLeiste.tsx @@ -9,9 +9,11 @@ import { usePathname, useRouter, useSearchParams } from "next/navigation"; */ export function HostFilterLeiste({ kunden, + tags, werte, }: { kunden: { id: string; name: string }[]; + tags: string[]; werte: Record; }) { const router = useRouter(); @@ -26,7 +28,7 @@ export function HostFilterLeiste({ router.push(`${pathname}?${neu.toString()}`); } - const aktiveFilter = ["kunde", "status", "produkt", "ablauf", "rechnung", "q"].filter( + const aktiveFilter = ["kunde", "tag", "status", "produkt", "ablauf", "rechnung", "q"].filter( (schluessel) => werte[schluessel], ).length; @@ -76,6 +78,27 @@ export function HostFilterLeiste({ + {tags.length > 0 ? ( +
+ + +
+ ) : null} +