mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-19 13:21:46 +00:00
* feat(places): enrich list-imported places via the Places API (#886) Google/Naver list imports only carry a name and coordinates, so the places open as bare pins — the Maps tab jumps to coordinates, with no photo, address or open/closed. Add an opt-in "Enrich places via Google" toggle to the list-import dialog, shown only when a Google Maps key is configured. When enabled, after the (fast, unchanged) import the server runs a background pass that re-resolves each place by name — biased to and validated against the imported coordinates so a common-name search cannot overwrite the wrong place — and fills the empty address/website/phone/photo columns plus the resolved google_place_id, pushing each row over the live sync. Opening hours and the proper Maps link then work on demand from the stored id. Enrichment only fills empty fields, runs detached so a long list never blocks the import, and no-ops when no key is configured. * fix(places): use the ToggleSwitch component for the enrich toggle Match the rest of the app — the import-enrichment opt-in used a raw checkbox; swap it for the shared ToggleSwitch (text left, switch right) like the settings toggles.
This commit is contained in:
@@ -88,5 +88,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'فشل الحفظ',
|
||||
'places.duplicateExists': "'{name}' موجود بالفعل في هذه الرحلة.",
|
||||
'places.addAnyway': 'الإضافة على أي حال',
|
||||
'places.enrichOnImport': 'إثراء الأماكن عبر Google',
|
||||
'places.enrichOnImportHint':
|
||||
'يبحث عن كل مكان مستورد لإضافة الصور والعنوان وبيانات الاتصال. يتطلب مفتاح خرائط Google.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -90,5 +90,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'Falha ao salvar',
|
||||
'places.duplicateExists': "'{name}' já está nesta viagem.",
|
||||
'places.addAnyway': 'Adicionar mesmo assim',
|
||||
'places.enrichOnImport': 'Enriquecer lugares via Google',
|
||||
'places.enrichOnImportHint':
|
||||
'Busca cada lugar importado para adicionar fotos, endereço e contato. Usa sua chave do Google Maps.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -89,5 +89,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'Uložení se nezdařilo',
|
||||
'places.duplicateExists': "'{name}' už v tomto výletu existuje.",
|
||||
'places.addAnyway': 'Přesto přidat',
|
||||
'places.enrichOnImport': 'Obohatit místa přes Google',
|
||||
'places.enrichOnImportHint':
|
||||
'Vyhledá každé importované místo a doplní fotky, adresu a kontakty. Vyžaduje klíč Google Maps.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -90,5 +90,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'Fehler beim Speichern',
|
||||
'places.duplicateExists': "'{name}' ist bereits in dieser Reise.",
|
||||
'places.addAnyway': 'Trotzdem hinzufügen',
|
||||
'places.enrichOnImport': 'Orte über Google anreichern',
|
||||
'places.enrichOnImportHint':
|
||||
'Sucht jeden importierten Ort nach, um Fotos, Adresse und Kontaktdaten zu ergänzen. Nutzt deinen Google-Maps-Key.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -89,5 +89,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'Failed to save',
|
||||
'places.duplicateExists': "'{name}' is already in this trip.",
|
||||
'places.addAnyway': 'Add anyway',
|
||||
'places.enrichOnImport': 'Enrich places via Google',
|
||||
'places.enrichOnImportHint':
|
||||
'Look up each imported place to fill in photos, address and contact details. Uses your Google Maps key.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -90,5 +90,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'No se pudo guardar',
|
||||
'places.duplicateExists': "'{name}' ya está en este viaje.",
|
||||
'places.addAnyway': 'Añadir de todos modos',
|
||||
'places.enrichOnImport': 'Enriquecer lugares con Google',
|
||||
'places.enrichOnImportHint':
|
||||
'Busca cada lugar importado para añadir fotos, dirección y datos de contacto. Usa tu clave de Google Maps.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -91,5 +91,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': "Échec de l'enregistrement",
|
||||
'places.duplicateExists': "'{name}' est déjà dans ce voyage.",
|
||||
'places.addAnyway': 'Ajouter quand même',
|
||||
'places.enrichOnImport': 'Enrichir les lieux via Google',
|
||||
'places.enrichOnImportHint':
|
||||
'Recherche chaque lieu importé pour ajouter photos, adresse et coordonnées. Utilise votre clé Google Maps.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -92,5 +92,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'Αποτυχία αποθήκευσης',
|
||||
'places.duplicateExists': "Το '{name}' υπάρχει ήδη σε αυτό το ταξίδι.",
|
||||
'places.addAnyway': 'Προσθήκη ούτως ή άλλως',
|
||||
'places.enrichOnImport': 'Εμπλουτισμός τόπων μέσω Google',
|
||||
'places.enrichOnImportHint':
|
||||
'Αναζητά κάθε εισαγόμενο μέρος για να προσθέσει φωτογραφίες, διεύθυνση και στοιχεία επικοινωνίας. Απαιτεί κλειδί Google Maps.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -91,5 +91,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'Nem sikerült menteni',
|
||||
'places.duplicateExists': "A(z) '{name}' már szerepel ebben az utazásban.",
|
||||
'places.addAnyway': 'Hozzáadás mindenképp',
|
||||
'places.enrichOnImport': 'Helyek gazdagítása a Google-lel',
|
||||
'places.enrichOnImportHint':
|
||||
'Minden importált helyet megkeres, hogy fotókat, címet és elérhetőséget adjon hozzá. Google Maps-kulcs szükséges.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -90,5 +90,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'Gagal menyimpan',
|
||||
'places.duplicateExists': "'{name}' sudah ada di perjalanan ini.",
|
||||
'places.addAnyway': 'Tetap tambahkan',
|
||||
'places.enrichOnImport': 'Perkaya tempat via Google',
|
||||
'places.enrichOnImportHint':
|
||||
'Mencari setiap tempat yang diimpor untuk menambahkan foto, alamat, dan kontak. Memerlukan kunci Google Maps.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -90,5 +90,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'Impossibile salvare',
|
||||
'places.duplicateExists': "'{name}' è già in questo viaggio.",
|
||||
'places.addAnyway': 'Aggiungi comunque',
|
||||
'places.enrichOnImport': 'Arricchisci i luoghi con Google',
|
||||
'places.enrichOnImportHint':
|
||||
'Cerca ogni luogo importato per aggiungere foto, indirizzo e contatti. Usa la tua chiave Google Maps.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -91,5 +91,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': '保存に失敗しました',
|
||||
'places.duplicateExists': '「{name}」はすでにこの旅程に含まれています。',
|
||||
'places.addAnyway': 'それでも追加',
|
||||
'places.enrichOnImport': 'Googleで場所を補完',
|
||||
'places.enrichOnImportHint':
|
||||
'インポートした各場所を検索して、写真・住所・連絡先を追加します。Google Maps キーが必要です。',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -88,5 +88,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': '저장 실패',
|
||||
'places.duplicateExists': "'{name}'은(는) 이미 이 여행에 있습니다.",
|
||||
'places.addAnyway': '그래도 추가',
|
||||
'places.enrichOnImport': 'Google로 장소 정보 보강',
|
||||
'places.enrichOnImportHint':
|
||||
'가져온 각 장소를 검색해 사진, 주소, 연락처를 추가합니다. Google Maps 키가 필요합니다.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -91,5 +91,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'Opslaan mislukt',
|
||||
'places.duplicateExists': "'{name}' staat al in deze reis.",
|
||||
'places.addAnyway': 'Toch toevoegen',
|
||||
'places.enrichOnImport': 'Plaatsen verrijken via Google',
|
||||
'places.enrichOnImportHint':
|
||||
'Zoekt elke geïmporteerde plaats op om fotos, adres en contactgegevens toe te voegen. Gebruikt je Google Maps-sleutel.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -90,5 +90,8 @@ const places: TranslationStrings = {
|
||||
'places.naverListImported': 'Zaimportowano {count} miejsc z "{list}"',
|
||||
'places.naverListError': 'Nie udało się zaimportować listy Naver Maps',
|
||||
'places.viewDetails': 'Zobacz szczegóły',
|
||||
'places.enrichOnImport': 'Wzbogać miejsca przez Google',
|
||||
'places.enrichOnImportHint':
|
||||
'Wyszukuje każde zaimportowane miejsce, aby dodać zdjęcia, adres i dane kontaktowe. Wymaga klucza Google Maps.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -90,5 +90,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'Ошибка сохранения',
|
||||
'places.duplicateExists': "'{name}' уже есть в этой поездке.",
|
||||
'places.addAnyway': 'Всё равно добавить',
|
||||
'places.enrichOnImport': 'Обогатить места через Google',
|
||||
'places.enrichOnImportHint':
|
||||
'Находит каждое импортированное место и добавляет фото, адрес и контакты. Требуется ключ Google Maps.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -89,5 +89,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'Kaydedilemedi',
|
||||
'places.duplicateExists': "'{name}' zaten bu gezide var.",
|
||||
'places.addAnyway': 'Yine de ekle',
|
||||
'places.enrichOnImport': 'Yerleri Google ile zenginleştir',
|
||||
'places.enrichOnImportHint':
|
||||
'İçe aktarılan her yeri arayarak fotoğraf, adres ve iletişim bilgilerini ekler. Google Maps anahtarı gerekir.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -90,5 +90,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': 'Помилка збереження',
|
||||
'places.duplicateExists': "'{name}' вже є в цій подорожі.",
|
||||
'places.addAnyway': 'Все одно додати',
|
||||
'places.enrichOnImport': 'Збагатити місця через Google',
|
||||
'places.enrichOnImportHint':
|
||||
'Знаходить кожне імпортоване місце й додає фото, адресу та контакти. Потрібен ключ Google Maps.',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -85,5 +85,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': '儲存失敗',
|
||||
'places.duplicateExists': "'{name}' 已在此行程中。",
|
||||
'places.addAnyway': '仍要新增',
|
||||
'places.enrichOnImport': '透過 Google 豐富地點資訊',
|
||||
'places.enrichOnImportHint':
|
||||
'查詢每個匯入的地點以補上照片、地址與聯絡資訊。需要 Google Maps 金鑰。',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -85,5 +85,8 @@ const places: TranslationStrings = {
|
||||
'places.saveError': '保存失败',
|
||||
'places.duplicateExists': "'{name}' 已在此行程中。",
|
||||
'places.addAnyway': '仍然添加',
|
||||
'places.enrichOnImport': '通过 Google 丰富地点信息',
|
||||
'places.enrichOnImportHint':
|
||||
'查找每个导入的地点以补充照片、地址和联系方式。需要 Google Maps 密钥。',
|
||||
};
|
||||
export default places;
|
||||
|
||||
@@ -117,6 +117,9 @@ export type PlaceBulkDeleteRequest = z.infer<
|
||||
|
||||
export const placeImportListRequestSchema = z.object({
|
||||
url: z.string().min(1),
|
||||
// Opt-in: enrich imported places via the Places API (#886). Requires a Google
|
||||
// Maps key; runs as a background pass after the import returns.
|
||||
enrich: z.boolean().optional(),
|
||||
});
|
||||
export type PlaceImportListRequest = z.infer<
|
||||
typeof placeImportListRequestSchema
|
||||
|
||||
Reference in New Issue
Block a user