feat: replace success modal with non-blocking toast notification
All checks were successful
Code Analysis and Production Deploy / analyze (push) Successful in 5m10s
Code Analysis and Production Deploy / deploy-production (push) Has been skipped
Code Analysis and Production Deploy / deploy-test (push) Successful in 2m14s

feat: add global event listener for mannschaften updates in Navigation component

feat: notify app of mannschaften changes after CSV save and handle visibility changes

refactor: remove unused anlagen page

fix: update CmsMannschaften reference in sportbetrieb page for reactivity

fix: enhance authentication token retrieval in passkey API endpoints

feat: implement refresh session and access token generation for Android clients in passkey login

fix: unify token retrieval method across passkey API endpoints

feat: add MediaTypes utility for JSON content type in Android app

feat: create PasskeyRepository for handling passkey authentication and registration in Android app

feat: add validated text field and rich text components for Android UI

feat: implement newsletter subscription and unsubscription screens in Android app

feat: create public pages including Impressum with dynamic content loading
This commit is contained in:
Torsten Schulz (local)
2026-05-28 08:33:28 +02:00
parent e033d716dd
commit 0528334eb4
37 changed files with 1297 additions and 364 deletions

View File

@@ -404,7 +404,7 @@
</template>
<script setup>
import { ref, onMounted, computed } from 'vue'
import { ref, onMounted, computed, onUnmounted } from 'vue'
import { Plus, Trash2, Loader2, AlertCircle, Pencil, Users, ChevronUp, ChevronDown, ArrowRight } from 'lucide-vue-next'
const isLoading = ref(true)
@@ -591,6 +591,12 @@ const saveCSV = async () => {
content: [header, ...rows].join('\n')
}
})
// Notify other parts of the app that mannschaften changed
try {
if (typeof window !== 'undefined') {
window.dispatchEvent(new CustomEvent('mannschaften:changed'))
}
} catch (e) { /* no-op */ }
}
const moveMannschaft = async (index, delta) => {
@@ -674,4 +680,30 @@ onMounted(async () => {
await loadSeasons()
await loadMannschaften().catch(() => {})
})
// Expose load function to parent components
try { defineExpose({ loadMannschaften }) } catch (e) { /* noop if not supported in SSR context */ }
// Reload when tab/window becomes visible or window gains focus
const handleVisibilityOrFocus = () => {
try {
if (document.visibilityState === 'visible') {
loadMannschaften().catch(() => {})
}
} catch (e) {
// ignore
}
}
if (typeof window !== 'undefined') {
window.addEventListener('visibilitychange', handleVisibilityOrFocus)
window.addEventListener('focus', handleVisibilityOrFocus)
}
onUnmounted(() => {
if (typeof window !== 'undefined') {
window.removeEventListener('visibilitychange', handleVisibilityOrFocus)
window.removeEventListener('focus', handleVisibilityOrFocus)
}
})
</script>