import { useState, useEffect } from 'react' import { api } from '../utils/api' import TrainingTypeSelect from './TrainingTypeSelect' /** * BulkCategorize - UI for categorizing existing activities without training type * * Shows uncategorized activities grouped by activity_type, * allows bulk assignment of training type to all activities of same type. */ export default function BulkCategorize({ onComplete }) { const [uncategorized, setUncategorized] = useState([]) const [loading, setLoading] = useState(true) const [assignments, setAssignments] = useState({}) const [saving, setSaving] = useState(null) useEffect(() => { loadUncategorized() }, []) const loadUncategorized = () => { setLoading(true) api.listUncategorizedActivities() .then(data => { setUncategorized(data) setLoading(false) }) .catch(err => { console.error('Failed to load uncategorized activities:', err) setLoading(false) }) } const handleAssignment = (activityType, typeId, category, subcategory) => { setAssignments(prev => ({ ...prev, [activityType]: { training_type_id: typeId, training_category: category, training_subcategory: subcategory } })) } const handleSave = async (activityType) => { const assignment = assignments[activityType] if (!assignment || !assignment.training_type_id) { alert('Bitte wähle einen Trainingstyp aus') return } setSaving(activityType) try { const result = await api.bulkCategorizeActivities({ activity_type: activityType, ...assignment }) // Remove from list setUncategorized(prev => prev.filter(u => u.activity_type !== activityType)) setAssignments(prev => { const newAssignments = { ...prev } delete newAssignments[activityType] return newAssignments }) // Show success message console.log(`✓ ${result.updated} activities categorized`) } catch (err) { console.error('Failed to categorize:', err) alert('Kategorisierung fehlgeschlagen: ' + err.message) } finally { setSaving(null) } } if (loading) { return (
) } if (uncategorized.length === 0) { return (
Alle Aktivitäten sind kategorisiert
{onComplete && ( )}
) } return (
{uncategorized.reduce((sum, u) => sum + u.count, 0)} Aktivitäten ohne Trainingstyp gefunden. Weise jedem Aktivitätstyp einen Trainingstyp zu.
{uncategorized.map(item => (
{item.activity_type}
{item.count} Einheiten {item.first_date && item.last_date && ( <> · {item.first_date} bis {item.last_date} )}
handleAssignment(item.activity_type, typeId, category, subcategory) } required={false} />
))}
{onComplete && ( )}
) }