import React, { useMemo, useState } from 'react' import { Link } from 'react-router-dom' import api from '../../utils/api' const ARTIFACT_LABELS = { framework_program: 'Rahmenprogramm', training_module: 'Trainingsmodul', progression_graph: 'Regressionspfad', } function formatScore(value) { const n = Number(value) if (!Number.isFinite(n)) return '0' return n % 1 === 0 ? String(n) : n.toFixed(1) } /** * Vorschläge für Planungsartefakte anhand gewählter Fähigkeiten (Phase 3). */ export default function SkillDiscoveryPanel({ skills = [] }) { const [selectedIds, setSelectedIds] = useState([]) const [query, setQuery] = useState('') const [loading, setLoading] = useState(false) const [error, setError] = useState('') const [result, setResult] = useState(null) const filteredSkills = useMemo(() => { const q = query.trim().toLowerCase() const list = (skills || []).filter((s) => s.status !== 'inactive') if (!q) return list return list.filter( (s) => (s.name || '').toLowerCase().includes(q) || (s.category || '').toLowerCase().includes(q) ) }, [skills, query]) const toggleSkill = (id) => { const s = String(id) setSelectedIds((prev) => prev.includes(s) ? prev.filter((x) => x !== s) : [...prev, s] ) } async function handleSearch() { const ids = selectedIds.map((x) => parseInt(x, 10)).filter((n) => n > 0) if (!ids.length) { setError('Wähle mindestens eine Fähigkeit.') return } setLoading(true) setError('') setResult(null) try { const data = await api.getSkillDiscoverySuggestions(ids, { limit: 25 }) setResult(data) } catch (e) { setError(e.message || 'Suche fehlgeschlagen') } finally { setLoading(false) } } return (

Planungs-Vorschläge

Wähle Fähigkeiten, die du schwerpunktmäßig entwickeln willst — Shinkan schlägt passende Rahmenprogramme, Trainingsmodule und Regressionspfade vor. Sortierung nach absolutem Trainingsgewicht (nicht nach Anteil innerhalb des Plans).

setQuery(e.target.value)} placeholder="Name oder Kategorie …" />
{filteredSkills.length === 0 ? (

Keine Fähigkeiten gefunden.

) : ( filteredSkills.map((sk) => ( )) )}
{selectedIds.length > 0 ? ( ) : null}
{error ?

{error}

: null} {result?.suggestions?.length > 0 ? ( ) : result && !loading ? (

Keine passenden Artefakte in deiner sichtbaren Bibliothek — prüfe Fähigkeiten-Verknüpfungen an den Übungen oder erweitere die Auswahl.

) : null}
) }