fix(admin/iace/benchmark): show Klaerungsfragen + Normen on Engine column
The Go init handler appends two annotated blocks to Hazard.Description
("Mit Anlagenbauer zu klaeren: ..." and "Referenzierte Normen: ...")
without changing the DB schema. The benchmark detail view only rendered
hazard.scenario || hazard.description, so the appended blocks were
silently hidden because scenario is always populated.
Split the description into three structured pieces:
1. extractScenario() — pure scenario text, stripped of trailing blocks
2. extractClarifications() — bullet list of "Mit Anlagenbauer zu klaeren"
3. extractEngineNorms() — pipe-separated norm references
Each piece is rendered as its own DetailRow. The FANUC DCS clarification
that already lives in the DB (48/115 hazards on the Bremse project) is
now visible in the Engine column.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+45
-1
@@ -163,7 +163,7 @@ function DetailComparison({ gt, engine }: { gt: GroundTruthEntry; engine: Hazard
|
|||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<div className="font-semibold text-purple-700 dark:text-purple-400 uppercase text-[10px]">Engine (automatisch)</div>
|
<div className="font-semibold text-purple-700 dark:text-purple-400 uppercase text-[10px]">Engine (automatisch)</div>
|
||||||
<DetailRow label="Gefaehrdung" gt={engine.name} />
|
<DetailRow label="Gefaehrdung" gt={engine.name} />
|
||||||
<DetailRow label="Szenario" gt={engine.scenario || engine.description || '-'} />
|
<DetailRow label="Szenario" gt={engine.scenario || extractScenario(engine.description) || '-'} />
|
||||||
<DetailRow label="Gefahrenstelle" gt={engine.zone || '-'} />
|
<DetailRow label="Gefahrenstelle" gt={engine.zone || '-'} />
|
||||||
{engine.lifecycle_phase && (
|
{engine.lifecycle_phase && (
|
||||||
<DetailRow label="Lebensphasen" gt={formatLifecycles(engine.lifecycle_phase)} />
|
<DetailRow label="Lebensphasen" gt={formatLifecycles(engine.lifecycle_phase)} />
|
||||||
@@ -178,11 +178,55 @@ function DetailComparison({ gt, engine }: { gt: GroundTruthEntry; engine: Hazard
|
|||||||
) : (
|
) : (
|
||||||
<DetailRow label="Massnahmen" gt="(keine zugeordnet)" />
|
<DetailRow label="Massnahmen" gt="(keine zugeordnet)" />
|
||||||
)}
|
)}
|
||||||
|
{(() => {
|
||||||
|
const clarifications = extractClarifications(engine.description)
|
||||||
|
if (clarifications.length === 0) return null
|
||||||
|
return <DetailRow label="Mit Anlagenbauer zu klaeren" gt={clarifications.map(c => '• ' + c).join('\n')} multiline />
|
||||||
|
})()}
|
||||||
|
{(() => {
|
||||||
|
const norms = extractEngineNorms(engine.description)
|
||||||
|
if (norms.length === 0) return null
|
||||||
|
return <DetailRow label="Referenzierte Normen" gt={norms.join(' | ')} />
|
||||||
|
})()}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Go init handler appends two annotated blocks to Hazard.Description:
|
||||||
|
* "<scenario>\n\nMit Anlagenbauer zu klaeren:\n- frage 1\n- frage 2\n\n
|
||||||
|
* Referenzierte Normen: EN 60204-1 Ziff. 6.2 | EN 61140"
|
||||||
|
* These helpers split that string back into structured pieces so the UI
|
||||||
|
* can render scenario, clarifications and norms as separate sections.
|
||||||
|
*/
|
||||||
|
function extractScenario(desc?: string): string {
|
||||||
|
if (!desc) return ''
|
||||||
|
const idx = desc.indexOf('\n\nMit Anlagenbauer zu klaeren')
|
||||||
|
const cut = idx >= 0 ? desc.slice(0, idx) : desc
|
||||||
|
// Also cut off a trailing norm line if it's the only suffix
|
||||||
|
const normIdx = cut.indexOf('\n\nReferenzierte Normen')
|
||||||
|
return (normIdx >= 0 ? cut.slice(0, normIdx) : cut).trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractClarifications(desc?: string): string[] {
|
||||||
|
if (!desc) return []
|
||||||
|
const start = desc.indexOf('Mit Anlagenbauer zu klaeren:')
|
||||||
|
if (start < 0) return []
|
||||||
|
const after = desc.slice(start + 'Mit Anlagenbauer zu klaeren:'.length)
|
||||||
|
// Stop at the next double-newline section (e.g. norm block)
|
||||||
|
const stop = after.indexOf('\n\n')
|
||||||
|
const block = stop >= 0 ? after.slice(0, stop) : after
|
||||||
|
return block.split('\n').map(s => s.replace(/^[\s-]+/, '').trim()).filter(Boolean)
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractEngineNorms(desc?: string): string[] {
|
||||||
|
if (!desc) return []
|
||||||
|
const m = desc.match(/Referenzierte Normen:\s*([^\n]+)/)
|
||||||
|
if (!m) return []
|
||||||
|
return m[1].split('|').map(s => s.trim()).filter(Boolean)
|
||||||
|
}
|
||||||
|
|
||||||
function DetailRow({ label, gt, multiline }: { label: string; gt: string; multiline?: boolean }) {
|
function DetailRow({ label, gt, multiline }: { label: string; gt: string; multiline?: boolean }) {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
Reference in New Issue
Block a user