Split 879-LOC page.tsx into 187 LOC with 11 colocated components, _types.ts and _constants.ts for the industry templates module. Behavior preserved. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
63 lines
2.5 KiB
TypeScript
63 lines
2.5 KiB
TypeScript
import type { TOMRecommendation } from '../_types'
|
|
import { PRIORITY_COLORS, PRIORITY_LABELS, TOM_CATEGORY_ICONS } from '../_constants'
|
|
|
|
export function TOMTab({ recommendations }: { recommendations: TOMRecommendation[] }) {
|
|
if (recommendations.length === 0) {
|
|
return (
|
|
<div className="text-center py-12 text-slate-400">
|
|
<p className="text-lg">Keine TOM-Empfehlungen verfuegbar</p>
|
|
<p className="text-sm mt-1">Fuer diese Branche wurden noch keine technisch-organisatorischen Massnahmen definiert.</p>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const grouped: Record<string, TOMRecommendation[]> = {}
|
|
recommendations.forEach((tom) => {
|
|
if (!grouped[tom.category]) {
|
|
grouped[tom.category] = []
|
|
}
|
|
grouped[tom.category].push(tom)
|
|
})
|
|
|
|
return (
|
|
<div className="space-y-6">
|
|
{Object.entries(grouped).map(([category, items]) => {
|
|
const icon = TOM_CATEGORY_ICONS[category] || '\uD83D\uDD27'
|
|
return (
|
|
<div key={category}>
|
|
<div className="flex items-center gap-2 mb-3">
|
|
<span className="text-lg">{icon}</span>
|
|
<h4 className="font-semibold text-slate-800">{category}</h4>
|
|
<span className="text-xs text-slate-400 ml-1">({items.length})</span>
|
|
</div>
|
|
<div className="space-y-3 ml-7">
|
|
{items.map((tom, idx) => {
|
|
const prio = PRIORITY_COLORS[tom.priority] || PRIORITY_COLORS.medium
|
|
const prioLabel = PRIORITY_LABELS[tom.priority] || tom.priority
|
|
return (
|
|
<div
|
|
key={idx}
|
|
className="bg-white border border-slate-200 rounded-lg p-4 hover:border-emerald-200 transition-colors"
|
|
>
|
|
<div className="flex items-start justify-between gap-3">
|
|
<div className="flex-1">
|
|
<h5 className="font-medium text-slate-900">{tom.name}</h5>
|
|
<p className="text-sm text-slate-500 mt-1">{tom.description}</p>
|
|
</div>
|
|
<span
|
|
className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-semibold border flex-shrink-0 ${prio.bg} ${prio.text} ${prio.border}`}
|
|
>
|
|
{prioLabel}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
)
|
|
})}
|
|
</div>
|
|
</div>
|
|
)
|
|
})}
|
|
</div>
|
|
)
|
|
}
|