feat(iace): Betriebszustand-Traceability auf Hazards + Mitigations

Hazards zeigen jetzt farbige Badges mit den Betriebszustaenden die sie
ausgeloest haben (z.B. "Wartung", "Not-Halt"). Mitigations erben die
States ihrer verknuepften Hazards.

Backend: OperationalStates im Function-Feld encodiert (kein DB-Schema),
beim Lesen als operational_states[] JSON-Feld zurueckgegeben.
Frontend: Indigo-Badges in HazardTable + MitigationCard.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-11 09:04:20 +02:00
parent af5ab9127a
commit cb8fb65d3e
9 changed files with 72 additions and 5 deletions
@@ -3,6 +3,12 @@
import { Hazard, LifecyclePhase, CATEGORY_LABELS, STATUS_LABELS } from './types'
import { RiskBadge, ReviewStatusBadge } from './RiskBadge'
const OP_STATE_LABELS: Record<string, string> = {
startup: 'Hochfahren', homing: 'Referenzfahrt', automatic_operation: 'Automatik',
manual_operation: 'Handbetrieb', teach_mode: 'Einrichten', maintenance: 'Wartung',
cleaning: 'Reinigung', emergency_stop: 'Not-Halt', recovery_mode: 'Wiederanlauf',
}
export function HazardTable({ hazards, lifecyclePhases, onDelete }: {
hazards: Hazard[]
lifecyclePhases: LifecyclePhase[]
@@ -47,6 +53,15 @@ export function HazardTable({ hazards, lifecyclePhases, onDelete }: {
{lifecyclePhases.find(p => p.id === hazard.lifecycle_phase)?.label_de || hazard.lifecycle_phase}
</div>
)}
{hazard.operational_states && hazard.operational_states.length > 0 && (
<div className="flex flex-wrap gap-1 mt-1">
{hazard.operational_states.map((s) => (
<span key={s} className="inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-indigo-50 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-300 border border-indigo-200 dark:border-indigo-800">
{OP_STATE_LABELS[s] || s}
</span>
))}
</div>
)}
</td>
<td className="px-4 py-3 text-sm text-gray-600">{CATEGORY_LABELS[hazard.category] || hazard.category}</td>
<td className="px-4 py-3 text-sm text-gray-900 dark:text-white text-center font-medium">{hazard.severity}</td>
@@ -24,6 +24,7 @@ export interface Hazard {
created_at: string
source?: string
match_reasons?: { type: string; tag: string; met: boolean }[]
operational_states?: string[]
}
export interface LibraryHazard {