1fedd683e0
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>
51 lines
1.9 KiB
TypeScript
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,
|
|
}
|
|
}
|