feat: implement data loading and management for training planning
Some checks failed
Deploy Development / deploy (push) Successful in 36s
Test Suite / lint-backend (push) Successful in 0s
Test Suite / build-frontend (push) Successful in 6s
Test Suite / playwright-tests (push) Failing after 40s

- Added functions to load training plan templates and active training groups, enhancing data retrieval for the TrainingPlanningPage.
- Implemented error handling and loading states to improve user experience during data fetching.
- Refactored loadUnits function to dynamically fetch training units based on selected group and date range, supporting better planning capabilities.
This commit is contained in:
Lars 2026-05-05 15:16:20 +02:00
parent 1923feb5bb
commit 7e8421bfde

View File

@ -122,6 +122,58 @@ function TrainingPlanningPage() {
sections: [defaultSection()]
})
const loadPlanTemplates = useCallback(async () => {
try {
const tpl = await api.listTrainingPlanTemplates()
setPlanTemplates(tpl)
} catch (e) {
console.error('Vorlagen laden:', e)
}
}, [])
const loadData = async () => {
try {
const groupsData = await api.listTrainingGroups({ status: 'active' })
setGroups(groupsData)
await loadPlanTemplates()
if (groupsData.length > 0) {
const ownGroup = groupsData.find((g) => g.trainer_id === user?.id)
if (ownGroup) {
setSelectedGroupId(ownGroup.id)
} else if (groupsData.length === 1) {
setSelectedGroupId(groupsData[0].id)
}
}
} catch (err) {
console.error('Failed to load data:', err)
alert('Fehler beim Laden: ' + err.message)
} finally {
setLoading(false)
}
}
const loadUnits = useCallback(async () => {
if (!selectedGroupId) return
let start = startDate
let end = endDate
if (planView === 'calendar') {
const r = getCalendarGridRange(calendarMonthStr)
start = r.gridStart
end = r.gridEnd
}
try {
const unitsData = await api.listTrainingUnits({
group_id: selectedGroupId,
start_date: start,
end_date: end
})
setUnits(unitsData)
} catch (err) {
console.error('Failed to load units:', err)
}
}, [selectedGroupId, startDate, endDate, planView, calendarMonthStr])
useEffect(() => {
loadData()
}, [])
@ -263,58 +315,6 @@ function TrainingPlanningPage() {
return { fpTitle, slotBit, fpId: unit.origin_framework_program_id }
}
const loadPlanTemplates = useCallback(async () => {
try {
const tpl = await api.listTrainingPlanTemplates()
setPlanTemplates(tpl)
} catch (e) {
console.error('Vorlagen laden:', e)
}
}, [])
const loadData = async () => {
try {
const groupsData = await api.listTrainingGroups({ status: 'active' })
setGroups(groupsData)
await loadPlanTemplates()
if (groupsData.length > 0) {
const ownGroup = groupsData.find((g) => g.trainer_id === user?.id)
if (ownGroup) {
setSelectedGroupId(ownGroup.id)
} else if (groupsData.length === 1) {
setSelectedGroupId(groupsData[0].id)
}
}
} catch (err) {
console.error('Failed to load data:', err)
alert('Fehler beim Laden: ' + err.message)
} finally {
setLoading(false)
}
}
const loadUnits = useCallback(async () => {
if (!selectedGroupId) return
let start = startDate
let end = endDate
if (planView === 'calendar') {
const r = getCalendarGridRange(calendarMonthStr)
start = r.gridStart
end = r.gridEnd
}
try {
const unitsData = await api.listTrainingUnits({
group_id: selectedGroupId,
start_date: start,
end_date: end
})
setUnits(unitsData)
} catch (err) {
console.error('Failed to load units:', err)
}
}, [selectedGroupId, startDate, endDate, planView, calendarMonthStr])
const handleQuickCreate = async () => {
if (!selectedGroupId) {
alert('Bitte wähle zuerst eine Trainingsgruppe')