|
<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>
|
|
|