feat: Add CMS and Member Area screens with ViewModels
All checks were successful
Code Analysis and Production Deploy / analyze (push) Successful in 5m23s
Code Analysis and Production Deploy / deploy-production (push) Has been skipped
Code Analysis and Production Deploy / deploy-test (push) Successful in 2m18s

- Implemented CmsViewModel to manage CMS data loading and state.
- Created MemberAreaDetailScreens for displaying member information and news.
- Added MembersViewModel and MemberNewsViewModel for managing member data and news.
- Developed MemberAreaScreen to provide navigation and display member-related options.
- Introduced ProfileScreen and ProfileViewModel for user profile management.
- Implemented state management for loading, error handling, and form updates across screens.
This commit is contained in:
Torsten Schulz (local)
2026-05-28 08:01:35 +02:00
parent e195d5d189
commit e033d716dd
34 changed files with 1809 additions and 72 deletions

View File

@@ -155,10 +155,11 @@
<script setup>
import { onMounted, ref } from 'vue'
import { useRouter } from 'vue-router'
import { useRouter, useRoute } from 'vue-router'
import { AlertCircle, Check, Loader2, Lock } from 'lucide-vue-next'
const router = useRouter()
const route = useRoute()
const authStore = useAuthStore()
const formData = ref({
@@ -199,16 +200,15 @@ const handleLogin = async () => {
if (response.success) {
successMessage.value = 'Anmeldung erfolgreich! Sie werden weitergeleitet...'
// Redirect based on role
// Redirect: prefer `redirect` query (only same-origin paths), otherwise open the member area.
setTimeout(() => {
const roles = response.user.roles || (response.user.role ? [response.user.role] : [])
if (roles.includes('trainer')) {
router.push('/cms/kontaktanfragen')
} else if (roles.includes('admin') || roles.includes('vorstand') || roles.includes('newsletter')) {
router.push('/cms')
} else {
router.push('/mitgliederbereich')
const requested = route.query.redirect
if (typeof requested === 'string' && requested.startsWith('/')) {
router.push(requested)
return
}
router.push('/mitgliederbereich')
}, 1000)
}
} catch (error) {
@@ -230,14 +230,13 @@ const handlePasskeyLogin = async () => {
successMessage.value = 'Passkey-Anmeldung erfolgreich! Sie werden weitergeleitet...'
setTimeout(() => {
const roles = response.user.roles || (response.user.role ? [response.user.role] : [])
if (roles.includes('trainer')) {
router.push('/cms/kontaktanfragen')
} else if (roles.includes('admin') || roles.includes('vorstand') || roles.includes('newsletter')) {
router.push('/cms')
} else {
router.push('/mitgliederbereich')
const requested = route.query.redirect
if (typeof requested === 'string' && requested.startsWith('/')) {
router.push(requested)
return
}
router.push('/mitgliederbereich')
}, 1000)
}
} catch (error) {
@@ -256,4 +255,3 @@ useHead({
title: 'Login - Harheimer TC',
})
</script>