|
<script lang="ts"> |
|
type HighlightedTextType = { |
|
token: string; |
|
class_or_confidence: string | number | null; |
|
}; |
|
|
|
export let value: HighlightedTextType[]; |
|
export let category: string | number | null; |
|
export let active: string; |
|
export let labelToEdit: number; |
|
export let indexOfLabel: number; |
|
export let text: string; |
|
export let handleValueChange: () => void; |
|
export let isScoresMode = false; |
|
export let _color_map: Record<string, { primary: string; secondary: string }>; |
|
|
|
let _input_value = category; |
|
|
|
function handleInput(e: Event): void { |
|
let target = e.target as HTMLInputElement; |
|
if (target) { |
|
_input_value = target.value; |
|
} |
|
} |
|
|
|
function updateLabelValue( |
|
e: Event, |
|
elementIndex: number, |
|
text: string |
|
): void { |
|
let target = e.target as HTMLInputElement; |
|
value = [ |
|
...value.slice(0, elementIndex), |
|
{ |
|
token: text, |
|
class_or_confidence: |
|
target.value === "" |
|
? null |
|
: isScoresMode |
|
? Number(target.value) |
|
: target.value |
|
}, |
|
...value.slice(elementIndex + 1) |
|
]; |
|
|
|
handleValueChange(); |
|
} |
|
|
|
function clearPlaceHolderOnFocus(e: FocusEvent): void { |
|
let target = e.target as HTMLInputElement; |
|
if (target && target.placeholder) target.placeholder = ""; |
|
} |
|
</script> |
|
|
|
|
|
|
|
|
|
{#if !isScoresMode} |
|
<input |
|
class="label-input" |
|
autofocus |
|
id={`label-input-${indexOfLabel}`} |
|
type="text" |
|
placeholder="label" |
|
value={category} |
|
style:background-color={category === null || (active && active !== category) |
|
? "" |
|
: _color_map[category].primary} |
|
style:width={_input_value |
|
? _input_value.toString()?.length + 4 + "ch" |
|
: "8ch"} |
|
on:input={handleInput} |
|
on:blur={(e) => updateLabelValue(e, indexOfLabel, text)} |
|
on:keydown={(e) => { |
|
if (e.key === "Enter") { |
|
updateLabelValue(e, indexOfLabel, text); |
|
labelToEdit = -1; |
|
} |
|
}} |
|
on:focus={clearPlaceHolderOnFocus} |
|
/> |
|
{:else} |
|
<input |
|
class="label-input" |
|
autofocus |
|
type="number" |
|
step="0.1" |
|
style={"background-color: rgba(" + |
|
(typeof category === "number" && category < 0 |
|
? "128, 90, 213," + -category |
|
: "239, 68, 60," + category) + |
|
")"} |
|
value={category} |
|
style:width="7ch" |
|
on:input={handleInput} |
|
on:blur={(e) => updateLabelValue(e, indexOfLabel, text)} |
|
on:keydown={(e) => { |
|
if (e.key === "Enter") { |
|
updateLabelValue(e, indexOfLabel, text); |
|
labelToEdit = -1; |
|
} |
|
}} |
|
/> |
|
{/if} |
|
|
|
<style> |
|
.label-input { |
|
transition: 150ms; |
|
margin-top: 1px; |
|
margin-right: calc(var(--size-1)); |
|
border-radius: var(--radius-xs); |
|
padding: 1px 5px; |
|
color: black; |
|
font-weight: var(--weight-bold); |
|
font-size: var(--text-sm); |
|
text-transform: uppercase; |
|
line-height: 1; |
|
color: white; |
|
} |
|
|
|
.label-input::placeholder { |
|
color: rgba(1, 1, 1, 0.5); |
|
} |
|
</style> |
|
|