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
+32 -1
View File
@@ -161,7 +161,38 @@ Seed-Daten dadurch synchron direkt aus dem globalen Namespace, ganz ohne
| 4 | Filter- und Suchfunktion (Kategorie, Entfernung, Alter, Kosten, Indoor/Outdoor, Ausstattung, Bewertung, Region) inkl. Anwendung auf Karte + Liste | ✅ umgesetzt |
| 5 | Route/Navigation-Integration | ✅ bereits in Phase 2 erledigt (OSM-Directions-Button in der Detailansicht) |
| 6 | KI-Prompt-Generator (Eingabeformular, Promptgenerierung, Copy/Download) | ✅ umgesetzt |
| 7 | KI-JSON-Import (Validierung, Vorschau, Übernahme ins LocalStorage) + Backup-Export/Import + Politur | offen |
| 7 | KI-JSON-Import (Validierung, Vorschau, Übernahme ins LocalStorage) + Backup-Export/Import | ✅ umgesetzt |
Damit sind alle in `anforderung.md` geforderten Kernfunktionen umgesetzt.
Offen bleibt optionale Politur (Empty-States, A11y-Feinschliff,
Adressgeocoding) — kein Muss laut Anforderung, bei Bedarf als eigene
Folgephase.
## KI-JSON-Import + Backup (Phase 7)
- `js/import/importValidator.js`: reine Funktion `parseAndValidate(jsonText)`
bewertet jeden Ausflugsziel-Eintrag im importierten KI-JSON EINZELN
(kein Alles-oder-nichts). Pflicht für Übernahme: `name`, `category`,
gültige Koordinaten — sonst Ablehnung mit Begründung. Weiche Probleme
(unbekannte Kategorie, unbekannter Kosten-/Umgebungstyp, ungültige
Bewertung, unsichere `website`/`image`-URL) führen zu einer Warnung,
nicht zur Ablehnung; `sanitizeEntry()` setzt diese Felder vor der
Übernahme sicherheitshalber zurück (z.B. `javascript:`-URLs → leerer
String), BEVOR `normalizePlace()` sie verarbeitet, da dieses selbst
keine Sicherheitsprüfung vornimmt. `findDuplicate()` erkennt
wahrscheinliche Duplikate (Name + Koordinaten < 0.3 km) gegen den
bestehenden Datenbestand.
- `js/ui/import.js`: Modal mit zwei Tabs. Tab 1 "KI-Ausflugsziele
importieren": Text einfügen ODER Datei hochladen (`FileReader`) →
Prüfen → Vorschau (gültig/Warnung/abgelehnt, Duplikat-Hinweise, globaler
"Duplikate überspringen"-Toggle) → Bestätigen. Tab 2 "Backup
sichern/wiederherstellen" (`js/import/backup.js`): Export als
JSON-Datei (`downloadTextFile`), Wiederherstellen mit Wahl
"Ersetzen" (mit `confirm()`-Sicherheitsabfrage) oder "Ergänzen"
(Upsert nach `id`).
- Einstiegspunkt: Toolbar-Button "📥 KI-Ausflugsziele importieren".
- Rendering der Vorschau ausschließlich über `el()`/`textContent`, da es
sich um echte, ungeprüfte Fremddaten handelt.
## KI-Prompt-Generator (Phase 6)