/** * LoginScreen Component * * Displays the login form for the PWA. * Handles username/password authentication with remember me option. */ export default { name: 'LoginScreen', emits: ['login', 'set-theme'], props: { theme: { type: String, default: 'system' } }, setup(props, { emit }) { const { ref } = Vue; // Form state const username = ref(''); const password = ref(''); const rememberMe = ref(true); const error = ref(''); const loading = ref(false); const showPassword = ref(false); // Theme picker (shown on first visit) const showThemePicker = ref(!localStorage.getItem('theme')); const handleSubmit = async () => { if (!username.value || !password.value) { error.value = 'Bitte Benutzername und Passwort eingeben'; return; } loading.value = true; error.value = ''; try { const result = await new Promise((resolve) => { // Emit returns undefined, we need to wait for parent to call back const loginPromise = emit('login', { username: username.value, password: password.value, rememberMe: rememberMe.value }); // The parent will return the result resolve(loginPromise); }); if (result && !result.success) { error.value = result.message || 'Login fehlgeschlagen'; if (result.requires2FA) { error.value = 'Zwei-Faktor-Authentifizierung wird derzeit nicht unterstützt.'; } } } catch (e) { error.value = 'Ein Fehler ist aufgetreten'; } finally { loading.value = false; } }; const selectTheme = (newTheme) => { emit('set-theme', newTheme); showThemePicker.value = false; }; return { username, password, rememberMe, error, loading, showPassword, showThemePicker, handleSubmit, selectTheme }; }, template: `
Wähle dein bevorzugtes Farbschema.
powered by XINON GmbH