Fix language setting not being saved to database on admin settings page

- Added default_language field to general settings state in SettingsPage
- Replaced LanguageSelector component with simple select dropdown on settings page
- Fixed public settings endpoint to read general_default_language from database
- Language setting now properly saved when clicking Save Settings button
- Setting is correctly used by gallery login page and legal pages

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-07-08 09:49:45 +02:00
parent cfa0b0da69
commit 2012b0bab9
91 changed files with 6183 additions and 577 deletions
+67 -5
View File
@@ -4,17 +4,21 @@ import {
Database,
Globe,
Key,
AlertCircle
AlertCircle,
Image
} from 'lucide-react';
import { toast } from 'react-toastify';
import { Button, Card, Input, Loading } from '../../components/common';
import { CategoryManager } from '../../components/admin/CategoryManager';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { settingsService } from '../../services/settings.service';
import { useTranslation } from 'react-i18next';
export const SettingsPage: React.FC = () => {
const [activeTab, setActiveTab] = useState<'general' | 'storage' | 'security'>('general');
const [activeTab, setActiveTab] = useState<'general' | 'storage' | 'security' | 'categories'>('general');
const queryClient = useQueryClient();
const { t } = useTranslation();
// Fetch settings
const { data: settings, isLoading } = useQuery({
@@ -38,7 +42,8 @@ export const SettingsPage: React.FC = () => {
enable_watermark: false,
enable_analytics: true,
enable_registration: false,
maintenance_mode: false
maintenance_mode: false,
default_language: 'en'
});
// Security settings state
@@ -64,7 +69,8 @@ export const SettingsPage: React.FC = () => {
enable_watermark: settings.general_enable_watermark || false,
enable_analytics: settings.general_enable_analytics || true,
enable_registration: settings.general_enable_registration || false,
maintenance_mode: settings.general_maintenance_mode || false
maintenance_mode: settings.general_maintenance_mode || false,
default_language: settings.general_default_language || 'en'
});
// Extract security settings
@@ -166,6 +172,16 @@ export const SettingsPage: React.FC = () => {
>
Security
</button>
<button
onClick={() => setActiveTab('categories')}
className={`py-2 px-1 border-b-2 font-medium text-sm transition-colors ${
activeTab === 'categories'
? 'border-primary-600 text-primary-600'
: 'border-transparent text-neutral-500 hover:text-neutral-700'
}`}
>
Categories
</button>
</nav>
</div>
@@ -280,6 +296,29 @@ export const SettingsPage: React.FC = () => {
<span className="ml-2 text-sm text-neutral-700">Enable maintenance mode</span>
</label>
</div>
</Card>
<Card padding="md">
<h2 className="text-lg font-semibold text-neutral-900 mb-4">{t('settings.general.language')}</h2>
<div className="space-y-4">
<div>
<label className="block text-sm font-medium text-neutral-700 mb-2">
{t('settings.general.language')}
</label>
<select
value={generalSettings.default_language}
onChange={(e) => setGeneralSettings(prev => ({ ...prev, default_language: e.target.value }))}
className="w-full px-3 py-2 border border-neutral-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-primary-500"
>
<option value="en">English</option>
<option value="de">Deutsch</option>
</select>
<p className="text-xs text-neutral-500 mt-1">
Sets the default language for all gallery pages and login screens
</p>
</div>
</div>
<div className="mt-6">
<Button
@@ -288,7 +327,7 @@ export const SettingsPage: React.FC = () => {
isLoading={saveGeneralMutation.isPending}
leftIcon={<Save className="w-5 h-5" />}
>
Save General Settings
{t('settings.general.saveSettings')}
</Button>
</div>
</Card>
@@ -510,6 +549,29 @@ export const SettingsPage: React.FC = () => {
</Card>
</div>
)}
{/* Categories Tab */}
{activeTab === 'categories' && (
<div className="space-y-6">
<Card padding="md">
<CategoryManager />
</Card>
<Card padding="md">
<div className="flex items-start gap-3">
<Image className="w-5 h-5 text-blue-600 flex-shrink-0" />
<div>
<h3 className="text-sm font-semibold text-blue-900">About Photo Categories</h3>
<p className="text-sm text-blue-700 mt-1">
Global categories are available for all events. You can also create event-specific
categories when editing individual events. Categories help organize photos and
allow guests to filter photos by type in the gallery view.
</p>
</div>
</div>
</Card>
</div>
)}
</div>
);
};