diff --git a/documentation/.vitepress/config.mts b/documentation/.vitepress/config.mts index c14b50c..1c47f29 100644 --- a/documentation/.vitepress/config.mts +++ b/documentation/.vitepress/config.mts @@ -41,7 +41,7 @@ export default defineConfig({ footer: { message: "AdventureLog", - copyright: "Copyright © 2023-2024 Sean Morley", + copyright: "Copyright © 2023-2025 Sean Morley", }, logo: "/adventurelog.png", diff --git a/frontend/src/lib/components/CollectionModal.svelte b/frontend/src/lib/components/CollectionModal.svelte new file mode 100644 index 0000000..a6fb823 --- /dev/null +++ b/frontend/src/lib/components/CollectionModal.svelte @@ -0,0 +1,182 @@ + + + + + + + diff --git a/frontend/src/lib/components/EditCollection.svelte b/frontend/src/lib/components/EditCollection.svelte deleted file mode 100644 index 6c96bc8..0000000 --- a/frontend/src/lib/components/EditCollection.svelte +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - diff --git a/frontend/src/lib/components/NewCollection.svelte b/frontend/src/lib/components/NewCollection.svelte deleted file mode 100644 index 5ba50ba..0000000 --- a/frontend/src/lib/components/NewCollection.svelte +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - diff --git a/frontend/src/lib/components/TransportationCard.svelte b/frontend/src/lib/components/TransportationCard.svelte index c28d0ad..529ba1c 100644 --- a/frontend/src/lib/components/TransportationCard.svelte +++ b/frontend/src/lib/components/TransportationCard.svelte @@ -73,22 +73,22 @@

{transportation.from_location}

{/if} - {#if transportation.to_location} - + {#if transportation.date}
- {$t('adventures.to')}: - -

{transportation.to_location}

+ {$t('adventures.start')}: +

{new Date(transportation.date).toLocaleString(undefined, { timeZone: 'UTC' })}

{/if}
- {#if transportation.date} + {#if transportation.to_location} +
- {$t('adventures.start')}: -

{new Date(transportation.date).toLocaleString(undefined, { timeZone: 'UTC' })}

+ {$t('adventures.to')}: + +

{transportation.to_location}

{/if} {#if transportation.end_date} diff --git a/frontend/src/lib/components/UserCard.svelte b/frontend/src/lib/components/UserCard.svelte index 3deb52d..aefa17e 100644 --- a/frontend/src/lib/components/UserCard.svelte +++ b/frontend/src/lib/components/UserCard.svelte @@ -17,34 +17,46 @@ class="card w-full max-w-xs sm:max-w-sm md:max-w-md lg:max-w-md xl:max-w-md bg-neutral text-neutral-content shadow-xl" >
-
+ +
{#if user.profile_pic} -
-
+
+
{user.username}
{/if} -

{user.first_name} {user.last_name}

+ +

+ {user.first_name} + {user.last_name} +

+

{user.username}

+ + + {#if user.is_staff} +
Admin
+ {/if}
-

{user.username}

- {#if user.is_staff} -
Admin
- {/if} - -
- -

+ + +

+ +

{user.date_joined ? 'Joined ' + new Date(user.date_joined).toLocaleDateString() : ''}

-
+ + +
{#if !sharing} - + {:else if shared_with && !shared_with.includes(user.uuid)} - + {:else} - + {/if}
diff --git a/frontend/src/lib/config.ts b/frontend/src/lib/config.ts index 15ee7ef..3b9fde7 100644 --- a/frontend/src/lib/config.ts +++ b/frontend/src/lib/config.ts @@ -1,4 +1,4 @@ -export let appVersion = 'Web v0.7.1'; +export let appVersion = 'v0.7.1'; export let versionChangelog = 'https://github.com/seanmorley15/AdventureLog/releases/tag/v0.7.1'; export let appTitle = 'AdventureLog'; -export let copyrightYear = '2024'; +export let copyrightYear = '2023-2025'; diff --git a/frontend/src/lib/index.ts b/frontend/src/lib/index.ts index 1d1a3bd..b2201ca 100644 --- a/frontend/src/lib/index.ts +++ b/frontend/src/lib/index.ts @@ -289,6 +289,37 @@ export function getAdventureTypeLabel(type: string) { } export function getRandomBackground() { + const today = new Date(); + + // Special dates for specific backgrounds + // New Years week + + const newYearsStart = new Date(today.getFullYear() - 1, 11, 31); + newYearsStart.setHours(0, 0, 0, 0); + const newYearsEnd = new Date(today.getFullYear(), 0, 7); + newYearsEnd.setHours(23, 59, 59, 999); + if (today >= newYearsStart && today <= newYearsEnd) { + return { + url: 'backgrounds/adventurelog_new_year.webp', + author: 'Roven Images', + location: "Happy New Year's from the AdventureLog team!" + } as Background; + } + + // Christmas 12/24 - 12/25 + const christmasStart = new Date(today.getFullYear(), 11, 24); + christmasStart.setHours(0, 0, 0, 0); + const christmasEnd = new Date(today.getFullYear(), 11, 25); + christmasEnd.setHours(23, 59, 59, 999); + + if (today >= christmasStart && today <= christmasEnd) { + return { + url: 'backgrounds/adventurelog_christmas.webp', + author: 'Annie Spratt', + location: 'Merry Christmas from the AdventureLog team!' + } as Background; + } + 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 aadf545..57342f4 100644 --- a/frontend/src/lib/types.ts +++ b/frontend/src/lib/types.ts @@ -86,9 +86,9 @@ export type Collection = { description: string; is_public: boolean; adventures: Adventure[]; - created_at?: string; - start_date?: string; - end_date?: string; + created_at?: string | null; + start_date: string | null; + end_date: string | null; transportations?: Transportation[]; notes?: Note[]; checklists?: Checklist[]; diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index f948e74..c5dc2e4 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -290,7 +290,7 @@ "public_profile": "Public Profile", "public_tooltip": "With a public profile, users can share collections with you and view your profile on the users page.", "email_required": "Email is required", - "new_password": "New Password", + "new_password": "New Password (6+ characters)", "both_passwords_required": "Both passwords are required", "reset_failed": "Failed to reset password" }, @@ -375,7 +375,8 @@ "create": "Create", "collection_edit_success": "Collection edited successfully!", "error_editing_collection": "Error editing collection", - "edit_collection": "Edit Collection" + "edit_collection": "Edit Collection", + "public_collection": "Public Collection" }, "notes": { "note_deleted": "Note deleted successfully!", diff --git a/frontend/src/routes/calendar/+page.svelte b/frontend/src/routes/calendar/+page.svelte index 476519d..50987c2 100644 --- a/frontend/src/routes/calendar/+page.svelte +++ b/frontend/src/routes/calendar/+page.svelte @@ -23,6 +23,7 @@ view: 'dayGridMonth', events: [...dates] }; + console.log(dates);

{$t('adventures.adventure_calendar')}

diff --git a/frontend/src/routes/collections/+page.svelte b/frontend/src/routes/collections/+page.svelte index e5789c9..40633dc 100644 --- a/frontend/src/routes/collections/+page.svelte +++ b/frontend/src/routes/collections/+page.svelte @@ -2,8 +2,7 @@ import { enhance } from '$app/forms'; import { goto } from '$app/navigation'; import CollectionCard from '$lib/components/CollectionCard.svelte'; - import EditCollection from '$lib/components/EditCollection.svelte'; - import NewCollection from '$lib/components/NewCollection.svelte'; + import CollectionModal from '$lib/components/CollectionModal.svelte'; import NotFound from '$lib/components/NotFound.svelte'; import type { Collection } from '$lib/types'; import { t } from 'svelte-i18n'; @@ -17,10 +16,10 @@ let currentSort = { attribute: 'name', order: 'asc' }; - let isShowingCreateModal: boolean = false; let newType: string = ''; let resultsPerPage: number = 25; + let isShowingCollectionModal: boolean = false; let next: string | null = data.props.next || null; let previous: string | null = data.props.previous || null; @@ -86,8 +85,7 @@ } } - let collectionToEdit: Collection; - let isEditModalOpen: boolean = false; + let collectionToEdit: Collection | null = null; function deleteAdventure(event: CustomEvent) { collections = collections.filter((adventure) => adventure.id !== event.detail); @@ -95,12 +93,12 @@ function createAdventure(event: CustomEvent) { collections = [event.detail, ...collections]; - isShowingCreateModal = false; + isShowingCollectionModal = false; } function editCollection(event: CustomEvent) { collectionToEdit = event.detail; - isEditModalOpen = true; + isShowingCollectionModal = true; } function saveEdit(event: CustomEvent) { @@ -110,7 +108,7 @@ } return adventure; }); - isEditModalOpen = false; + isShowingCollectionModal = false; } let sidebarOpen = false; @@ -120,18 +118,13 @@ } -{#if isShowingCreateModal} - (isShowingCreateModal = false)} /> -{/if} - -{#if isEditModalOpen} - (isEditModalOpen = false)} + on:close={() => (isShowingCollectionModal = false)} on:saveEdit={saveEdit} /> {/if} -
diff --git a/frontend/src/routes/collections/[id]/+page.svelte b/frontend/src/routes/collections/[id]/+page.svelte index 83f6ffb..a3d6596 100644 --- a/frontend/src/routes/collections/[id]/+page.svelte +++ b/frontend/src/routes/collections/[id]/+page.svelte @@ -2,10 +2,17 @@ import type { Adventure, Checklist, Collection, Note, Transportation } from '$lib/types'; import { onMount } from 'svelte'; import type { PageData } from './$types'; - import { goto } from '$app/navigation'; - import Lost from '$lib/assets/undraw_lost.svg'; + import { marked } from 'marked'; // Import the markdown parser + import { t } from 'svelte-i18n'; + // @ts-ignore + import Calendar from '@event-calendar/core'; + // @ts-ignore + import TimeGrid from '@event-calendar/time-grid'; + // @ts-ignore + import DayGrid from '@event-calendar/day-grid'; + import Plus from '~icons/mdi/plus'; import AdventureCard from '$lib/components/AdventureCard.svelte'; import AdventureLink from '$lib/components/AdventureLink.svelte'; @@ -29,8 +36,58 @@ export let data: PageData; console.log(data); + const renderMarkdown = (markdown: string) => { + return marked(markdown); + }; + let collection: Collection; + // add christmas and new years + // dates = Array.from({ length: 25 }, (_, i) => { + // const date = new Date(); + // date.setMonth(11); + // date.setDate(i + 1); + // return { + // id: i.toString(), + // start: date.toISOString(), + // end: date.toISOString(), + // title: '🎄' + // }; + // }); + + let dates: Array<{ + id: string; + start: string; + end: string; + title: string; + backgroundColor?: string; + }> = []; + + // Initialize calendar plugins and options + let plugins = [TimeGrid, DayGrid]; + let options = { + view: 'dayGridMonth', + events: dates // Assign `dates` reactively + }; + + // Compute `dates` array reactively + $: { + if (adventures) { + dates = adventures.flatMap((adventure) => + adventure.visits.map((visit) => ({ + id: adventure.id, + start: visit.start_date, // Convert to ISO format if needed + end: visit.end_date || visit.start_date, + title: adventure.name + (adventure.category?.icon ? ' ' + adventure.category.icon : '') + })) + ); + } + // Update `options.events` when `dates` changes + options = { ...options, events: dates }; + } + + let currentView: string = 'itinerary'; + let adventures: Adventure[] = []; let numVisited: number = 0; @@ -364,9 +421,20 @@
{/if} - {#if collection.description} -

{collection.description}

+ {#if collection && !collection.start_date && adventures.length == 0 && transportations.length == 0 && notes.length == 0 && checklists.length == 0} + {/if} + + {#if collection.description} +
+
+ {@html renderMarkdown(collection.description)} +
+
+ {/if} + {#if adventures.length > 0}
@@ -383,269 +451,323 @@
{/if} - {#if adventures.length > 0} -

{$t('adventures.linked_adventures')}

- -
- {#each adventures as adventure} - - {/each} + - {#if transportations.length > 0} -

{$t('adventures.transportations')}

-
- {#each transportations as transportation} - { - transportations = transportations.filter((t) => t.id != event.detail); - }} - on:edit={editTransportation} - {collection} - /> - {/each} -
- {/if} + {#if currentView == 'all'} + {#if adventures.length > 0} +

{$t('adventures.linked_adventures')}

- {#if notes.length > 0} -

{$t('adventures.notes')}

-
- {#each notes as note} - { - noteToEdit = event.detail; - isNoteModalOpen = true; - }} - on:delete={(event) => { - notes = notes.filter((n) => n.id != event.detail); - }} - {collection} - /> - {/each} -
- {/if} +
+ {#each adventures as adventure} + + {/each} +
+ {/if} - {#if checklists.length > 0} -

{$t('adventures.checklists')}

-
- {#each checklists as checklist} - { - checklists = checklists.filter((n) => n.id != event.detail); - }} - on:edit={(event) => { - checklistToEdit = event.detail; - isShowingChecklistModal = true; - }} - {collection} - /> - {/each} -
+ {#if transportations.length > 0} +

{$t('adventures.transportations')}

+
+ {#each transportations as transportation} + { + transportations = transportations.filter((t) => t.id != event.detail); + }} + on:edit={editTransportation} + {collection} + /> + {/each} +
+ {/if} + + {#if notes.length > 0} +

{$t('adventures.notes')}

+
+ {#each notes as note} + { + noteToEdit = event.detail; + isNoteModalOpen = true; + }} + on:delete={(event) => { + notes = notes.filter((n) => n.id != event.detail); + }} + {collection} + /> + {/each} +
+ {/if} + + {#if checklists.length > 0} +

{$t('adventures.checklists')}

+
+ {#each checklists as checklist} + { + checklists = checklists.filter((n) => n.id != event.detail); + }} + on:edit={(event) => { + checklistToEdit = event.detail; + isShowingChecklistModal = true; + }} + {collection} + /> + {/each} +
+ {/if} {/if} {#if collection.start_date && collection.end_date} -
-
-
-

{$t('adventures.itineary_by_date')}

- {#if numberOfDays} -

- {$t('adventures.duration')}: - {numberOfDays} {$t('adventures.days')} -

- {/if} -

- Dates: {new Date(collection.start_date).toLocaleDateString(undefined, { timeZone: 'UTC' })} - - {new Date(collection.end_date).toLocaleDateString(undefined, { - timeZone: 'UTC' - })} -

-
-
-
- -
- {#each Array(numberOfDays) as _, i} - {@const startDate = new Date(collection.start_date)} - {@const tempDate = new Date(startDate.getTime())} - {@const adjustedDate = new Date(tempDate.setUTCDate(tempDate.getUTCDate() + i))} - {@const dateString = adjustedDate.toISOString().split('T')[0]} - - {@const dayAdventures = - groupAdventuresByDate(adventures, new Date(collection.start_date), numberOfDays)[ - dateString - ] || []} - {@const dayTransportations = - groupTransportationsByDate( - transportations, - new Date(collection.start_date), - numberOfDays - )[dateString] || []} - {@const dayNotes = - groupNotesByDate(notes, new Date(collection.start_date), numberOfDays)[dateString] || []} - {@const dayChecklists = - groupChecklistsByDate(checklists, new Date(collection.start_date), numberOfDays)[ - dateString - ] || []} - -
-
-

- {$t('adventures.day')} - {i + 1} -
- {adjustedDate.toLocaleDateString(undefined, { timeZone: 'UTC' })} -
-

- -
- -
- {#if dayAdventures.length > 0} - {#each dayAdventures as adventure} - - {/each} - {/if} - {#if dayTransportations.length > 0} - {#each dayTransportations as transportation} - { - transportations = transportations.filter((t) => t.id != event.detail); - }} - on:edit={(event) => { - transportationToEdit = event.detail; - isShowingTransportationModal = true; - }} - /> - {/each} - {/if} - {#if dayNotes.length > 0} - {#each dayNotes as note} - { - noteToEdit = event.detail; - isNoteModalOpen = true; - }} - on:delete={(event) => { - notes = notes.filter((n) => n.id != event.detail); - }} - /> - {/each} - {/if} - {#if dayChecklists.length > 0} - {#each dayChecklists as checklist} - { - notes = notes.filter((n) => n.id != event.detail); - }} - on:edit={(event) => { - checklistToEdit = event.detail; - isShowingChecklistModal = true; - }} - /> - {/each} - {/if} -
- - {#if dayAdventures.length == 0 && dayTransportations.length == 0 && dayNotes.length == 0 && dayChecklists.length == 0} -

{$t('adventures.nothing_planned')}

+ {#if currentView == 'itinerary'} +
+
+
+

{$t('adventures.itineary_by_date')}

+ {#if numberOfDays} +

+ {$t('adventures.duration')}: + {numberOfDays} {$t('adventures.days')} +

{/if} +

+ Dates: {new Date(collection.start_date).toLocaleDateString(undefined, { + timeZone: 'UTC' + })} - + {new Date(collection.end_date).toLocaleDateString(undefined, { + timeZone: 'UTC' + })} +

- {/each} -
- -
-
-

Trip Map

- - {#each adventures as adventure} - {#if adventure.longitude && adventure.latitude} - - -
{adventure.name}
-

- {adventure.category?.display_name + ' ' + adventure.category?.icon} -

-
-
- {/if} - {/each} - {#each transportations as transportation} - {#if transportation.destination_latitude && transportation.destination_longitude} - - - {getTransportationEmoji(transportation.type)} - - -
{transportation.name}
-

- {transportation.type} -

-
-
- {/if} - {#if transportation.origin_latitude && transportation.origin_longitude} - - - {getTransportationEmoji(transportation.type)} - - -
{transportation.name}
-

- {transportation.type} -

-
-
- {/if} - {/each} -
-
+ +
+ {#each Array(numberOfDays) as _, i} + {@const startDate = new Date(collection.start_date)} + {@const tempDate = new Date(startDate.getTime())} + {@const adjustedDate = new Date(tempDate.setUTCDate(tempDate.getUTCDate() + i))} + {@const dateString = adjustedDate.toISOString().split('T')[0]} + + {@const dayAdventures = + groupAdventuresByDate(adventures, new Date(collection.start_date), numberOfDays)[ + dateString + ] || []} + {@const dayTransportations = + groupTransportationsByDate( + transportations, + new Date(collection.start_date), + numberOfDays + )[dateString] || []} + {@const dayNotes = + groupNotesByDate(notes, new Date(collection.start_date), numberOfDays)[dateString] || + []} + {@const dayChecklists = + groupChecklistsByDate(checklists, new Date(collection.start_date), numberOfDays)[ + dateString + ] || []} + +
+
+

+ {$t('adventures.day')} + {i + 1} +
+ {adjustedDate.toLocaleDateString(undefined, { timeZone: 'UTC' })} +
+

+ +
+ +
+ {#if dayAdventures.length > 0} + {#each dayAdventures as adventure} + + {/each} + {/if} + {#if dayTransportations.length > 0} + {#each dayTransportations as transportation} + { + transportations = transportations.filter((t) => t.id != event.detail); + }} + on:edit={(event) => { + transportationToEdit = event.detail; + isShowingTransportationModal = true; + }} + /> + {/each} + {/if} + {#if dayNotes.length > 0} + {#each dayNotes as note} + { + noteToEdit = event.detail; + isNoteModalOpen = true; + }} + on:delete={(event) => { + notes = notes.filter((n) => n.id != event.detail); + }} + /> + {/each} + {/if} + {#if dayChecklists.length > 0} + {#each dayChecklists as checklist} + { + notes = notes.filter((n) => n.id != event.detail); + }} + on:edit={(event) => { + checklistToEdit = event.detail; + isShowingChecklistModal = true; + }} + /> + {/each} + {/if} +
+ + {#if dayAdventures.length == 0 && dayTransportations.length == 0 && dayNotes.length == 0 && dayChecklists.length == 0} +

{$t('adventures.nothing_planned')}

+ {/if} +
+
+ {/each} +
+ {/if} + + {#if currentView == 'map'} +
+
+

Trip Map

+ + {#each adventures as adventure} + {#if adventure.longitude && adventure.latitude} + + +
{adventure.name}
+

+ {adventure.category?.display_name + ' ' + adventure.category?.icon} +

+
+
+ {/if} + {/each} + {#each transportations as transportation} + {#if transportation.destination_latitude && transportation.destination_longitude} + + + {getTransportationEmoji(transportation.type)} + + +
{transportation.name}
+

+ {transportation.type} +

+
+
+ {/if} + {#if transportation.origin_latitude && transportation.origin_longitude} + + + {getTransportationEmoji(transportation.type)} + + +
{transportation.name}
+

+ {transportation.type} +

+
+
+ {/if} + {/each} +
+
+
+ {/if} + {#if currentView == 'calendar'} +
+
+

+ {$t('adventures.adventure_calendar')} +

+ +
+
+ {/if} {/if} {/if} diff --git a/frontend/src/routes/profile/+page.svelte b/frontend/src/routes/profile/+page.svelte index d57df6b..8722c26 100644 --- a/frontend/src/routes/profile/+page.svelte +++ b/frontend/src/routes/profile/+page.svelte @@ -11,82 +11,88 @@ total_countries: number; } | null; - if (data.stats) { - stats = data.stats; - } else { - stats = null; - } - console.log(stats); + stats = data.stats || null; -{#if data.user.profile_pic} -
-
- - -
+
+
+ + {#if data.user.profile_pic} +
+
+ Profile +
+
+ {/if} + + + {#if data.user && data.user.first_name && data.user.last_name} +

+ {data.user.first_name} + {data.user.last_name} +

+ {/if} +

{data.user.username}

+ + + {#if data.user && data.user.date_joined} +
+

{$t('profile.member_since')}

+
+ +

+ {new Date(data.user.date_joined).toLocaleDateString(undefined, { timeZone: 'UTC' })} +

+
+
+ {/if}
-{/if} -{#if data.user && data.user.first_name && data.user.last_name} -

- {data.user.first_name} - {data.user.last_name} -

-{/if} -

{data.user.username}

+ + {#if stats} +
-{#if data.user && data.user.date_joined} -

{$t('profile.member_since')}

-
- -

- {new Date(data.user.date_joined).toLocaleDateString(undefined, { timeZone: 'UTC' })} -

-
-{/if} +

+ {$t('profile.user_stats')} +

-{#if stats} - -
- -

{$t('profile.user_stats')}

- -
-
-
-
{$t('navbar.adventures')}
-
{stats.adventure_count}
- -
-
-
{$t('navbar.collections')}
-
{stats.trips_count}
- -
- -
-
{$t('profile.visited_countries')}
-
- {Math.round((stats.country_count / stats.total_countries) * 100)}% +
+
+
+
{$t('navbar.adventures')}
+
{stats.adventure_count}
-
- {stats.country_count}/{stats.total_countries} -
-
-
-
{$t('profile.visited_regions')}
-
- {Math.round((stats.visited_region_count / stats.total_regions) * 100)}% +
+
{$t('navbar.collections')}
+
{stats.trips_count}
-
- {stats.visited_region_count}/{stats.total_regions} + +
+
{$t('profile.visited_countries')}
+
+ {Math.round((stats.country_count / stats.total_countries) * 100)}% +
+
+ {stats.country_count}/{stats.total_countries} +
+
+ +
+
{$t('profile.visited_regions')}
+
+ {Math.round((stats.visited_region_count / stats.total_regions) * 100)}% +
+
+ {stats.visited_region_count}/{stats.total_regions} +
-
-{/if} + {/if} +
Profile | AdventureLog diff --git a/frontend/src/routes/user/reset-password/+page.svelte b/frontend/src/routes/user/reset-password/+page.svelte index 873e778..7cd1803 100644 --- a/frontend/src/routes/user/reset-password/+page.svelte +++ b/frontend/src/routes/user/reset-password/+page.svelte @@ -4,32 +4,47 @@ import { t } from 'svelte-i18n'; -

{$t('settings.reset_password')}

+
+

{$t('settings.reset_password')}

-
-
- -
- - {#if $page.form?.message} -
- {$t(`settings.${$page.form?.message}`)} +
+ +
+ +
- {/if} - {#if $page.form?.success} -
- {$t('settings.possible_reset')} + +
+
- {/if} - -
+ + {#if $page.form?.message} +
+ {$t(`settings.${$page.form?.message}`)} +
+ {/if} + + {#if $page.form?.success} +
+ {$t('settings.possible_reset')} +
+ {/if} + +
+
- Forgot Password + Reset Password diff --git a/frontend/src/routes/user/reset-password/[key]/+page.svelte b/frontend/src/routes/user/reset-password/[key]/+page.svelte index 7e837a4..e710af6 100644 --- a/frontend/src/routes/user/reset-password/[key]/+page.svelte +++ b/frontend/src/routes/user/reset-password/[key]/+page.svelte @@ -1,53 +1,66 @@ -

{$t('settings.change_password')}

+
+

+ {$t('settings.change_password')} +

-
-
- - +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + {#if $page.form?.message} +
+ {$t($page.form?.message)} +
+ {/if} +
- -
- - -
- - - - {#if $page.form?.message} -
- {$t($page.form?.message)} -
- {/if} - +
- Password Reset Confirm - + Change Password + diff --git a/frontend/src/routes/user/verify-email/[key]/+page.svelte b/frontend/src/routes/user/verify-email/[key]/+page.svelte index f025ad0..cadcc9c 100644 --- a/frontend/src/routes/user/verify-email/[key]/+page.svelte +++ b/frontend/src/routes/user/verify-email/[key]/+page.svelte @@ -5,10 +5,27 @@ export let data: PageData; -{#if data.verified} -

{$t('settings.email_verified')}

-

{$t('settings.email_verified_success')}

-{:else} -

{$t('settings.email_verified_error')}

-

{$t('settings.email_verified_erorr_desc')}

-{/if} +
+
+ {#if data.verified} +

+ {$t('settings.email_verified')} +

+

+ {$t('settings.email_verified_success')} +

+ {:else} +

+ {$t('settings.email_verified_error')} +

+

+ {$t('settings.email_verified_erorr_desc')} +

+ {/if} +
+
+ + + Email Verification + + diff --git a/frontend/src/routes/worldtravel/[id]/+page.server.ts b/frontend/src/routes/worldtravel/[id]/+page.server.ts index 2b00f3c..0191e67 100644 --- a/frontend/src/routes/worldtravel/[id]/+page.server.ts +++ b/frontend/src/routes/worldtravel/[id]/+page.server.ts @@ -6,7 +6,7 @@ import type { PageServerLoad } from './$types'; const endpoint = PUBLIC_SERVER_URL || 'http://localhost:8000'; export const load = (async (event) => { - const id = event.params.id; + const id = event.params.id.toUpperCase(); let regions: Region[] = []; let visitedRegions: VisitedRegion[] = []; diff --git a/frontend/static/backgrounds/adventurelog_christmas.webp b/frontend/static/backgrounds/adventurelog_christmas.webp new file mode 100644 index 0000000..a2a9039 Binary files /dev/null and b/frontend/static/backgrounds/adventurelog_christmas.webp differ diff --git a/frontend/static/backgrounds/adventurelog_new_year.webp b/frontend/static/backgrounds/adventurelog_new_year.webp new file mode 100644 index 0000000..64393ae Binary files /dev/null and b/frontend/static/backgrounds/adventurelog_new_year.webp differ