| 17-eigene-ausschreibungs-quellen-je-nutzer |
03 |
ui |
| nextjs |
| next-intl |
| zustand |
| vitest |
| testing-library |
|
| phase |
provides |
| 17-01 |
TenderEmailConfig per-user, /modules/tender-radar/my-sources (Seite mit Postfach-Abschnitt) |
|
| phase |
provides |
| 17-02 |
RssFeedSource.isPlatformWide-Vertrag (GET/POST /rss-feeds, scope-Wunsch, Besitz-basierter Loeschschutz) |
|
|
| my-sources/page.tsx vollstaendig: Postfach + eigene Feeds + Digest-Intervall auf einer Seite |
| RssFeedListForm mit scope-Prop (personal/platform) — eine Komponente fuer beide Seiten |
| DigestIntervalForm als eigenstaendige Komponente (aus settings/page.tsx herausgeloest) |
| settings/page.tsx auf reine Administration reduziert, Anzeige-Rollenpruefung ueber useAuthStore |
| Zahnrad auf der Modulseite fuehrt zu /my-sources statt /settings |
| REQUIREMENTS.md SRC-01..05 Sektion + Traceability (fehlte bisher trotz Nutzung in 17-01/17-02-SUMMARY) |
|
| dkv-fleet-settings-restructuring |
| future-per-user-module-settings |
|
| tokens |
tasks |
commits |
| 18180 |
3 |
3 |
|
| added |
patterns |
|
|
| Eine Formkomponente mit einem scope-Prop (personal/platform) statt zwei fast identischer Komponenten — der Server entscheidet ueber Berechtigung, das Prop entscheidet nur ueber Darstellung und den scope-Wunsch im Request |
| Anzeige-Rollenpruefung ueber useAuthStore in der Seite selbst (drei Zustaende: unbekannt/Platzhalter, erlaubt/Inhalt, verweigert/Hinweis+Verweis) statt eines Guards oder Redirects — verbindliche Pruefung bleibt serverseitig |
| Verhaltensunveraendertes Herausloesen einer Komponente aus einer Seite ohne neue i18n-Schluessel, wenn nur der Ort wechselt, nicht das Verhalten (DigestIntervalForm) |
|
|
| created |
modified |
| apps/web/src/app/(portal)/modules/tender-radar/settings/components/DigestIntervalForm.tsx |
| apps/web/src/app/(portal)/modules/tender-radar/my-sources/my-sources.test.tsx |
| apps/web/src/app/(portal)/modules/tender-radar/settings/settings-roles.test.tsx |
|
| apps/web/src/lib/tender-radar-api.ts |
| apps/web/src/app/(portal)/modules/tender-radar/settings/components/RssFeedListForm.tsx |
| apps/web/src/app/(portal)/modules/tender-radar/settings/components/RssFeedListForm.test.tsx |
| apps/web/src/app/(portal)/modules/tender-radar/my-sources/page.tsx |
| apps/web/src/app/(portal)/modules/tender-radar/settings/page.tsx |
| apps/web/src/app/(portal)/modules/tender-radar/page.tsx |
| apps/web/src/messages/de.json |
| apps/web/src/messages/en.json |
| .planning/REQUIREMENTS.md |
|
|
| [Rule 3] settings/page.tsx auf RssFeedListForm scope="platform" vorgezogen bereits in Task 1, statt erst in Task 2 — Task 1s eigener Type-Check-Verify verlangt eine kompilierbare RssFeedListForm-Prop-Signatur ueber das ganze Projekt hinweg, gleiches Muster wie in 17-01/17-02 |
| [Rule 1] createRssFeed()-Antwort traegt kein isPlatformWide (nur GET /rss-feeds mappt es serverseitig, T-17-12) — RssFeedListForm setzt das Feld nach dem Anlegen lokal aus dem verwendeten scope, sonst waere ein frisch angelegter plattformweiter Feed bis zum naechsten Neuladen aus seiner eigenen Liste verschwunden |
| page.settingsTitle bleibt bestehen und wird als Verweistext auf der Nutzerseite fuer Administratoren wiederverwendet (Task 1/2), statt eines separaten neuen Schluessels — neuer Schluessel page.mySourcesTitle nur fuer das umgehaengte Zahnrad |
| REQUIREMENTS.md um die SRC-01..05-Sektion und Traceability-Zeilen ergaenzt — Luecke aus Plan 17-01/17-02 (dort bereits requirements-completed im SUMMARY-Frontmatter gefuehrt, aber nie in REQUIREMENTS.md selbst nachgezogen), gehoert inhaltlich zum Requirements-Traceability-Schritt dieses Plans |
|
|
| id |
description |
requirement |
verification |
human_judgment |
| D1 |
"Meine Quellen" traegt alle drei nutzereigenen Abschnitte (Postfach, eigene Feeds, Benachrichtigung) auf einer Seite; ein neu angelegter eigener Feed erscheint sofort in der eigenen Liste; plattformweite Feeds erscheinen darunter als nicht bedienbare Aufzaehlung mit Administrations-Hinweis |
SRC-04 |
| kind |
ref |
status |
| unit |
apps/web/src/app/(portal)/modules/tender-radar/my-sources/my-sources.test.tsx (5 Tests) |
pass |
|
| kind |
ref |
status |
| unit |
apps/web/src/app/(portal)/modules/tender-radar/settings/components/RssFeedListForm.test.tsx (scope=personal-Block, 6 Tests inkl. Mischliste mit/ohne Entfernen-Knopf) |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D2 |
Die Administrationsseite zeigt nur noch Abrufintervall und plattformweite Feeds; ein Konto ohne ADMIN/SUPER_ADMIN-Rolle sieht dort keine Bedienelemente mehr, sondern Hinweis + Verweis auf "Meine Quellen"; waehrend die Rolle noch unbekannt ist, erscheint weder das eine noch das andere |
SRC-05 |
| kind |
ref |
status |
| unit |
apps/web/src/app/(portal)/modules/tender-radar/settings/settings-roles.test.tsx (5 Tests: USER/ADMIN/SUPER_ADMIN/unbekannt/entfernte Ueberschriften) |
pass |
|
| kind |
ref |
status |
| unit |
apps/web/src/app/(portal)/modules/tender-radar/settings/components/RssFeedListForm.test.tsx (scope=platform-Block, 2 Tests: eigene Feeds tauchen dort nicht auf, scope-Parameter im Request) |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
rationale |
| D3 |
Das Zahnrad auf der Modulseite fuehrt jeden Nutzer nach /my-sources statt zur admin-only Administrationsseite; Administratoren erreichen die Administrationsseite von dort mit einem Klick |
SRC-04 |
|
true |
Browser-Gegenprobe (Klick auf das Zahnrad, Navigationsziel im echten Router pruefen) nicht ausgefuehrt — kein Browser-Tool in dieser Session verfuegbar (WINDOWS.md #8/#9). Der Link selbst ist per Testing-Library gegen den gerenderten href geprueft (my-sources.test.tsx, settings-roles.test.tsx), nicht aber die tatsaechliche Client-seitige Navigation im Next.js-Router. |
|
| id |
description |
requirement |
verification |
human_judgment |
| D4 |
Alle neuen Beschriftungen liegen in Deutsch und Englisch vor; keine mehr verwendete Beschriftung bleibt verwaist |
SRC-04 |
| kind |
ref |
status |
| unit |
Node-Skript-Schluesselvergleich beider Sprachdateien (in allen drei Task-<verify>-Bloecken gelaufen) |
pass |
|
|
false |
|
|
62min |
2026-08-12 |
complete |