- Update translateElement function to support HTML tags
- Settings modal note now displays with proper <strong> formatting
- Applied to both dashboard and leaderboard
- Text with HTML tags now uses innerHTML instead of textContent
- Replace emoji flags with SVG-based country flags
- German flag: Black-Red-Gold (official colors)
- USA flag: Red-White-Blue with stars
- Dynamic flag switching on language change
- Applied to both dashboard and leaderboard
- Database achievements now support English translations
- Extended achievements table with name_en and description_en columns
- Updated API routes to return English translations
- Simplified frontend translation system to use database translations
- Added language selector in top-left corner
- Implemented data attributes for all translatable text
- Created language management system with localStorage persistence
- Updated all JavaScript functions to support both languages
- Added translations for notifications, error messages, and UI elements
- Maintained existing functionality while adding language switching
- Added proper HTML/body height: 100% for full viewport height
- Changed body to flex-direction: column for proper footer positioning
- Updated footer CSS with margin-top: auto for sticky footer behavior
- Added flex-grow: 1 to containers for proper space distribution
- Footer now properly sticks to bottom of viewport
- Improved responsive layout for both adminlogin and generator pages
- Removed automatic API location name usage
- User input from locationSearch field is used as location name
- API search only provides coordinates (latitude/longitude)
- User has full control over location naming
- Search functionality purely for coordinate lookup
- Added hidden field 'realLocationName' to store actual location name from Nominatim API
- Updated location saving to use real location name (display_name) instead of search term
- Fallback to search term if real location name not available
- Now saves proper location names like 'Marienplatz, Altstadt-Lehel, München, Bayern, Deutschland' instead of just 'München'
- Improved location data quality in database
- Added show_in_leaderboard to user-player API response
- Improved loadSettings() function with better error handling
- Added console logging for debugging
- Settings modal now shows current user preference instead of always 'off'
- Fixed dependency on currentPlayerId (now uses currentUser.id directly)
- Changed from /api/v1/private/update-player-settings to /api/v1/public/update-player-settings
- Removed API key requirement for logged-in users
- Added both public and private endpoints for flexibility
- Fixed 401 Unauthorized error in settings modal
✨ Features:
- Added show_in_leaderboard column to players table (default: false)
- Replaced Quick Actions with Settings section in dashboard
- Added toggle switch for leaderboard visibility
- Created settings modal with privacy controls
🔧 API Changes:
- Added /api/v1/private/update-player-settings endpoint
- Updated best-times queries to filter by show_in_leaderboard
- Updated times-with-details to respect privacy settings
- Added updated_at column to players table
🎨 UI/UX:
- Modern toggle switch design
- Responsive settings modal
- Success/error notifications
- Clear privacy explanation
🔐 Privacy:
- Default: Times are NOT shown in global leaderboard
- Users can opt-in via settings
- Personal dashboard always shows own times
- Global leaderboard only shows opted-in users