function HighlightedExcerpt({ excerpt, highlightStart, highlightEnd, label }) { if (!excerpt) return null const start = Number(highlightStart) const end = Number(highlightEnd) if (Number.isInteger(start) && Number.isInteger(end) && start >= 0 && end <= excerpt.length && end > start) { return (

{excerpt.slice(0, start)} {excerpt.slice(start, end)} {excerpt.slice(end)}

) } const needle = label || '' const at = needle ? excerpt.toLowerCase().indexOf(needle.toLowerCase()) : -1 if (at < 0) return

{excerpt}

return (

{excerpt.slice(0, at)} {excerpt.slice(at, at + needle.length)} {excerpt.slice(at + needle.length)}

) } export default function MaskReviewPanel({ review, busy, onSubmit }) { if (!review?.candidates?.length) return null return (

Maskierung prüfen

Lernmodus: nur die gelb markierte Nennung. Bestätigen legt die Bezeichnung lokal ab. „Nicht schützenswert“ verhindert die Maskierung. Beides bei demselben Wort markiert es als mehrdeutig.

{ event.preventDefault() const data = new FormData(event.currentTarget) const decisions = review.candidates.map((item) => ({ id: item.id, decision: data.get(`decision-${item.id}`) || 'identity' })) onSubmit(decisions) }} >
    {review.candidates.map((item) => (
  • {item.text} · {item.entity_type}{item.ambiguous ? ' · mehrdeutig' : ''}
  • ))}
) }