Phase 7: KI-JSON-Import und Backup-Export/Import

Neues Modul js/import/ mit reiner Validierungslogik
(importValidator.js: parseAndValidate(), findDuplicate()). Jeder
Ausflugsziel-Eintrag im importierten KI-JSON wird einzeln bewertet statt
alles-oder-nichts: fehlender Name/Kategorie oder ungueltige Koordinaten
fuehren zur Ablehnung, weiche Probleme (unbekannte Kategorie, unsichere
website/image-URL, ungueltige Bewertung, falscher Feldtyp) erzeugen nur
eine Warnung. sanitizeEntry() setzt sicherheitskritische Felder vor der
Uebernahme zurueck (z.B. javascript:-URLs), da normalizePlace() selbst
keine Sicherheitspruefung vornimmt. findDuplicate() erkennt
wahrscheinliche Duplikate gegen den bestehenden Datenbestand.

UI (js/ui/import.js): Modal mit zwei Tabs - KI-Ausflugsziele importieren
(Text einfuegen oder Datei hochladen, Vorschau mit
gueltig/Warnung/abgelehnt, Duplikat-Toggle, Bestaetigen) und Backup
sichern/wiederherstellen (js/import/backup.js: Export als JSON-Datei,
Wiederherstellen mit Ersetzen/Ergaenzen-Wahl). Vorschau-Rendering
ausschliesslich ueber el()/textContent, da es sich um echte, ungepruefte
Fremddaten handelt.

Damit sind alle Kernfunktionen aus anforderung.md umgesetzt.
docs/plan.md entsprechend fortgeschrieben.
This commit is contained in:
2026-07-24 12:50:05 +02:00
parent b49b8f4f47
commit 39321d680f
9 changed files with 1236 additions and 6 deletions
+6 -5
View File
@@ -4,9 +4,10 @@
// Ergebnis live in einem <textarea readonly> an. Bietet zusätzlich Buttons
// zum Kopieren (Zwischenablage) und Speichern als Textdatei.
//
// WICHTIG: Diese Phase implementiert nur die Prompt-Erzeugung. Der spätere
// JSON-Import (Einlesen der KI-Antwort zurück in die App) ist NICHT Teil
// dieser Datei - das folgt in Phase 7.
// WICHTIG: Diese Datei implementiert nur die Prompt-Erzeugung. Der JSON-Import
// (Einlesen der KI-Antwort zurück in die App) ist NICHT Teil dieser Datei,
// sondern liegt in js/ui/import.js (Phase 7, Button "📥 KI-Ausflugsziele
// importieren" in der Toolbar).
//
// Aufbau/Muster analog zu js/ui/form.js (Modal mit Backdrop, Escape schließt,
// Fokus auf erstes Feld beim Öffnen). Rendering ausschließlich über
@@ -278,8 +279,8 @@
}),
el('li', {
text:
'Die JSON-Antwort der KI im nächsten Schritt (KI-JSON-Import, in einer späteren Version ' +
'dieser Anwendung) prüfen und importieren.',
'Die JSON-Antwort der KI kopieren und über den Button "📥 KI-Ausflugsziele importieren" ' +
'(direkt neben diesem Button) prüfen und importieren.',
}),
]),
]),