Files
tessera-ctl/.planning/quick/261008-who-eigene-module-beim-start-vorladen/261008-who-SUMMARY.md
T
schalli 41a57543f9
Tessera CI/CD / Lint & Type Check (push) Successful in 1m9s
Tessera CI/CD / Tests (push) Successful in 2m2s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 20s
Tessera CI/CD / Build & Publish Images (push) Successful in 4m41s
docs(quick-261008-who): Eigene Module vorladen; Auftrag Cert-Manager-Umbau
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-09 09:25:59 +02:00

6.7 KiB

phase, plan, subsystem, tags, requires, provides, affects, key-files, decisions, metrics, status, actuals, plan_head_before, plan_head_after, commits
phase plan subsystem tags requires provides affects key-files decisions metrics status actuals plan_head_before plan_head_after commits
261008-who-eigene-module-beim-start-vorladen 01 custom-modules
preload
iframe
prisma
nestjs
nextjs
zustand
261008-w5w
Benutzer-Einstellung 'Beim Start vorladen' je eigenem Modul (User.customModulePreloadIds, PUT /custom-modules/:id/preload)
Vorlade-Planer + Preloader-Komponente (verzoegert, gestaffelt, unsichtbar)
Offenhalten-Grenze 8, gepinnte Module nie per LRU verworfen
custom-modules
app-shell
settings/custom-modules
created modified
apps/api/prisma/migrations/20261008210000_user_custom_module_preload/migration.sql
apps/web/src/lib/custom-module-preload.ts
apps/web/src/components/modules/custom-module-preloader.tsx
apps/web/src/components/custom-modules/custom-module-preload-settings.tsx
.planning/quick/261008-who-eigene-module-beim-start-vorladen/e2e/e2e-preload-api.sh
apps/api/prisma/schema.prisma
apps/api/src/custom-modules/*
apps/api/src/user/user.controller.ts
apps/web/src/lib/stores/custom-module-cache-store.ts
apps/web/src/components/modules/custom-module-frame-host.tsx
apps/web/src/components/modules/custom-module-view.tsx
apps/web/src/components/layout/app-shell.tsx
apps/web/src/messages/de.json
apps/web/src/messages/en.json
docs/anleitung-anwender.md
docs/mandantentrennung-zugriffsklassifikation.md
CHANGELOG.md
packages/shared/src/index.ts
Speicherort: Spalte User.customModulePreloadIds (TEXT[]) statt eigener Tabelle - Benutzerzeile steht schon unter Zeilenschutz, keine neue RLS-Regel; tote Kennungen werden beim Lesen geschnitten, beim Schreiben entfernt
Schalter an zwei Orten: App-Leiste der Modulansicht und Karte in Einstellungen -> Eigene Module (alle sichtbaren Module, Zaehler x von 8)
Grenze acht gesamt; gepinnte zaehlen mit, werden nie verworfen; Server begrenzt Vorladen auf acht (409)
tasks commits plan_head_before plan_head_after
3 3 1bb869a7b5 86495ae71b
complete
tokens tasks commits
60000 3 3
1bb869a7b5 86495ae71b 3

Phase 261008-who Plan 01: Eigene Module beim Start vorladen Summary

Pro Benutzer serverseitig gespeicherte Wahl "Beim Start vorladen" fuer eigene Module; Tessera laedt die gewaehlten Module 2 s nach dem Start gestaffelt (1,5 s Abstand) unsichtbar im bestehenden Rahmen-Behaelter, der erste Klick uebernimmt denselben iframe-Knoten ohne Neuladen; Offenhalten-Grenze von fuenf auf acht.

Commits

  • ac10449 feat: Durchstich (Migration, API, Planer, Preloader, Speicher, Behaelter, E2E-Skript)
  • c7b6a4b feat: Schalter, Grenze acht mit gepinnten Modulen, Einstellungen-Karte, Texte de/en
  • 86495ae docs: Anleitung und CHANGELOG

Wichtige Angaben

  • Migrations-Zeitstempel: 20261008210000 (_user_custom_module_preload), auf dem lokalen Stand angewendet (Spalte vorhanden, prisma migrate status sauber).
  • Verhalten bei mehr als acht: Server liefert 409 beim neunten Vorladen (tote Kennungen zaehlen nicht mit), Oberflaeche zeigt Hinweis, Kontrollkaestchen der Karte werden bei acht gesperrt. Extremfall: acht gepinnt plus ein aktives, nicht gepinntes = neun Rahmen; ein weiteres nicht gepinntes verdraengt das vorige.
  • docs/anleitung-entwicklung.md: per grep geprueft, keine Beschreibung der Architektur eigener Module/des Rahmen-Behaelters -> unveraendert.
  • Modul-Changelog (261008-w5w): kein Eintrag; eigene Module stehen nicht im Modul-Register (leere Liste). Nur Gesamt-CHANGELOG ("Unveroeffentlicht": Neu + Geaendert). Der alte Punkt "fuenf zuletzt benutzten" in einer freigegebenen Version bleibt als Historie stehen.
  • Antworten mit Benutzerzeile: user.controller.ts entfernt customModulePreloadIds aus den drei Antworten, die die ganze Zeile zurueckgaben (T-WHO-02); Listen nutzen select.

Tests

  • API: 152 Dateien / 3049 Tests gruen (inkl. rls-coverage, rls-access-inventory); tsc --noEmit sauber.
  • Web: 148 Dateien / 1695 Tests gruen; tsc --noEmit sauber.
  • E2E e2e-preload-api.sh gegen neu gebauten Stack: e2e preload api ok (1-8 ok, 9 -> 409, "ja" -> 400, Zufalls-UUID -> 404, Aufraeumen).
  • Biome lint auf den geaenderten Dateien ohne neue Befunde (vorhandene Warnung in module-tile.tsx, Format-Abweichungen in user.controller.ts/shared index.ts bestanden schon).

Browser-Messwerte (Chromium, Dunkelmodus, Neuladen mit bestehender Sitzung; .playwright-mcp/custom-module-preload/t3-measure.json)

Messwert Ergebnis
frameCountAtStart 2 (A, B; C nie)
allHiddenAtStart / allWidthPositiveAtStart true / true (Breite 1136 px)
firstFrameAppearMs 2539 (loadEventEnd 339)
gapBetweenFramesMs 1500
sameNodeAfterClick true (2 Rahmen, derselbe Knoten)
loadsAfterClick 0
visibleAfterClick true (1136 x 828)
notPreloadedFramePresent false
Abmelden 0 Rahmen; erneute Anmeldung: nur A und B

Bildschirmfotos: t3-dark-preloaded-open.png, t3-dark-settings.png (Karte "Beim Start vorladen", Zaehler 1 von 8). Probe-Module per curl geloescht.

Deviations from Plan

Auto-fixed Issues

1. [Rule 1 - Bug] setPinned ignorierte die Serverwahl bei noch nicht offenem Rahmen

  • Found during: Aufgabe 2 (Test Modulansicht)
  • Issue: setPinned(id, true) verlangt einen offenen Rahmen; beim ersten Laden der Modulansicht ist der Rahmen noch nicht in openIds, die Serverwahl wurde nicht gepinnt.
  • Fix: Die Ansicht und die Einstellungen-Karte rufen fuer "an" preload(mod) (nur bei gueltiger https-Adresse), fuer "aus" setPinned(id, false).
  • Files modified: custom-module-view.tsx, custom-module-preload-settings.tsx
  • Commit: c7b6a4b

2. [Rule 3 - Blocking] Seitentest der Einstellungen zaehlte Listenaufrufe

  • Issue: Die neue Karte ruft ebenfalls listCustomModules, der bestehende Test erwartet zwei Aufrufe.
  • Fix: Karte im Seitentest per vi.mock ausgeblendet (eigener Test fuer die Karte).
  • Commit: c7b6a4b

3. Fortsetzung nach abgebrochenem Lauf: Aufgabe 1 war als unversionierter Arbeitsstand vorhanden; nach Pruefung (Tests, tsc, Migration angewendet, E2E) unveraendert uebernommen und committet.

Sonst: Plan wie geschrieben.

Known Stubs

None.

Threat Flags

None - neue Route ist im Bedrohungsmodell (T-WHO-01..05) abgedeckt.

Hinweise

  • Tote Kennungen geloeschter Module bleiben in der Benutzerzeile, bis der Benutzer das naechste Mal schreibt (Entwurfsentscheidung).
  • Nicht gepusht.

Self-Check: PASSED

Commits ac10449, c7b6a4b, 86495ae vorhanden; SUMMARY, Migration, Planer, Preloader, Karte, E2E-Skript vorhanden.