diff --git a/frontend/src/lib/components/collections/CollectionItineraryPlanner.svelte b/frontend/src/lib/components/collections/CollectionItineraryPlanner.svelte index 5a2f2b1f..c8382a90 100644 --- a/frontend/src/lib/components/collections/CollectionItineraryPlanner.svelte +++ b/frontend/src/lib/components/collections/CollectionItineraryPlanner.svelte @@ -1191,8 +1191,22 @@ return !getCoordinatesFromItineraryItem(item); }); - days[dayIndex].items = [...optimizedPath, ...nonCoordinateItems, ...shadowItems]; + const newDayItems = [...optimizedPath, ...nonCoordinateItems, ...shadowItems]; + + // Patch collection.itinerary order values so the reactive $: days rebuild + // uses the new order when it eventually fires. + newDayItems.forEach((item, index) => { + const itineraryItem = collection.itinerary?.find((it) => it.id === item.id); + if (itineraryItem) { + itineraryItem.order = index; + } + }); + // Also directly set days so saveReorderedItems() reads the correct order synchronously + // (Svelte 4 batches reactive statements; days isn't updated yet when saveReorderedItems runs) + days[dayIndex].items = newDayItems; days = [...days]; + // Trigger collection reactivity so the eventual reactive rebuild uses new orders + collection = { ...collection, itinerary: [...(collection.itinerary || [])] }; isSavingOrder = true; savingDay = day.date; diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 3548bab0..042fbc51 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -748,6 +748,14 @@ "no_api_keys_saved": "Noch keine API-Schlüssel gespeichert.", "add_api_key": "API-Schlüssel hinzufügen", "provider": "Anbieter", + "api_key_provider_anthropic": "Anthropic", + "api_key_provider_openai": "OpenAI", + "api_key_provider_gemini": "Google Gemini", + "api_key_provider_ollama": "Ollama (Lokal)", + "api_key_provider_groq": "Groq", + "api_key_provider_mistral": "Mistral AI", + "api_key_provider_github_models": "GitHub Models", + "api_key_provider_openrouter": "OpenRouter", "api_key_provider_google_places": "Google Places API", "api_key_value": "API-Schlüssel", "api_key_value_placeholder": "Geben Sie Ihren API-Schlüssel ein", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 9d837fba..2cef69d6 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -745,6 +745,14 @@ "no_api_keys_saved": "No API keys saved yet.", "add_api_key": "Add API Key", "provider": "Provider", + "api_key_provider_anthropic": "Anthropic", + "api_key_provider_openai": "OpenAI", + "api_key_provider_gemini": "Google Gemini", + "api_key_provider_ollama": "Ollama (Local)", + "api_key_provider_groq": "Groq", + "api_key_provider_mistral": "Mistral AI", + "api_key_provider_github_models": "GitHub Models", + "api_key_provider_openrouter": "OpenRouter", "api_key_provider_google_places": "Google Places API", "api_key_value": "API Key", "api_key_value_placeholder": "Enter your API key", diff --git a/frontend/src/routes/settings/+page.svelte b/frontend/src/routes/settings/+page.svelte index 5b8e6b33..ca70e7e4 100644 --- a/frontend/src/routes/settings/+page.svelte +++ b/frontend/src/routes/settings/+page.svelte @@ -45,7 +45,7 @@ }; let userApiKeys: UserAPIKey[] = data.props.apiKeys ?? []; let apiKeysConfigError: string | null = data.props.apiKeysConfigError ?? null; - let newApiKeyProvider = 'google_maps'; + let newApiKeyProvider = 'anthropic'; let newApiKeyValue = ''; let isSavingApiKey = false; let deletingApiKeyId: string | null = null; @@ -53,6 +53,30 @@ let isLoadingMcpToken = false; let activeSection: string = 'profile'; + const API_KEY_PROVIDER_OPTIONS = [ + { value: 'anthropic', labelKey: 'settings.api_key_provider_anthropic' }, + { value: 'openai', labelKey: 'settings.api_key_provider_openai' }, + { value: 'gemini', labelKey: 'settings.api_key_provider_gemini' }, + { value: 'ollama', labelKey: 'settings.api_key_provider_ollama' }, + { value: 'groq', labelKey: 'settings.api_key_provider_groq' }, + { value: 'mistral', labelKey: 'settings.api_key_provider_mistral' }, + { value: 'github_models', labelKey: 'settings.api_key_provider_github_models' }, + { value: 'openrouter', labelKey: 'settings.api_key_provider_openrouter' } + ]; + + function getApiKeyProviderLabel(provider: string): string { + const option = API_KEY_PROVIDER_OPTIONS.find((entry) => entry.value === provider); + if (option) { + return $t(option.labelKey); + } + + if (provider === 'google_maps') { + return $t('settings.api_key_provider_google_places'); + } + + return provider; + } + // typed alias for social providers to satisfy TypeScript let socialProviders: Provider[] = data.props.socialProviders ?? []; @@ -1586,7 +1610,7 @@ {#each userApiKeys as apiKey}