feat(places): unified file import modal with drag-and-drop and deduplication

- Replace separate GPX and KML/KMZ import buttons with a single "Import
  file" modal accepting all three formats, with a drag-and-drop drop zone
- Support dragging files directly onto the Places sidebar panel; overlay
  appears on hover and pre-loads the file into the modal on drop
- Fix [object Object] description bug in KML imports caused by
  fast-xml-parser returning mixed-content nodes as objects; add stopNodes
  config and object guard in asTrimmedString
- Fix CDATA sections leaking into descriptions (e.g. "text.]]>") by
  unwrapping CDATA markers before tag stripping
- Add import deduplication across all import paths (GPX, KML/KMZ, Google
  list, Naver list): reimporting skips places already in the trip by name
  (case-insensitive) or by coordinates (within ~11 m tolerance), with
  intra-batch dedup so duplicate placemarks within the same file are
  also collapsed
- Fix KML route returning 400 "No valid Placemarks found" when all
  placemarks were valid but deduplicated; 400 now only fires when the
  file contains zero placemarks
- Show a warning toast "All places were already in the trip" instead of
  a misleading success toast when a reimport produces zero new places
  (GPX, KML/KMZ, Google list, Naver list)
- Add 8 new i18n keys across all 14 locales; remove 11 keys made unused
  by the modal consolidation
This commit is contained in:
jubnl
2026-04-15 06:07:26 +02:00
parent 801ffbfb7b
commit 875c91e5ff
22 changed files with 741 additions and 431 deletions
+9 -11
View File
@@ -890,21 +890,19 @@ const hu: Record<string, string | { name: string; category: string }[]> = {
// Helyek oldalsáv
'places.addPlace': 'Hely/Tevékenység hozzáadása',
'places.importGpx': 'GPX',
'places.importKeyholeMarkup': 'KMZ / KML',
'places.importFile': 'Fájl importálása',
'places.sidebarDrop': 'Ejtse el az importáláshoz',
'places.importFileHint': '.gpx, .kml vagy .kmz fájlok importálása olyan eszközökből, mint a Google My Maps, Google Earth vagy egy GPS tracker.',
'places.importFileDropHere': 'Kattintson egy fájl kiválasztásához, vagy húzza ide',
'places.importFileDropActive': 'Ejtse ide a fájlt a kiválasztáshoz',
'places.importFileUnsupported': 'Nem támogatott fájltípus. Használjon .gpx, .kml vagy .kmz fájlt.',
'places.importFileTooLarge': 'A fájl túl nagy. A maximális feltöltési méret {maxMb} MB.',
'places.importFileError': 'Importálás sikertelen',
'places.importAllSkipped': 'Minden hely már szerepel az utazásban.',
'places.gpxImported': '{count} hely importálva GPX-ből',
'places.kmlKmzImported': '{count} hely importálva KMZ/KML-ből',
'places.urlResolved': 'Hely importálva URL-ből',
'places.gpxError': 'GPX importálás sikertelen',
'places.importList': 'Lista importálás',
'places.kmlKmzImportError': 'A KMZ/KML importálás sikertelen',
'places.kmlKmzInvalidType': 'Válassz egy .kml vagy .kmz fájlt.',
'places.kmlKmzTooLarge': 'A fájl túl nagy. A maximális feltöltési méret {maxMb} MB.',
'places.kmlKmzHint': 'Térképfájlok importálása olyan eszközökből, mint a Google My Maps és a Google Earth.',
'places.kmlKmzSizeHint': 'Maximális fájlméret: {maxMb} MB',
'places.kmlKmzSelectFile': 'Fájl kiválasztása',
'places.kmlKmzSelectedFile': 'Kiválasztott fájl: {name}',
'places.kmlKmzSummaryTitle': 'Import összegzés',
'places.kmlKmzSummaryValues': 'Placemarks: {total} • Importálva: {created} • Kihagyva: {skipped}',
'places.importGoogleList': 'Google Lista',
'places.importNaverList': 'Naver Lista',