diff --git a/CHANGELOG.md b/CHANGELOG.md index e9b20e2..551924f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,15 @@ und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/). ### Sicherheit +## [0.22.2] – 2026-10-03 + +### Behoben +- **Auf dem Telefon führte kein Weg zu den Rechnungsformularen**: Im Reiter *Rechnungen* der Host-Detailansicht war die Laufzeit nicht verlinkt, und in der Rechnungsliste ist diese Spalte erst ab 992 px sichtbar (#039) +- Der Reiter *Rechnungen* rechnete den Einkauf noch ohne Rabatt (#039) + +### Geändert +- Der Reiter *Rechnungen* nutzt auf dem Telefon das Kartenlayout (#039) + ## [0.22.1] – 2026-10-03 ### Behoben diff --git a/DEVLOG.md b/DEVLOG.md index 4e8cd68..8471721 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -2,7 +2,7 @@ ## Zeitübersicht -**Gesamt:** 20 h 33 min +**Gesamt:** 21 h 03 min | Issue | Zeit | |---|---| @@ -44,6 +44,7 @@ | #036 Standort am Host | 0 h 30 min | | #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 | | Meilenstein | Zeit | |---|---| @@ -66,7 +67,7 @@ ## 2026-09-17 · Sitzung 1 · 19:36–laufend **Issue:** #001–#007 (Meilensteine v0.1.0 bis v0.4.0) -**Version:** 0.22.1 +**Version:** 0.22.2 ### Erledigt - Auftrag gelesen, Rückfragen gestellt @@ -199,6 +200,10 @@ - Dabei einen eigenen Fehler aus #037 gefunden: Die Detailseite rechnete weiter mit dem Listenpreis. Beim Ändern einer Rechengröße reicht es nicht, die Abfragen anzupassen – auch die Seiten rechnen selbst - Das Aufnahme-Skript kann jetzt gezielt in Telefonbreite aufnehmen; damit ließ sich die Behebung belegen statt nur behaupten +- #039: Auf dem Telefon führte kein Weg zu den Rechnungsformularen – die Laufzeit war nicht verlinkt und die Spalte erst ab 992 px sichtbar +- 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 + ### 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/bilder/benutzer.png b/docs/anleitung/bilder/benutzer.png index a9a07b1..4b6b576 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 f1b31f2..98dbe57 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/kunden.png b/docs/anleitung/bilder/kunden.png index 270aa61..cd87307 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 46dbca5..40f4441 100644 Binary files a/docs/anleitung/bilder/login.png and b/docs/anleitung/bilder/login.png differ diff --git a/docs/anleitung/bilder/nicht-zugeordnet.png b/docs/anleitung/bilder/nicht-zugeordnet.png index 73f7b4a..b5fc5b7 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 e0b3fa9..fd7968e 100644 Binary files a/docs/anleitung/bilder/passkeys.png and b/docs/anleitung/bilder/passkeys.png differ diff --git a/docs/anleitung/bilder/rechnungen.png b/docs/anleitung/bilder/rechnungen.png index 374f1b3..8006da0 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 652df75..e64995d 100644 Binary files a/docs/anleitung/bilder/tokens.png and b/docs/anleitung/bilder/tokens.png differ diff --git a/docs/issues/039-zugang-zur-laufzeit.md b/docs/issues/039-zugang-zur-laufzeit.md new file mode 100644 index 0000000..847d340 --- /dev/null +++ b/docs/issues/039-zugang-zur-laufzeit.md @@ -0,0 +1,32 @@ +# #039 Auf dem Telefon führte kein Weg zur Laufzeit +**Status:** erledigt +**Meilenstein:** v0.22.2 +**Labels:** bug, ui +**Geschätzt:** 1 h **Tatsächlich:** 0 h 30 min + +## Auslöser +„Kann ich am Handy nicht rein.“ Gemeint war der Reiter *Rechnungen* in der Host-Detailansicht: Die +Zeile zeigt Laufzeit, Rechnung und Beträge – aber nichts davon war anklickbar. + +## Ursache +Zwei Stellen: + +1. In der Host-Detailansicht war die Laufzeit nie verlinkt, auch am Rechner nicht. Man kam nur über + die Rechnungsliste dorthin. +2. In der Rechnungsliste ist die Laufzeit-Spalte erst ab 992 px eingeblendet. Auf dem Telefon fehlte + damit der einzige Verweis auf die Formulare – die Karte verwies nur auf den Host. + +## Behebung +- Die Laufzeit in der Host-Detailansicht ist ein Link und zugleich die Überschrift der Karte +- In der Rechnungsliste bleibt die Laufzeit auf dem Telefon sichtbar; ausgeblendet wird sie nur + zwischen 768 und 992 px, wo die Tabelle am engsten ist +- Der Reiter *Rechnungen* nutzt ebenfalls das Kartenlayout + +## Nebenbefund +Auch dieser Reiter rechnete den Einkauf noch ohne Rabatt – 1.100 € statt 990 €. Dritte Stelle nach +#037 und #038; alle gefunden, weil Florian die Zahl auf dem Bildschirm mit seiner Rechnung verglichen hat. + +## Gelernt +Bootstraps `d-*`-Hilfsklassen setzen `display` mit `!important` und überschreiben damit das +Kartenlayout. Für Spalten, die in der Kartenansicht sichtbar bleiben sollen, braucht es eine eigene +Klasse (`pl-spalte-laufzeit`). diff --git a/docs/issues/README.md b/docs/issues/README.md index 82cf4c7..e4ea257 100644 --- a/docs/issues/README.md +++ b/docs/issues/README.md @@ -42,4 +42,5 @@ Details und Architektur: [../architektur.md](../architektur.md). Zeiten werden a | [#036](036-standort-am-host.md) | Standort am Host setzen | erledigt | v0.21.0 | 1 h | 0 h 30 min | | [#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 | -| | **Summe** | | | **162 h** | **20 h 33 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** | diff --git a/package.json b/package.json index fe01a3b..f142512 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "proxledger", - "version": "0.22.1", + "version": "0.22.2", "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 19c400e..4584442 100644 --- a/src/app/(dashboard)/hosts/[id]/page.tsx +++ b/src/app/(dashboard)/hosts/[id]/page.tsx @@ -346,7 +346,7 @@ export default async function HostDetailSeite({ params }: { params: Promise<{ id icon: "bi-receipt", inhalt: (
| Laufzeit | @@ -359,21 +359,28 @@ export default async function HostDetailSeite({ params }: { params: Promise<{ id|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| - {formatDatum(laufzeit.start)} – {formatDatum(laufzeit.ende)} + | + + {formatDatum(laufzeit.start)} – {formatDatum(laufzeit.ende)} + {laufzeit.status === "VORSCHLAG" ? ( Vorschlag ) : null} | -+ |
|
- {formatEuro(einkauf)} | -+ | {formatEuro(einkauf)} | +
|
- {formatEuro(verkauf)} | -+ | {formatEuro(verkauf)} | +{einkauf !== null && verkauf !== null ? formatEuro(verkauf - einkauf) : "–"} diff --git a/src/app/(dashboard)/rechnungen/page.tsx b/src/app/(dashboard)/rechnungen/page.tsx index 95e096c..2ab560c 100644 --- a/src/app/(dashboard)/rechnungen/page.tsx +++ b/src/app/(dashboard)/rechnungen/page.tsx @@ -204,7 +204,7 @@ export default async function RechnungenSeite({ searchParams }: { searchParams: | Host | -+ | Laufzeit | Proxmox-Rechnung | @@ -254,7 +254,7 @@ export default async function RechnungenSeite({ searchParams }: { searchParams: {zeile.hostname} -+ | {formatDatum(zeile.start)} – {formatDatum(zeile.ende)} diff --git a/src/app/globals.css b/src/app/globals.css index 31587ef..20ae06d 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -401,6 +401,18 @@ body { max-width: calc(100vw - 1rem); } +/* + * Die Laufzeit-Spalte ist auf dem Telefon der einzige Weg zu den Rechnungsformularen, deshalb + * bleibt sie dort sichtbar. Zwischen 768 und 992 px ist die Tabelle am engsten – dort entfällt sie. + * Bewusst eine eigene Klasse statt der Bootstrap-Hilfsklassen: deren `display: … !important` + * überschreibt das Kartenlayout (#039). + */ +@media (min-width: 768px) and (max-width: 991.98px) { + .pl-spalte-laufzeit { + display: none; + } +} + /* ---------- Mobil ---------- */ @media (max-width: 575.98px) { |