diff --git a/CHANGELOG.md b/CHANGELOG.md index 58bb7c3..c704d91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ Diese Liste beschreibt in einfachen Worten, was sich von Version zu Version an T ## Unveröffentlicht +### Neu + +- Nach einem Versionswechsel zeigt Tessera bei Ihrer ersten Anmeldung ein Fenster mit den wichtigsten Änderungen der neuen Version – neue Funktionen, Verbesserungen und behobene Fehler. Haben Sie mehrere Versionen verpasst, erscheinen die drei neuesten. „Verstanden“ schließt das Fenster; es erscheint erst mit der nächsten Version wieder, im Browser wie in der Desktop-App. Die vollständige Liste finden Sie weiterhin unter „Was ist neu“. + ## 1.4.0 – 2026-09-25 ### Neu diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts index 9528f49..464691a 100644 --- a/apps/web/next.config.ts +++ b/apps/web/next.config.ts @@ -7,8 +7,10 @@ import createNextIntlPlugin from 'next-intl/plugin'; // dem Wurzelverzeichnis wird hier gelesen und als `env.TESSERA_CHANGELOG_MD` // abgelegt. Next.js ersetzt `process.env.TESSERA_CHANGELOG_MD` fuer webpack UND // Turbopack ueber denselben Define-Mechanismus. Der Text bleibt nur im -// Server-Bundle, weil ausschliesslich die Server-Seite (changelog/page.tsx) -// `@/lib/changelog` importiert — Importdisziplin, kein Client-Chunk. +// Server-Bundle, weil ausschliesslich Server-Code `@/lib/changelog` importiert: +// die Server-Seite (changelog/page.tsx) und die 'use server'-Datei +// lib/release-notice-actions.ts (quick-260925-bow) — Importdisziplin, kein +// Client-Chunk. const withNextIntl = createNextIntlPlugin('./src/i18n/request.ts'); diff --git a/apps/web/src/lib/changelog.ts b/apps/web/src/lib/changelog.ts index 956c0d0..d743c8e 100644 --- a/apps/web/src/lib/changelog.ts +++ b/apps/web/src/lib/changelog.ts @@ -5,9 +5,11 @@ import type { AppChannel } from './app-version'; * * Quelle ist CHANGELOG.md im Wurzelverzeichnis; `apps/web/next.config.ts` liest * die Datei zur Bauzeit und legt den Text als `env.TESSERA_CHANGELOG_MD` ab. - * Dieses Modul darf NUR von der Server-Seite (`app/(portal)/changelog/page.tsx`) - * importiert werden — sonst landet der Text in oeffentlich abrufbaren - * Client-Chunks unter /_next/static. + * Dieses Modul darf NUR von Server-Code importiert werden — der Server-Seite + * (`app/(portal)/changelog/page.tsx`) und der `'use server'`-Datei + * `release-notice-actions.ts` ("Was ist neu"-Fenster, quick-260925-bow), nie + * von Client-Komponenten und auch nicht von `release-notes.ts` — sonst landet + * der Text in oeffentlich abrufbaren Client-Chunks unter /_next/static. * * Kanalregel (`filterChangelogForChannel`): auf `live` fehlt der Abschnitt * "Unveröffentlicht" vollstaendig; auf `beta` und `dev` bleibt er und traegt diff --git a/docs/anleitung-anwender.md b/docs/anleitung-anwender.md index e5f6d65..6e7b05d 100644 --- a/docs/anleitung-anwender.md +++ b/docs/anleitung-anwender.md @@ -272,6 +272,10 @@ Ein Klick auf die Versionsnummer ganz unten in der Seitenleiste öffnet die Seit Auf dem Live-System sehen Sie nur freigegebene Versionen. Auf der Beta erscheint zusätzlich der Abschnitt **Noch nicht freigegeben (Beta)** mit einem gelben Hinweis: Diese Punkte sind in der Beta bereits enthalten, aber noch nicht als Version freigegeben. +**Fenster nach einem Versionswechsel:** Wenn Tessera auf eine neue Version aktualisiert wurde, erscheint bei Ihrer ersten Anmeldung danach einmal ein Fenster **Neu in Version …**. Es zeigt die für Sie wichtigen Änderungen, gegliedert in **Neu**, **Verbessert** und **Behoben**. Haben Sie mehrere Versionen verpasst, sehen Sie höchstens die drei neuesten; ein Satz im Fenster nennt dann, wie viele ältere Versionen es noch gibt. Unten führt der Link **Alle Änderungen ansehen** zur vollständigen Seite **Was ist neu**. + +Sie schließen das Fenster mit **Verstanden**, mit dem Kreuz oben rechts, mit der Escape-Taste oder mit einem Klick neben das Fenster. Tessera merkt sich das für Ihr Konto: Das Fenster erscheint pro Version nur einmal – auch in der Desktop-App nicht noch einmal – und erst mit der nächsten Version wieder. Neu angelegte Konten sehen das Fenster erst ab der nächsten Version. Punkte, die auf der Beta unter **Noch nicht freigegeben (Beta)** stehen, kommen in diesem Fenster nicht vor; sie erscheinen dort erst, wenn die Version freigegeben ist. + ## Häufige Stolpersteine - **Die Anmeldung schlägt fehl, obwohl Passwort und E-Mail stimmen.** Prüfen Sie, ob Sie im Feld „Benutzername" tatsächlich Ihren Benutzernamen eingegeben haben — nicht Ihre E-Mail-Adresse. Das ist mit Abstand der häufigste Grund für eine scheinbar kaputte Anmeldung. diff --git a/docs/anleitung-entwicklung.md b/docs/anleitung-entwicklung.md index 3574f10..c544484 100644 --- a/docs/anleitung-entwicklung.md +++ b/docs/anleitung-entwicklung.md @@ -645,13 +645,38 @@ keine Commit-Kürzel, keine unerklärten Fachbegriffe. Bei der Freigabe wird der Betriebshandbuch Kapitel 9). Die Seite „Was ist neu“ (`apps/web/src/app/(portal)/changelog/page.tsx`) liest den Text zur Bauzeit aus `env.TESSERA_CHANGELOG_MD`, das `apps/web/next.config.ts` aus der Datei befüllt — deshalb steht `COPY CHANGELOG.md ./` im Web-Dockerfile und `!CHANGELOG.md` als -Ausnahme in `.dockerignore`. Nur `page.tsx` darf `@/lib/changelog` importieren, damit der Text im -Server-Bundle bleibt und nicht in öffentlich abrufbare Client-Chunks gelangt. Die Kanalregel (Live +Ausnahme in `.dockerignore`. Nur Server-Code darf `@/lib/changelog` importieren: `page.tsx` und die +`'use server'`-Datei `apps/web/src/lib/release-notice-actions.ts` — nie eine Client-Komponente, auch +nicht `apps/web/src/lib/release-notes.ts` (dessen Typen nutzen Client-Komponenten). So bleibt der +Text im Server-Bundle und gelangt nicht in öffentlich abrufbare Client-Chunks. Die Kanalregel (Live ohne „Unveröffentlicht“, Beta/Entwicklung mit „Noch nicht freigegeben (Beta)“) liegt in `filterChangelogForChannel` (`apps/web/src/lib/changelog.ts`) mit Tests. Beim Tag `vX.Y.Z` schneidet `.gitea/scripts/publish-release.sh` den Abschnitt der Version heraus und legt daraus den Gitea-Release an — fehlt der Abschnitt, bricht dieser CI-Schritt mit Exit 1 ab. +**„Was ist neu“-Fenster nach einem Versionswechsel (quick-260925-bow):** Beim ersten Laden des +Portal-Rahmens nach einem Versionswechsel zeigt `ReleaseNoticeHost` (in `AppShell`, also nie auf +der Anmeldeseite; nicht auf `/change-password`) einmal ein Fenster mit den Gruppen Neu / Geändert +(angezeigt als „Verbessert“) / Behoben der verpassten Versionen, höchstens drei, neueste zuerst. +Einzige Quelle der laufenden Version ist `APP_VERSION` der API, gelesen über `getRunningRelease()` +in `apps/api/src/health/app-version.ts` — nicht `NEXT_PUBLIC_APP_VERSION` des Webs. Grund: der +LDAP-Abgleich (Zeitplan) und der Erst-Administrator (API-Start) legen Benutzer ohne jede +Web-Anfrage an und tragen dabei die laufende Version ein; ebenso prüft der Merk-Endpunkt gegen +diesen Wert. Endpunkte: `GET /users/me/release-notice` liefert `currentRelease` und den gemerkten +Stand; `POST /users/me/release-seen` mit `{ version }` nimmt nur die kanonische Form `X.Y.Z` an, +die nicht über der laufenden Version liegt, senkt einen gemerkten Stand nie ab und schreibt +ausschließlich die eigene Zeile (`forTenant()`, `where: { id: currentUser.id }`). Gemerkt wird erst +beim Schließen, nie beim Öffnen. Spalte `User.lastSeenReleaseVersion`: `null` = Bestandsbenutzer, +dann zeigt das Fenster nur die laufende Version; `UserService.create()` und der Admin-Seed tragen +bei der Anlage die laufende Version ein. `parseReleaseVersion`/`compareReleaseVersions` stehen einmal +in `packages/shared/src/index.ts` (Laufzeit-Import in API und Web). Die Auswahl der Abschnitte +macht `selectReleaseNotice` in `apps/web/src/lib/release-notes.ts`. Folge für die Freigabe: erst ein +Tag `vX.Y.Z` (auf der Beta dessen Describe-Stand `vX.Y.Z-N-g`, gekürzt auf `X.Y.Z`) löst das +Fenster aus; Punkte unter „Unveröffentlicht“ erscheinen darin nie. Lokal steht `APP_VERSION` auf +`dev` — dann erscheint nie ein Fenster; zum Ausprobieren beim Bau `--build-arg APP_VERSION=1.4.0` +setzen. Fehlt der Abschnitt der laufenden Version in der Änderungsliste des Web-Abbilds, entsteht +kein Fenster und nichts wird gemerkt. + **i18n — Schlüsselparität zwischen de.json und en.json:** Jeder benutzersichtbare Text gehört in beide Sprachdateien, `apps/web/src/messages/de.json` und `apps/web/src/messages/en.json`. Ein strukturelle Wächter-Test, `apps/web/src/messages/tenderRadar-parity.spec.ts`, prüft für den