2026-05-21 09:05:13 +02:00
|
|
|
import React from 'react'
|
2026-05-21 09:42:13 +02:00
|
|
|
import { formatClubPercent, formatSkillWeight, kpiRowsFromSummary } from '../../utils/skillProfileListHelpers'
|
2026-05-21 09:05:13 +02:00
|
|
|
|
|
|
|
|
/**
|
2026-05-21 09:33:20 +02:00
|
|
|
* Kleine KPI-Kacheln: je Unterkategorie die Top-Fähigkeit (Listen/Karten).
|
2026-05-21 09:05:13 +02:00
|
|
|
*/
|
|
|
|
|
export default function SkillProfileCompact({
|
|
|
|
|
summary,
|
|
|
|
|
loading = false,
|
2026-05-21 09:33:20 +02:00
|
|
|
emptyText = 'Keine Fähigkeiten',
|
2026-05-21 09:42:13 +02:00
|
|
|
displayLimit = 24,
|
2026-05-21 09:33:20 +02:00
|
|
|
highlightSkillIds = [],
|
2026-05-21 09:05:13 +02:00
|
|
|
}) {
|
|
|
|
|
if (loading) {
|
2026-05-21 09:33:20 +02:00
|
|
|
return (
|
|
|
|
|
<div className="skill-kpi-grid skill-kpi-grid--loading" aria-busy="true">
|
|
|
|
|
<span className="form-sub">…</span>
|
|
|
|
|
</div>
|
|
|
|
|
)
|
2026-05-21 09:05:13 +02:00
|
|
|
}
|
|
|
|
|
|
2026-05-21 09:33:20 +02:00
|
|
|
const rows = kpiRowsFromSummary(summary, { limit: displayLimit })
|
|
|
|
|
const highlight = new Set((highlightSkillIds || []).map(String))
|
2026-05-21 09:05:13 +02:00
|
|
|
|
|
|
|
|
if (!rows.length) {
|
2026-05-21 09:33:20 +02:00
|
|
|
return summary ? <p className="form-sub skill-kpi-grid--empty">{emptyText}</p> : null
|
2026-05-21 09:05:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
2026-05-21 09:33:20 +02:00
|
|
|
<ul className="skill-kpi-grid" aria-label="Fähigkeiten je Kategorie">
|
|
|
|
|
{rows.map((row) => {
|
|
|
|
|
const highlighted = highlight.has(String(row.skill_id))
|
|
|
|
|
const isBest = row.is_club_best_for_skill || row.universal_percent >= 100
|
|
|
|
|
return (
|
|
|
|
|
<li
|
|
|
|
|
key={`${row.category_name}-${row.skill_id}`}
|
|
|
|
|
className={
|
|
|
|
|
'skill-kpi-tile' +
|
|
|
|
|
(highlighted ? ' skill-kpi-tile--highlight' : '') +
|
|
|
|
|
(isBest ? ' skill-kpi-tile--best' : '')
|
|
|
|
|
}
|
2026-05-21 09:42:13 +02:00
|
|
|
title={`${row.category_name}: ${row.skill_name} — Gewicht ${formatSkillWeight(row.weight ?? row.score)}, ${formatClubPercent(row.universal_percent)} vom Vereins-Maximum`}
|
2026-05-21 09:33:20 +02:00
|
|
|
>
|
|
|
|
|
<span className="skill-kpi-tile__cat">{row.category_name}</span>
|
|
|
|
|
<span className="skill-kpi-tile__name">{row.skill_name}</span>
|
2026-05-21 09:42:13 +02:00
|
|
|
<span className="skill-kpi-tile__score">{formatSkillWeight(row.weight ?? row.score)}</span>
|
2026-05-21 09:33:20 +02:00
|
|
|
<span className="skill-kpi-tile__pct">
|
|
|
|
|
{isBest ? '★ ' : ''}
|
|
|
|
|
{formatClubPercent(row.universal_percent)}
|
|
|
|
|
</span>
|
|
|
|
|
</li>
|
|
|
|
|
)
|
|
|
|
|
})}
|
|
|
|
|
</ul>
|
2026-05-21 09:05:13 +02:00
|
|
|
)
|
|
|
|
|
}
|