diff --git a/docs/DIRECTUS-SCHEMA.md b/docs/DIRECTUS-SCHEMA.md index 1481b50..cec4d18 100644 --- a/docs/DIRECTUS-SCHEMA.md +++ b/docs/DIRECTUS-SCHEMA.md @@ -173,6 +173,19 @@ User-Favoriten. --- +## directus_users (Custom Fields) + +Zusätzliche Felder für User-Einstellungen. + +| Feld | Typ | Beschreibung | +|------|-----|--------------| +| `preferred_currency` | string | Bevorzugte Währung: `USD`, `EUR`, `CHF` (Default: `USD`) | +| `preferred_locale` | string | Bevorzugte Sprache: `de`, `en`, `fr` | + +**Hinweis:** Diese Felder müssen in Directus unter Settings → Data Model → directus_users angelegt werden. + +--- + ## reports Meldungen von Anzeigen. diff --git a/js/components/pages/page-settings.js b/js/components/pages/page-settings.js index f4ef13d..c96e55e 100644 --- a/js/components/pages/page-settings.js +++ b/js/components/pages/page-settings.js @@ -46,13 +46,17 @@ class PageSettings extends HTMLElement { }) // Language select - this.querySelector('#lang-select')?.addEventListener('change', (e) => { + this.querySelector('#lang-select')?.addEventListener('change', async (e) => { i18n.setLocale(e.target.value) + // Save to user profile if logged in + if (this.isLoggedIn) { + await auth.updatePreferences({ preferred_locale: e.target.value }) + } }) // Currency select - this.querySelector('#currency-select')?.addEventListener('change', (e) => { - this.setCurrency(e.target.value) + this.querySelector('#currency-select')?.addEventListener('change', async (e) => { + await this.setCurrency(e.target.value) this.showToast(t('settings.currencyChanged')) }) @@ -103,9 +107,14 @@ class PageSettings extends HTMLElement { return localStorage.getItem('dgray_currency') || 'USD' } - setCurrency(currency) { + async setCurrency(currency) { localStorage.setItem('dgray_currency', currency) window.dispatchEvent(new CustomEvent('currency-changed', { detail: { currency } })) + + // Save to user profile if logged in + if (auth.isLoggedIn()) { + await auth.updatePreferences({ preferred_currency: currency }) + } } showToast(message) { diff --git a/js/services/auth.js b/js/services/auth.js index 0bffb7b..dcb35e0 100644 --- a/js/services/auth.js +++ b/js/services/auth.js @@ -7,6 +7,7 @@ */ import { directus } from './directus.js' +import { i18n } from '../i18n.js' const AUTH_DOMAIN = 'dgray.io' @@ -122,7 +123,7 @@ class AuthService { } /** - * Logs out the current user + * Logs out the current user and resets preferences to defaults */ async logout() { try { @@ -133,9 +134,24 @@ class AuthService { this.currentUser = null this.clearStoredUuid() + this.resetPreferencesToDefaults() this.notifyListeners() } + /** + * Reset preferences to defaults on logout + */ + resetPreferencesToDefaults() { + const defaultCurrency = 'USD' + const defaultLocale = 'en' + + localStorage.setItem('dgray_currency', defaultCurrency) + localStorage.setItem('locale', defaultLocale) + + window.dispatchEvent(new CustomEvent('currency-changed', { detail: { currency: defaultCurrency } })) + i18n.setLocale(defaultLocale) + } + /** * Checks if user is logged in * @returns {boolean} @@ -154,6 +170,8 @@ class AuthService { if (!this.currentUser) { try { this.currentUser = await directus.getCurrentUser() + // Sync preferences to localStorage + this.syncPreferencesToLocal() } catch (e) { return null } @@ -162,6 +180,45 @@ class AuthService { return this.currentUser } + /** + * Sync user preferences from Directus to localStorage and apply them + */ + syncPreferencesToLocal() { + if (!this.currentUser) return + + if (this.currentUser.preferred_currency) { + const currency = this.currentUser.preferred_currency + localStorage.setItem('dgray_currency', currency) + window.dispatchEvent(new CustomEvent('currency-changed', { detail: { currency } })) + } + if (this.currentUser.preferred_locale) { + const locale = this.currentUser.preferred_locale + localStorage.setItem('locale', locale) + i18n.setLocale(locale) + } + } + + /** + * Update user preferences in Directus + * @param {Object} prefs - Preferences to update + * @param {string} [prefs.preferred_currency] - Currency code + * @param {string} [prefs.preferred_locale] - Locale code + * @returns {Promise} Success + */ + async updatePreferences(prefs) { + if (!this.isLoggedIn()) return false + + try { + await directus.updateCurrentUser(prefs) + // Update local cache + this.currentUser = { ...this.currentUser, ...prefs } + return true + } catch (e) { + console.error('Failed to update preferences:', e) + return false + } + } + /** * Stores UUID in localStorage (optional convenience) * User should still backup their UUID @@ -210,6 +267,7 @@ class AuthService { if (directus.isAuthenticated()) { try { this.currentUser = await directus.getCurrentUser() + this.syncPreferencesToLocal() this.notifyListeners() return true } catch (e) { diff --git a/js/services/directus.js b/js/services/directus.js index ad550c0..398a623 100644 --- a/js/services/directus.js +++ b/js/services/directus.js @@ -296,7 +296,7 @@ class DirectusService { async getCurrentUser() { const response = await this.get('/users/me', { - fields: ['id', 'email', 'first_name', 'last_name', 'avatar', 'role.name', 'status'] + fields: ['id', 'email', 'first_name', 'last_name', 'avatar', 'role.name', 'status', 'preferred_currency', 'preferred_locale'] }) return response.data }