diff --git a/frontend/src/lib/components/settings/IntegrationsSettings.svelte b/frontend/src/lib/components/settings/IntegrationsSettings.svelte new file mode 100644 index 00000000..c3cbba86 --- /dev/null +++ b/frontend/src/lib/components/settings/IntegrationsSettings.svelte @@ -0,0 +1,510 @@ + + + +
+
+ Immich +
+

Immich

+

{$t('immich.immich_integration_desc')}

+
+ {#if immichIntegration} +
{$t('settings.connected')}
+ {:else} +
{$t('settings.disconnected')}
+ {/if} +
+ + {#if immichIntegration && !newImmichIntegration.id} +
+ + +
+ {/if} + + {#if !immichIntegration || newImmichIntegration.id} +
+
+ + + {#if newImmichIntegration.server_url && !newImmichIntegration.server_url.endsWith('api')} +
+ {$t('immich.api_note')} +
+ {/if} + {#if newImmichIntegration.server_url && (newImmichIntegration.server_url.includes('localhost') || newImmichIntegration.server_url.includes('127.0.0.1'))} +
+ {$t('immich.localhost_note')} +
+ {/if} +
+ +
+ + +
+ +
+ +
+ + +
+ {/if} + +
+

+ 📖 {$t('immich.need_help')} + + {$t('navbar.documentation')} + +

+
+
+ + +
+
+ Google Maps +
+

Google Maps

+

{$t('google_maps.google_maps_integration_desc')}

+
+ {#if googleMapsEnabled} +
{$t('settings.connected')}
+ {:else} +
{$t('settings.disconnected')}
+ {/if} +
+ + {#if user.is_staff || !googleMapsEnabled} +
+ {#if user.is_staff} +

+ 📖 {$t('immich.need_help')} + + {$t('navbar.documentation')} + +

+ {:else if !googleMapsEnabled} +

â„šī¸ {$t('google_maps.google_maps_integration_desc_no_staff')}

+ {/if} +
+ {/if} +
+ + +
+
+ Strava +
+

Strava

+

{$t('strava.strava_integration_desc')}

+
+ {#if stravaGlobalEnabled && stravaUserEnabled} +
{$t('settings.connected')}
+ {:else} +
{$t('settings.disconnected')}
+ {/if} +
+ + {#if !stravaGlobalEnabled} +
+

+ {$t('strava.not_enabled') || 'Strava integration is not enabled on this instance.'} +

+
+ {:else if !stravaUserEnabled} +
+ +
+ {:else} +
+ +
+ {/if} + + {#if user.is_staff || !stravaGlobalEnabled} +
+ {#if user.is_staff} +

+ 📖 {$t('immich.need_help')} + + {$t('navbar.documentation')} + +

+ {:else if !stravaGlobalEnabled} +

â„šī¸ {$t('google_maps.google_maps_integration_desc_no_staff')}

+ {/if} +
+ {/if} +
+ + +
+
+ Wanderer +
+

Wanderer

+

{$t('wanderer.wanderer_integration_desc')}

+
+ {#if wandererEnabled} +
{$t('settings.connected')}
+ {:else} +
{$t('settings.disconnected')}
+ {/if} +
+ + {#if wandererIntegration && !newWandererIntegration.id} +
+ + +
+ {/if} + + {#if !wandererIntegration || newWandererIntegration.id} +
+
+ + + {#if newWandererIntegration.server_url && (newWandererIntegration.server_url.includes('localhost') || newWandererIntegration.server_url.includes('127.0.0.1'))} +
+ {$t('wanderer.localhost_note')} +
+ {/if} +
+ +
+ + +
+ + +
+ {/if} + +
+

+ 📖 {$t('immich.need_help')} + + {$t('navbar.documentation')} + +

+
+
+ + +
+
+
✨
+
+

{$t('settings.integrations_hub.builtin_title')}

+

+ {$t('settings.integrations_hub.builtin_desc')} +

+
+
+ {$t('settings.integrations_hub.included')} +
+
+ + +
diff --git a/frontend/src/lib/components/settings/integrationCatalog.ts b/frontend/src/lib/components/settings/integrationCatalog.ts new file mode 100644 index 00000000..3a192251 --- /dev/null +++ b/frontend/src/lib/components/settings/integrationCatalog.ts @@ -0,0 +1,33 @@ +export type BuiltinIntegrationDef = { + id: string; + nameKey: string; + descriptionKey: string; + icon: 'osm' | 'wikipedia' | 'sunrise' | 'overpass'; +}; + +export const BUILTIN_INTEGRATIONS: BuiltinIntegrationDef[] = [ + { + id: 'nominatim', + nameKey: 'settings.integrations_hub.builtin.nominatim_name', + descriptionKey: 'settings.integrations_hub.builtin.nominatim_desc', + icon: 'osm' + }, + { + id: 'wikipedia', + nameKey: 'settings.integrations_hub.builtin.wikipedia_name', + descriptionKey: 'settings.integrations_hub.builtin.wikipedia_desc', + icon: 'wikipedia' + }, + { + id: 'sunrise_sunset', + nameKey: 'settings.integrations_hub.builtin.sunrise_name', + descriptionKey: 'settings.integrations_hub.builtin.sunrise_desc', + icon: 'sunrise' + }, + { + id: 'overpass', + nameKey: 'settings.integrations_hub.builtin.overpass_name', + descriptionKey: 'settings.integrations_hub.builtin.overpass_desc', + icon: 'overpass' + } +]; diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 2805ad91..3001c5f9 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -714,6 +714,38 @@ "emails": "Emails", "integrations": "Integrations", "integrations_desc": "Connect external services to enhance your experience", + "integrations_hub": { + "summary_builtin": "Built-in services", + "summary_builtin_desc": "Always available on every instance", + "summary_instance": "Instance services", + "summary_instance_desc": "Enabled by your server admin", + "summary_personal": "Your connections", + "summary_personal_desc": "Linked to your account", + "builtin_title": "Built-in services", + "builtin_desc": "These data sources power AdventureLog out of the box. No setup is required.", + "included": "Included", + "learn_more": "Learn more", + "instance_title": "Instance services", + "instance_desc": "Optional services configured by your AdventureLog administrator.", + "personal_title": "Your connections", + "personal_desc": "Link your own accounts and self-hosted services.", + "google_maps_features": "Place search, map details, quick-add enrichment, and nearby recommendations.", + "google_maps_active_hint": "Google Maps is active on this instance. Place search and enrichment use it when available.", + "builtin": { + "nominatim_name": "OpenStreetMap Nominatim", + "nominatim_desc": "Fallback geocoding and place search when Google Maps is unavailable.", + "nominatim_features": "Used for location search, reverse geocoding, and coordinate lookups.", + "wikipedia_name": "Wikipedia", + "wikipedia_desc": "Enriches locations with background descriptions and reference images.", + "wikipedia_features": "Used when generating descriptions and importing Wikipedia photos.", + "sunrise_name": "SunriseSunset.io", + "sunrise_desc": "Adds sunrise and sunset times to your location visits.", + "sunrise_features": "Shown on location detail pages for each visit date.", + "overpass_name": "OpenStreetMap Overpass", + "overpass_desc": "Powers nearby recommendations from OpenStreetMap data.", + "overpass_features": "Used for map recommendations and as a fallback when Google is unavailable." + } + }, "admin": "Admin", "advanced": "Advanced", "profile_info": "Profile Information", diff --git a/frontend/src/routes/collections/[id]/+page.svelte b/frontend/src/routes/collections/[id]/+page.svelte index 3feca824..ea484bb2 100644 --- a/frontend/src/routes/collections/[id]/+page.svelte +++ b/frontend/src/routes/collections/[id]/+page.svelte @@ -1,6 +1,5 @@