diff --git a/backend/server/adventures/serializers.py b/backend/server/adventures/serializers.py index 25b7d43..0df0acb 100644 --- a/backend/server/adventures/serializers.py +++ b/backend/server/adventures/serializers.py @@ -1,3 +1,4 @@ +from django.utils import timezone import os from .models import Adventure, AdventureImage, ChecklistItem, Collection, Note, Transportation, Checklist, Visit from rest_framework import serializers @@ -19,18 +20,28 @@ class AdventureImageSerializer(serializers.ModelSerializer): return representation class VisitSerializer(serializers.ModelSerializer): + class Meta: model = Visit fields = ['id', 'start_date', 'end_date', 'notes'] read_only_fields = ['id'] - + class AdventureSerializer(serializers.ModelSerializer): images = AdventureImageSerializer(many=True, read_only=True) visits = VisitSerializer(many=True, read_only=False) + is_visited = serializers.SerializerMethodField() class Meta: model = Adventure - fields = ['id', 'user_id', 'name', 'description', 'rating', 'activity_types', 'location', 'is_public', 'collection', 'created_at', 'updated_at', 'images', 'link', 'type', 'longitude', 'latitude', 'visits'] - read_only_fields = ['id', 'created_at', 'updated_at', 'user_id'] + fields = ['id', 'user_id', 'name', 'description', 'rating', 'activity_types', 'location', 'is_public', 'collection', 'created_at', 'updated_at', 'images', 'link', 'type', 'longitude', 'latitude', 'visits', 'is_visited'] + read_only_fields = ['id', 'created_at', 'updated_at', 'user_id', 'is_visited'] + + def get_is_visited(self, obj): + current_date = timezone.now().date() + for visit in obj.visits.all(): + if visit.start_date and visit.end_date and (visit.start_date <= current_date): + return True + return False + def to_representation(self, instance): representation = super().to_representation(instance) diff --git a/frontend/src/lib/components/AdventureCard.svelte b/frontend/src/lib/components/AdventureCard.svelte index d85a5e2..25714d1 100644 --- a/frontend/src/lib/components/AdventureCard.svelte +++ b/frontend/src/lib/components/AdventureCard.svelte @@ -16,7 +16,6 @@ import CollectionLink from './CollectionLink.svelte'; import DotsHorizontal from '~icons/mdi/dots-horizontal'; import DeleteWarning from './DeleteWarning.svelte'; - import { isAdventureVisited } from '$lib'; import CardCarousel from './CardCarousel.svelte'; import { t } from 'svelte-i18n'; @@ -132,7 +131,7 @@
{$t(`adventures.activities.${adventure.type}`)}
- {isAdventureVisited(adventure) ? $t('adventures.visited') : $t('adventures.planned')} + {adventure.is_visited ? $t('adventures.visited') : $t('adventures.planned')}
{adventure.is_public ? $t('adventures.public') : $t('adventures.private')} diff --git a/frontend/src/lib/components/AdventureModal.svelte b/frontend/src/lib/components/AdventureModal.svelte index c197990..f797e5b 100644 --- a/frontend/src/lib/components/AdventureModal.svelte +++ b/frontend/src/lib/components/AdventureModal.svelte @@ -28,6 +28,7 @@ import ActivityComplete from './ActivityComplete.svelte'; import { appVersion } from '$lib/config'; import { ADVENTURE_TYPES } from '$lib'; + import RegionCard from './RegionCard.svelte'; let wikiError: string = ''; @@ -629,7 +630,11 @@ it would also work to just use on:click on the MapLibre component itself. --> {#if reverseGeocodePlace}

{reverseGeocodePlace.region}, {reverseGeocodePlace.country}

-

{reverseGeocodePlace.is_visited ? 'Visited' : 'Not Visited'}

+

+ {reverseGeocodePlace.is_visited + ? $t('adventures.visited') + : $t('adventures.not_visited')} +

{#if !reverseGeocodePlace.is_visited} {/if} diff --git a/frontend/src/lib/index.ts b/frontend/src/lib/index.ts index 5170910..cab49d4 100644 --- a/frontend/src/lib/index.ts +++ b/frontend/src/lib/index.ts @@ -253,28 +253,6 @@ export let ADVENTURE_TYPES = [ { type: 'other', label: 'Other' } ]; -/** - * Checks if an adventure has been visited. - * - * This function determines if the `adventure.visits` array contains at least one visit - * with a `start_date` that is before the current date. - * - * @param adventure - The adventure object to check. - * @returns `true` if the adventure has been visited, otherwise `false`. - */ -export function isAdventureVisited(adventure: Adventure) { - const currentTime = Date.now(); - - // Check if any visit's start_date is before the current time. - return ( - adventure.visits && - adventure.visits.some((visit) => { - const visitStartTime = new Date(visit.start_date).getTime(); - return visit.start_date && visitStartTime <= currentTime; - }) - ); -} - export function getRandomBackground() { const randomIndex = Math.floor(Math.random() * randomBackgrounds.backgrounds.length); return randomBackgrounds.backgrounds[randomIndex] as Background; diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts index 4470ac3..5c77745 100644 --- a/frontend/src/lib/types.ts +++ b/frontend/src/lib/types.ts @@ -37,6 +37,7 @@ export type Adventure = { is_public: boolean; created_at?: string | null; updated_at?: string | null; + is_visited?: boolean; }; export type Country = { diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index f757517..657f8d6 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -139,6 +139,7 @@ "unarchive": "Unarchive", "archive": "Archive", "no_collections_found": "No collections found to add this adventure to.", + "not_visited": "Not Visited", "archived_collection_message": "Collection archived successfully!", "unarchived_collection_message": "Collection unarchived successfully!", "delete_collection_success": "Collection deleted successfully!", @@ -173,6 +174,8 @@ "basic_information": "Basic Information", "adventure_not_found": "There are no adventures to display. Add some using the plus button at the bottom right or try changing filters!", "no_adventures_found": "No adventures found", + "mark_region_as_visited": "Mark region {region}, {country} as visited?", + "mark_visited": "Mark Visited", "activities": { "general": "General 🌍", "outdoor": "Outdoor 🏞️", diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index fef587c..e01d0fb 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -1,245 +1,248 @@ { - "navbar": { - "adventures": "Aventuras", - "collections": "Colecciones", - "worldtravel": "Viajar por el Mundo", - "map": "Mapa", - "users": "Usuarios", - "search": "Buscar", - "profile": "Perfil", - "greeting": "Hola", - "my_adventures": "Mis Aventuras", - "my_activities": "Mis Actividades", - "shared_with_me": "Compartido Conmigo", - "settings": "Configuraciones", - "logout": "Cerrar Sesión", - "about": "Acerca de AdventureLog", - "documentation": "Documentación", - "discord": "Discord", - "theme_selection": "Selección de Tema", - "themes": { - "light": "Claro", - "dark": "Oscuro", - "night": "Noche", - "forest": "Bosque", - "aestetic-dark": "Estético Oscuro", - "aestetic-light": "Estético Claro", - "aqua": "Aqua" - } - }, - "about": { - "about": "Acerca de", - "license": "Licenciado bajo la Licencia GPL-3.0.", - "source_code": "Código Fuente", - "message": "Hecho con ❤️ en los Estados Unidos.", - "oss_attributions": "Atribuciones de Código Abierto", - "nominatim_1": "La búsqueda de ubicaciones y geocodificación es proporcionada por", - "nominatim_2": "Sus datos están licenciados bajo la licencia ODbL.", - "other_attributions": "Atribuciones adicionales se pueden encontrar en el archivo README.", - "close": "Cerrar" - }, - "home": { - "hero_1": "Descubre las Aventuras Más Emocionantes del Mundo", - "hero_2": "Descubre y planifica tu próxima aventura con AdventureLog. Explora destinos impresionantes, crea itinerarios personalizados y mantente conectado en todo momento.", - "go_to": "Ir a AdventureLog", - "key_features": "Características Clave", - "desc_1": "Descubre, Planifica y Explora Fácilmente", - "desc_2": "AdventureLog está diseñado para simplificar tu viaje, brindándote las herramientas y recursos para planificar, empacar y navegar tu próxima aventura inolvidable.", - "feature_1": "Registro de Viajes", - "feature_1_desc": "Mantén un registro de tus aventuras con un diario de viaje personalizado y comparte tus experiencias con amigos y familiares.", - "feature_2": "Planificación de Viajes", - "feature_2_desc": "Crea fácilmente itinerarios personalizados y obtén un desglose diario de tu viaje.", - "feature_3": "Mapa de Viaje", - "feature_3_desc": "Visualiza tus viajes por el mundo con un mapa interactivo y explora nuevos destinos." - }, - "adventures": { - "collection_remove_success": "¡Aventura eliminada de la colección con éxito!", - "collection_remove_error": "Error al eliminar la aventura de la colección", - "collection_link_success": "¡Aventura vinculada a la colección con éxito!", - "collection_link_error": "Error al vincular la aventura a la colección", - "adventure_delete_confirm": "¿Estás seguro de que quieres eliminar esta aventura? Esta acción no se puede deshacer.", - "open_details": "Abrir Detalles", - "edit_adventure": "Editar Aventura", - "remove_from_collection": "Eliminar de la Colección", - "add_to_collection": "Añadir a la Colección", - "delete": "Eliminar", - "activities": { - "activity": "Actividad 🏄", - "art_museums": "Arte", - "attraction": "Atracción 🎢", - "culture": "Cultura 🎭", - "dining": "Cenar 🍽️", - "event": "Evento 🎉", - "festivals": "Festivales 🎪", - "fitness": "Fitness 🏋️", - "general": "Generales 🌍", - "hiking": "Senderismo 🥾", - "historical_sites": "Sitios Históricos 🏛️", - "lodging": "Alojamiento 🛌", - "music_concerts": "Música", - "nightlife": "Vida nocturna 🌃", - "other": "Otro", - "outdoor": "Al aire libre 🏞️", - "shopping": "Compras 🛍️", - "spiritual_journeys": "Viajes espirituales 🧘‍♀️", - "transportation": "Transporte 🚗", - "volunteer_work": "Trabajo voluntario 🤝", - "water_sports": "Deportes acuáticos 🚤", - "wildlife": "Vida silvestre 🦒" - }, - "no_image_found": "No se encontró ninguna imagen", - "adventure_details": "Detalles de la aventura", - "adventure_type": "Tipo de aventura", - "collection": "Recopilación", - "homepage": "Página principal", - "latitude": "Latitud", - "longitude": "Longitud", - "not_found": "Aventura no encontrada", - "not_found_desc": "La aventura que buscabas no se pudo encontrar. \nPruebe una aventura diferente o vuelva a consultar más tarde.", - "visit": "Visita", - "visits": "Visitas", - "adventure": "Aventura", - "count_txt": "resultados que coinciden con su búsqueda", - "create_new": "Crear nuevo...", - "ascending": "Ascendente", - "collection_adventures": "Incluir aventuras de colección", - "date": "Fecha", - "descending": "Descendente", - "filter": "Filtrar", - "name": "Nombre", - "order_by": "Ordenar por", - "order_direction": "Dirección del pedido", - "rating": "Clasificación", - "sort": "Clasificar", - "sources": "Fuentes", - "updated": "Actualizado", - "category_filter": "Filtro de categoría", - "clear": "Claro", - "archived_collections": "Colecciones archivadas", - "close_filters": "Cerrar filtros", - "my_collections": "Mis colecciones", - "open_filters": "Abrir filtros", - "private": "Privado", - "public": "Público", - "archived_collection_message": "¡Colección archivada exitosamente!", - "delete_collection": "Eliminar colección", - "delete_collection_success": "¡Colección eliminada exitosamente!", - "delete_collection_warning": "¿Estás seguro de que deseas eliminar esta colección? \nEsto también eliminará todas las aventuras vinculadas. \nEsta acción no se puede deshacer.", - "unarchived_collection_message": "¡Colección desarchivada exitosamente!", - "archive": "Archivo", - "archived": "Archivado", - "edit_collection": "Editar colección", - "share": "Compartir", - "unarchive": "Desarchivar", - "cancel": "Cancelar", - "adventure_delete_success": "¡Aventura eliminada con éxito!", - "delete_adventure": "Eliminar aventura", - "planned": "Planificado", - "visited": "Visitado", - "dates": "Fechas", - "duration": "Duración", - "image_removed_error": "Error al eliminar la imagen", - "image_removed_success": "¡Imagen eliminada exitosamente!", - "image_upload_error": "Error al subir la imagen", - "image_upload_success": "¡Imagen cargada exitosamente!", - "no_image_url": "No se encontró ninguna imagen en esa URL.", - "start_before_end_error": "La fecha de inicio debe ser anterior a la fecha de finalización.", - "wiki_image_error": "Error al obtener la imagen de Wikipedia", - "actions": "Comportamiento", - "activity": "Actividad", - "see_adventures": "Ver Aventuras", - "activity_types": "Tipos de actividad", - "add": "Agregar", - "add_notes": "Agregar notas", - "adventure_create_error": "No se pudo crear la aventura", - "adventure_created": "Aventura creada", - "adventure_update_error": "No se pudo actualizar la aventura", - "adventure_updated": "Aventura actualizada", - "basic_information": "Información básica", - "category": "Categoría", - "clear_map": "Borrar mapa", - "copy_link": "Copiar enlace", - "date_constrain": "Restringir a las fechas de recolección", - "description": "Descripción", - "end_date": "Fecha de finalización", - "fetch_image": "Obtener imagen", - "generate_desc": "Generar descripción", - "image": "Imagen", - "image_fetch_failed": "No se pudo recuperar la imagen", - "link": "Enlace", - "location": "Ubicación", - "location_information": "Información de ubicación", - "my_images": "Mis imágenes", - "my_visits": "Mis visitas", - "new_adventure": "Nueva aventura", - "no_description_found": "No se encontró ninguna descripción", - "no_images": "Sin imágenes", - "no_location": "Por favor ingresa una ubicación", - "no_results": "No se encontraron resultados", - "no_start_date": "Por favor ingrese una fecha de inicio", - "public_adventure": "Aventura pública", - "remove": "Eliminar", - "save_next": "Ahorrar", - "search_for_location": "Buscar una ubicación", - "search_results": "Resultados de búsqueda", - "select_adventure_category": "Seleccionar categoría de aventura", - "share_adventure": "¡Comparte esta aventura!", - "start_date": "Fecha de inicio", - "upload_image": "Subir imagen", - "upload_images_here": "Sube imágenes aquí", - "url": "URL", - "warning": "Advertencia", - "wiki_desc": "Extrae un extracto de un artículo de Wikipedia que coincide con el nombre de la aventura.", - "wikipedia": "Wikipedia", - "add_an_activity": "Agregar una actividad", - "adventure_not_found": "No hay aventuras que mostrar. \n¡Agregue algunos usando el botón más en la parte inferior derecha o intente cambiar los filtros!", - "no_adventures_found": "No se encontraron aventuras", - "no_collections_found": "No se encontraron colecciones para agregar esta aventura.", - "my_adventures": "mis aventuras", - "no_linkable_adventures": "No se encontraron aventuras que puedan vincularse a esta colección." - }, - "worldtravel": { - "all": "Todo", - "all_subregions": "Todas las subregiones", - "clear_search": "Borrar búsqueda", - "completely_visited": "Completamente visitado", - "no_countries_found": "No se encontraron países", - "not_visited": "No visitado", - "num_countries": "países encontrados", - "partially_visited": "Parcialmente visitado", - "country_list": "Lista de países" - }, - "auth": { - "forgot_password": "¿Has olvidado tu contraseña?", - "login": "Acceso", - "login_error": "No se puede iniciar sesión con las credenciales proporcionadas.", - "password": "Contraseña", - "signup": "Inscribirse", - "username": "Nombre de usuario", - "confirm_password": "confirmar Contraseña", - "email": "Correo electrónico", - "first_name": "Nombre de pila", - "last_name": "Apellido", - "registration_disabled": "El registro está actualmente deshabilitado.", - "profile_picture": "Foto de perfil", - "public_profile": "Perfil público", - "public_tooltip": "Con un perfil público, los usuarios pueden compartir colecciones con usted y ver su perfil en la página de usuarios." - }, - "users": { - "no_users_found": "No se encontraron usuarios con perfiles públicos." - }, - "settings": { - "account_settings": "Configuración de cuenta de usuario", - "confirm_new_password": "Confirmar nueva contraseña", - "current_email": "Correo electrónico actual", - "email_change": "Cambiar correo electrónico", - "new_email": "Nuevo correo electrónico", - "new_password": "Nueva contraseña", - "no_email_set": "No hay correo electrónico configurado", - "password_change": "Cambiar la contraseña", - "settings_page": "Página de configuración", - "update": "Actualizar", - "update_error": "Error al actualizar la configuración", - "update_success": "¡La configuración se actualizó correctamente!" - } + "navbar": { + "adventures": "Aventuras", + "collections": "Colecciones", + "worldtravel": "Viajar por el Mundo", + "map": "Mapa", + "users": "Usuarios", + "search": "Buscar", + "profile": "Perfil", + "greeting": "Hola", + "my_adventures": "Mis Aventuras", + "my_activities": "Mis Actividades", + "shared_with_me": "Compartido Conmigo", + "settings": "Configuraciones", + "logout": "Cerrar Sesión", + "about": "Acerca de AdventureLog", + "documentation": "Documentación", + "discord": "Discord", + "theme_selection": "Selección de Tema", + "themes": { + "light": "Claro", + "dark": "Oscuro", + "night": "Noche", + "forest": "Bosque", + "aestetic-dark": "Estético Oscuro", + "aestetic-light": "Estético Claro", + "aqua": "Aqua" + } + }, + "about": { + "about": "Acerca de", + "license": "Licenciado bajo la Licencia GPL-3.0.", + "source_code": "Código Fuente", + "message": "Hecho con ❤️ en los Estados Unidos.", + "oss_attributions": "Atribuciones de Código Abierto", + "nominatim_1": "La búsqueda de ubicaciones y geocodificación es proporcionada por", + "nominatim_2": "Sus datos están licenciados bajo la licencia ODbL.", + "other_attributions": "Atribuciones adicionales se pueden encontrar en el archivo README.", + "close": "Cerrar" + }, + "home": { + "hero_1": "Descubre las Aventuras Más Emocionantes del Mundo", + "hero_2": "Descubre y planifica tu próxima aventura con AdventureLog. Explora destinos impresionantes, crea itinerarios personalizados y mantente conectado en todo momento.", + "go_to": "Ir a AdventureLog", + "key_features": "Características Clave", + "desc_1": "Descubre, Planifica y Explora Fácilmente", + "desc_2": "AdventureLog está diseñado para simplificar tu viaje, brindándote las herramientas y recursos para planificar, empacar y navegar tu próxima aventura inolvidable.", + "feature_1": "Registro de Viajes", + "feature_1_desc": "Mantén un registro de tus aventuras con un diario de viaje personalizado y comparte tus experiencias con amigos y familiares.", + "feature_2": "Planificación de Viajes", + "feature_2_desc": "Crea fácilmente itinerarios personalizados y obtén un desglose diario de tu viaje.", + "feature_3": "Mapa de Viaje", + "feature_3_desc": "Visualiza tus viajes por el mundo con un mapa interactivo y explora nuevos destinos." + }, + "adventures": { + "collection_remove_success": "¡Aventura eliminada de la colección con éxito!", + "collection_remove_error": "Error al eliminar la aventura de la colección", + "collection_link_success": "¡Aventura vinculada a la colección con éxito!", + "collection_link_error": "Error al vincular la aventura a la colección", + "adventure_delete_confirm": "¿Estás seguro de que quieres eliminar esta aventura? Esta acción no se puede deshacer.", + "open_details": "Abrir Detalles", + "edit_adventure": "Editar Aventura", + "remove_from_collection": "Eliminar de la Colección", + "add_to_collection": "Añadir a la Colección", + "delete": "Eliminar", + "activities": { + "activity": "Actividad 🏄", + "art_museums": "Arte", + "attraction": "Atracción 🎢", + "culture": "Cultura 🎭", + "dining": "Cenar 🍽️", + "event": "Evento 🎉", + "festivals": "Festivales 🎪", + "fitness": "Fitness 🏋️", + "general": "Generales 🌍", + "hiking": "Senderismo 🥾", + "historical_sites": "Sitios Históricos 🏛️", + "lodging": "Alojamiento 🛌", + "music_concerts": "Música", + "nightlife": "Vida nocturna 🌃", + "other": "Otro", + "outdoor": "Al aire libre 🏞️", + "shopping": "Compras 🛍️", + "spiritual_journeys": "Viajes espirituales 🧘‍♀️", + "transportation": "Transporte 🚗", + "volunteer_work": "Trabajo voluntario 🤝", + "water_sports": "Deportes acuáticos 🚤", + "wildlife": "Vida silvestre 🦒" + }, + "no_image_found": "No se encontró ninguna imagen", + "adventure_details": "Detalles de la aventura", + "adventure_type": "Tipo de aventura", + "collection": "Recopilación", + "homepage": "Página principal", + "latitude": "Latitud", + "longitude": "Longitud", + "not_found": "Aventura no encontrada", + "not_found_desc": "La aventura que buscabas no se pudo encontrar. \nPruebe una aventura diferente o vuelva a consultar más tarde.", + "visit": "Visita", + "visits": "Visitas", + "adventure": "Aventura", + "count_txt": "resultados que coinciden con su búsqueda", + "create_new": "Crear nuevo...", + "ascending": "Ascendente", + "collection_adventures": "Incluir aventuras de colección", + "date": "Fecha", + "descending": "Descendente", + "filter": "Filtrar", + "name": "Nombre", + "order_by": "Ordenar por", + "order_direction": "Dirección del pedido", + "rating": "Clasificación", + "sort": "Clasificar", + "sources": "Fuentes", + "updated": "Actualizado", + "category_filter": "Filtro de categoría", + "clear": "Claro", + "archived_collections": "Colecciones archivadas", + "close_filters": "Cerrar filtros", + "my_collections": "Mis colecciones", + "open_filters": "Abrir filtros", + "private": "Privado", + "public": "Público", + "archived_collection_message": "¡Colección archivada exitosamente!", + "delete_collection": "Eliminar colección", + "delete_collection_success": "¡Colección eliminada exitosamente!", + "delete_collection_warning": "¿Estás seguro de que deseas eliminar esta colección? \nEsto también eliminará todas las aventuras vinculadas. \nEsta acción no se puede deshacer.", + "unarchived_collection_message": "¡Colección desarchivada exitosamente!", + "archive": "Archivo", + "archived": "Archivado", + "edit_collection": "Editar colección", + "share": "Compartir", + "unarchive": "Desarchivar", + "cancel": "Cancelar", + "adventure_delete_success": "¡Aventura eliminada con éxito!", + "delete_adventure": "Eliminar aventura", + "planned": "Planificado", + "visited": "Visitado", + "dates": "Fechas", + "duration": "Duración", + "image_removed_error": "Error al eliminar la imagen", + "image_removed_success": "¡Imagen eliminada exitosamente!", + "image_upload_error": "Error al subir la imagen", + "image_upload_success": "¡Imagen cargada exitosamente!", + "no_image_url": "No se encontró ninguna imagen en esa URL.", + "start_before_end_error": "La fecha de inicio debe ser anterior a la fecha de finalización.", + "wiki_image_error": "Error al obtener la imagen de Wikipedia", + "actions": "Comportamiento", + "activity": "Actividad", + "see_adventures": "Ver Aventuras", + "activity_types": "Tipos de actividad", + "add": "Agregar", + "add_notes": "Agregar notas", + "adventure_create_error": "No se pudo crear la aventura", + "adventure_created": "Aventura creada", + "adventure_update_error": "No se pudo actualizar la aventura", + "adventure_updated": "Aventura actualizada", + "basic_information": "Información básica", + "category": "Categoría", + "clear_map": "Borrar mapa", + "copy_link": "Copiar enlace", + "date_constrain": "Restringir a las fechas de recolección", + "description": "Descripción", + "end_date": "Fecha de finalización", + "fetch_image": "Obtener imagen", + "generate_desc": "Generar descripción", + "image": "Imagen", + "image_fetch_failed": "No se pudo recuperar la imagen", + "link": "Enlace", + "location": "Ubicación", + "location_information": "Información de ubicación", + "my_images": "Mis imágenes", + "my_visits": "Mis visitas", + "new_adventure": "Nueva aventura", + "no_description_found": "No se encontró ninguna descripción", + "no_images": "Sin imágenes", + "no_location": "Por favor ingresa una ubicación", + "no_results": "No se encontraron resultados", + "no_start_date": "Por favor ingrese una fecha de inicio", + "public_adventure": "Aventura pública", + "remove": "Eliminar", + "save_next": "Ahorrar", + "search_for_location": "Buscar una ubicación", + "search_results": "Resultados de búsqueda", + "select_adventure_category": "Seleccionar categoría de aventura", + "share_adventure": "¡Comparte esta aventura!", + "start_date": "Fecha de inicio", + "upload_image": "Subir imagen", + "upload_images_here": "Sube imágenes aquí", + "url": "URL", + "warning": "Advertencia", + "wiki_desc": "Extrae un extracto de un artículo de Wikipedia que coincide con el nombre de la aventura.", + "wikipedia": "Wikipedia", + "add_an_activity": "Agregar una actividad", + "adventure_not_found": "No hay aventuras que mostrar. \n¡Agregue algunos usando el botón más en la parte inferior derecha o intente cambiar los filtros!", + "no_adventures_found": "No se encontraron aventuras", + "no_collections_found": "No se encontraron colecciones para agregar esta aventura.", + "my_adventures": "mis aventuras", + "no_linkable_adventures": "No se encontraron aventuras que puedan vincularse a esta colección.", + "mark_region_as_visited": "¿Marcar región {region}, {country} como visitada?", + "mark_visited": "Marcos visitó", + "not_visited": "No visitado" + }, + "worldtravel": { + "all": "Todo", + "all_subregions": "Todas las subregiones", + "clear_search": "Borrar búsqueda", + "completely_visited": "Completamente visitado", + "no_countries_found": "No se encontraron países", + "not_visited": "No visitado", + "num_countries": "países encontrados", + "partially_visited": "Parcialmente visitado", + "country_list": "Lista de países" + }, + "auth": { + "forgot_password": "¿Has olvidado tu contraseña?", + "login": "Acceso", + "login_error": "No se puede iniciar sesión con las credenciales proporcionadas.", + "password": "Contraseña", + "signup": "Inscribirse", + "username": "Nombre de usuario", + "confirm_password": "confirmar Contraseña", + "email": "Correo electrónico", + "first_name": "Nombre de pila", + "last_name": "Apellido", + "registration_disabled": "El registro está actualmente deshabilitado.", + "profile_picture": "Foto de perfil", + "public_profile": "Perfil público", + "public_tooltip": "Con un perfil público, los usuarios pueden compartir colecciones con usted y ver su perfil en la página de usuarios." + }, + "users": { + "no_users_found": "No se encontraron usuarios con perfiles públicos." + }, + "settings": { + "account_settings": "Configuración de cuenta de usuario", + "confirm_new_password": "Confirmar nueva contraseña", + "current_email": "Correo electrónico actual", + "email_change": "Cambiar correo electrónico", + "new_email": "Nuevo correo electrónico", + "new_password": "Nueva contraseña", + "no_email_set": "No hay correo electrónico configurado", + "password_change": "Cambiar la contraseña", + "settings_page": "Página de configuración", + "update": "Actualizar", + "update_error": "Error al actualizar la configuración", + "update_success": "¡La configuración se actualizó correctamente!" + } } diff --git a/frontend/src/routes/collections/[id]/+page.svelte b/frontend/src/routes/collections/[id]/+page.svelte index 47b401f..e4316ea 100644 --- a/frontend/src/routes/collections/[id]/+page.svelte +++ b/frontend/src/routes/collections/[id]/+page.svelte @@ -20,8 +20,7 @@ groupAdventuresByDate, groupNotesByDate, groupTransportationsByDate, - groupChecklistsByDate, - isAdventureVisited + groupChecklistsByDate } from '$lib'; import ChecklistCard from '$lib/components/ChecklistCard.svelte'; import ChecklistModal from '$lib/components/ChecklistModal.svelte'; @@ -45,7 +44,7 @@ $: { numAdventures = adventures.length; - numVisited = adventures.filter(isAdventureVisited).length; + numVisited = adventures.filter((adventure) => adventure.is_visited).length; } let notFound: boolean = false; diff --git a/frontend/src/routes/map/+page.server.ts b/frontend/src/routes/map/+page.server.ts index 7675a5d..919b101 100644 --- a/frontend/src/routes/map/+page.server.ts +++ b/frontend/src/routes/map/+page.server.ts @@ -46,6 +46,7 @@ export const load = (async (event) => { name: adventure.name, visits: adventure.visits, type: adventure.type, + is_visited: adventure.is_visited }; }); diff --git a/frontend/src/routes/map/+page.svelte b/frontend/src/routes/map/+page.svelte index 6e91d76..0b8d925 100644 --- a/frontend/src/routes/map/+page.svelte +++ b/frontend/src/routes/map/+page.svelte @@ -1,7 +1,6 @@