Berücksichtige lokale Datumswerte bei der Berechnung von Abwesenheiten und verbessere die Testabdeckung für Wochenansichten und Arbeitszeiten.
All checks were successful
Deploy production / deploy (push) Successful in 53s

This commit is contained in:
Torsten Schulz (local)
2026-10-27 14:05:55 +01:00
parent 473ab93eb7
commit df17d37c16
7 changed files with 187 additions and 81 deletions

View File

@@ -88,6 +88,8 @@ const fetchStats = async () => {
missingBreakMinutes.value = 0
}
updateCurrentlyWorkedTime()
updateOpenTime()
isReady.value = true
}
@@ -164,7 +166,7 @@ const updateCurrentlyWorkedTime = () => {
}
// Verwende Server-Werte nur, wenn NICHT gearbeitet wird (oder kein laufender Start vorhanden)
const shouldUseServerSummary = !workStartTime.value
const shouldUseServerSummary = Boolean(serverWorkedTime.value)
if (shouldUseServerSummary && serverWorkedTime.value && serverTimestamp.value) {
// Parse Server-Zeit (HH:MM:SS)
@@ -406,11 +408,9 @@ onBeforeUnmount(() => {
})
const displayRows = computed(() => {
// Verwende Server-Wert für "Derzeit gearbeitet" wenn verfügbar (zeigt gesamte Tagesarbeitszeit)
const workedDisplay = (stats.value?.currentlyWorked && stats.value.currentlyWorked !== '—')
? stats.value.currentlyWorked + ' h'
: (currentlyWorkedTime.value === '—' ? currentlyWorkedTime.value : currentlyWorkedTime.value + ' h');
const workedDisplay = currentlyWorkedTime.value === '—'
? '—' : currentlyWorkedTime.value + ' h';
const rows = {
'Derzeit gearbeitet': workedDisplay,
'Offen': openTime.value === '—' || openTime.value.includes('erreicht') ? openTime.value : openTime.value + ' h',

View File

@@ -196,6 +196,7 @@ async function createSick() {
// Liste neu laden
await loadSickEntries()
window.dispatchEvent(new CustomEvent('worklog-updated'))
} catch (error) {
console.error('Fehler beim Erstellen des Krankheitseintrags:', error)
await alert(`Fehler: ${error.message}`, 'Fehler')
@@ -227,6 +228,7 @@ async function deleteSick(id) {
}
await loadSickEntries()
window.dispatchEvent(new CustomEvent('worklog-updated'))
} catch (error) {
console.error('Fehler beim Löschen des Krankheitseintrags:', error)
await alert(`Fehler: ${error.message}`, 'Fehler')

View File

@@ -181,6 +181,7 @@ async function createVacation() {
resetForm()
await loadVacations()
window.dispatchEvent(new CustomEvent('worklog-updated'))
} catch (error) {
console.error('Fehler beim Erstellen des Urlaubseintrags:', error)
await alert(`Fehler: ${error.message}`, 'Fehler')
@@ -210,6 +211,7 @@ async function deleteVacation(id) {
}
await loadVacations()
window.dispatchEvent(new CustomEvent('worklog-updated'))
} catch (error) {
console.error('Fehler beim Löschen des Urlaubseintrags:', error)
await alert(`Fehler: ${error.message}`, 'Fehler')

View File

@@ -103,8 +103,7 @@
<div v-if="block.totalWorkTime" class="total-work-time">
{{ block.totalWorkTime }}
</div>
<!-- Laufende Blöcke haben keine Gesamtarbeitszeit. Der Platzhalter hält
die anschließenden Pausensummen auf Höhe der Pausenzeit. -->
<!-- Platzhalter für ältere API-Antworten ohne laufende Dauer. -->
<div v-else-if="block.pauseTimes && block.pauseTimes.length > 0" class="total-work-time" aria-hidden="true">
&nbsp;
</div>
@@ -204,6 +203,7 @@ const authStore = useAuthStore()
const loading = ref(true)
const weekData = ref(null)
const weekOffset = ref(0)
let refreshInterval = null
const weekDays = computed(() => {
if (!weekData.value) return []
@@ -237,9 +237,9 @@ const formatDate = (dateString) => {
})
}
const loadWeekData = async () => {
const loadWeekData = async (background = false) => {
try {
loading.value = true
if (!background) loading.value = true
const response = await fetch(`${API_URL}/week-overview?weekOffset=${weekOffset.value}`, {
cache: 'no-store',
@@ -381,12 +381,14 @@ const handleWorklogUpdate = () => {
onMounted(() => {
loadWeekData()
refreshInterval = setInterval(() => loadWeekData(true), 60000)
// Event-Listener für Worklog-Updates
window.addEventListener('worklog-updated', handleWorklogUpdate)
})
onBeforeUnmount(() => {
if (refreshInterval) clearInterval(refreshInterval)
window.removeEventListener('worklog-updated', handleWorklogUpdate)
})
</script>