Files
timemaster/frontend/src/hooks/usePlanerView.ts
T
sysops 1fedd683e0 Initial commit – TimeMaster Zeiterfassung & HR-Tool
Stand: agent-06 (Audit-Log), agent-05 (Krankmeldung), agent-07 Phase 1 (Personalnummer),
Busylight-Pull-Integration, TOTP/2FA, Abwesenheiten, Zeiterfassung, Kiosk-Grundgerüst.
Migrations 0001–0023 deployed auf 192.168.1.137 + .164.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 20:03:27 +02:00

51 lines
1.9 KiB
TypeScript

import { useState, useCallback, useEffect } from 'react'
import { api } from '../api/client'
import type { UserOut, UserListItem, VacationBalanceOut } from '../types/absence'
import { MANAGER_ROLES } from '../utils/calendar'
export function usePlanerView(user: UserOut | null, colleagues: UserListItem[], year: number) {
const [viewMode, setViewMode] = useState<'liste' | 'planer'>('liste')
const [planMonth, setPlanMonth] = useState(new Date().getMonth())
const [colleagueBalances, setColleagueBalances] = useState<Record<string, VacationBalanceOut>>({})
const [balancesLoaded, setBalancesLoaded] = useState(false)
const [showYearGrid, setShowYearGrid] = useState<boolean>(() => {
try { return localStorage.getItem('planer_showYearGrid') !== 'false' }
catch { return true }
})
useEffect(() => {
try { localStorage.setItem('planer_showYearGrid', String(showYearGrid)) }
catch { /* ignore */ }
}, [showYearGrid])
const loadColleagueBalances = useCallback(async (list: UserListItem[]) => {
if (list.length === 0 || balancesLoaded) return
try {
const results = await Promise.allSettled(
list.map(c => api.get<VacationBalanceOut>(`/absences/balance/${c.id}?year=${year}`))
)
const map: Record<string, VacationBalanceOut> = {}
results.forEach((r, i) => { if (r.status === 'fulfilled') map[list[i].id] = r.value })
setColleagueBalances(map)
setBalancesLoaded(true)
} catch { /* ignore */ }
}, [year, balancesLoaded])
useEffect(() => {
if (viewMode === 'planer' && user && MANAGER_ROLES.includes(user.role) && colleagues.length > 0 && !balancesLoaded) {
loadColleagueBalances(colleagues)
}
}, [viewMode, user, colleagues, balancesLoaded, loadColleagueBalances])
return {
viewMode,
setViewMode,
planMonth,
setPlanMonth,
colleagueBalances,
balancesLoaded,
showYearGrid,
setShowYearGrid,
}
}