feat(cards): Karten speichern und Meine Karten

- account/cards.ts: Kartendienst (neu/bestehend speichern mit Aufräumen halber
  Uploads, Umbenennen, Löschen, Laden) über ein schmales CardsApi-Interface,
  Appwrite-Anschluss mit 22.4.1-Objektparametern, fetchFile über
  client.prepareRequest (Projekt-Header + Cookie, kein getFileView)
- account/with-login.ts: bei 401 Nutzer neu prüfen, einmal anmelden, wiederholen
- editor/save.ts: Speichern-Ablauf (ein Lauf zur Zeit, 401 -> Login -> einmal
  wiederholen, deutsche Fehlermeldung)
- Editor: Speichern mit Schnappschuss und 480-px-Vorschau, Karte öffnen über
  ?karte=<id>, Bildwechsel während des Speicherns gesperrt
- pages/cards-page.ts: /karten mit Kacheln, Öffnen, Herunterladen, Umbenennen,
  Löschen (eigener Dialog), Abmelde- und Leer-Ansicht
- Tests für Dienst, withLogin, Speichern-Ablauf, Karten-Seite und Editor-Anbindung

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-04 09:18:27 +00:00
1 parent a147d3b496
commit ba4d9f76d4
14 files changed
+2849 -16

No files matched your search

+3 -6
View File
@@ -3,6 +3,7 @@ import './styles.css';
import { mountAccountMenu } from './account/account-menu';
import { getCurrentUser } from './account/auth';
import { startRouter } from './pages/router';
import { mountCardsPage } from './pages/cards-page';
import { mountResetPage } from './pages/reset-page';
import { mountEditor } from './editor/editor-page';
import { createStore, initialEditorState } from './editor/state';
@@ -24,14 +25,10 @@ if (accountSlot) {
startRouter((route, root) => {
if (route === 'editor') {
// Speichern wird mit den Konten (spätere Aufgabe) angebunden; bis dahin passiert nichts.
return mountEditor(root, editorStore, { onSave: () => {} });
return mountEditor(root, editorStore);
}
if (route === 'reset') {
return mountResetPage(root);
}
// Platzhalter, bis die Karten-Seite aus der Folgeaufgabe angebunden ist.
const heading = document.createElement('h1');
heading.textContent = 'Meine Karten';
root.replaceChildren(heading);
return mountCardsPage(root, editorStore);
});