schalli
61f95c8c52
feat(260923-lrr): Web — versionierte Symbol-Adresse, Datei-Auswahl, Entfernen-Knopf
...
- favorites-api.ts: FavoriteRequestError (Grund iconUrlUnreachable/iconTooLarge/
iconInvalidType/iconUploadFailed), uploadFavoriteIcon/removeFavoriteIcon,
FAVORITE_ICON_MAX_BYTES, Felder uploadedIconMime/iconVersion
- favorites-widget.tsx: Proxy-Bild traegt ?v=<iconVersion> (Cache-Bust nach
Aenderung), Remount-Key um iconVersion/uploadedIconMime erweitert, eigenes
Symbol im Hinzufuegen- und Bearbeitungsformular waehlen, Entfernen-Knopf,
Fehlermeldung (role=alert) im Formular, Platzhalter jetzt uebersetzbar
- de.json/en.json: neun neue Texte unter widgets.favorites
- CHANGELOG.md und Anwenderhandbuch ergaenzt
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com >
2026-09-23 16:13:05 +02:00
schalli
b18ac25ccc
feat(web): Favoriten-Widget — Symbol-Ersatzweg aus dem Browser, Sortierpfeile im Bearbeitungsmodus
...
- FavoriteIcon (favorites-widget.tsx): dreistufiger Ersatzweg proxy ->
direct -> none; Buchstaben-Platzhalter liegt immer darunter. Direktbild
nur bei http/https-URL (getDirectFaviconSrc), referrerPolicy
no-referrer, kein Drittanbieter-Favicon-Dienst. key={iconUrl|url}
setzt die Stufe bei Aenderung zurueck; kein style.display-Hack mehr
- handleMove + Sortierpfeile im Bearbeitungsmodus (nur bei nicht-inline-
Bearbeitung): optimistische Neuberechnung, PUT /favorites/order ueber
reorderFavorites; erster/letzter Eintrag deaktiviert; Fehler ->
Neuladen mit Fehlermeldung
- favorites-api.ts: reorderFavorites(widgetId, ids)
- de.json/en.json: widgets.favorites.moveUpButton/moveDownButton
- 5 neue Widget-Tests (Ersatzbild-Kette, Nicht-http-URL, Pfeilzustand,
Klick, Fehlerpfad); 11 bestehende unveraendert gruen; volle Web-Suite
64 Dateien/429 Tests und type-check gruen
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-17 14:40:09 +02:00
schalli
cc6f5ae893
feat(08-03): FavoritesWidget frontend + API client + page.tsx wiring (GREEN)
...
- favorites-api.ts: FavoriteLink type + fetchFavorites/createFavorite/updateFavorite/deleteFavorite
all use credentials: include and API_URL/favorites
- favorites-widget.tsx: list/grid view, inline add/edit/delete in edit mode,
icon + letter fallback, rel=noreferrer + target=_blank, no dangerouslySetInnerHTML (T-08-07)
- useEffect deps fixed to [instanceId] only — excludes t() to prevent re-fetch on each render
- page.tsx: wireFavoritesWidget(FavoritesWidget) wired
- Full test suite: 81/81 pass (17 test files)
- Web TypeScript: clean
2026-07-01 10:34:11 +02:00