lost-sia
Version:
Single Image Annotation Tool
166 lines (153 loc) • 4.08 kB
JSX
import React, { useState, useEffect, useRef } from "react";
import { List, TextArea, Form, Label, Icon } from "semantic-ui-react";
import InfoBox from "./InfoBox";
import PopUp from "../SiaPopup";
const AnnoDetails = (props) => {
const [comment, setComment] = useState("");
const [example, setExample] = useState(false);
const [showSaveBtn, setShowSaveBtn] = useState(false);
const tARef = useRef();
useEffect(() => {
if (props.anno) {
if (props.anno.comment) {
setComment(props.anno.comment);
} else {
setComment("");
}
}
}, [props.anno]);
useEffect(() => {
if (tARef.current) {
tARef.current.focus();
}
}, [props.commentInputTrigger]);
const onDismiss = () => {
if (props.onDismiss) {
props.onDismiss();
}
};
const onCommentUpdate = () => {
if (props.onCommentUpdate) {
props.onCommentUpdate(comment);
}
setShowSaveBtn(false);
};
const onMarkExampleClick = () => {
// setExample(!example)
if (props.onMarkExample) {
props.onMarkExample(props.anno);
}
};
const renderSaveBtn = () => {
if (showSaveBtn) {
return <Label as="a" corner="right" icon="save" color="red"></Label>;
}
};
const renderComment = () => {
return (
<div>
<Form onClick={() => {}}>
{renderSaveBtn()}
<TextArea
placeholder="Write a comment"
ref={tARef}
value={comment}
rows={2}
onBlur={() => onCommentUpdate()}
onFocus={() => setShowSaveBtn(true)}
onChange={(e) => setComment(e.target.value)}
></TextArea>
</Form>
</div>
);
};
const renderLabels = () => {
if (props.anno) {
const selectedLabelIds = props.anno.labelIds;
if (!selectedLabelIds) return "No Label";
let lbls = "";
props.anno.labelIds.forEach((lbl, idx) => {
const labelObject = props.possibleLabels.find((el) => {
return el.id === lbl;
});
if (idx > 0) lbls += ", ";
lbls += labelObject.label;
});
if (!lbls) return "No Label";
return lbls;
} else {
return "No Label";
}
};
const renderExampleMark = () => {
if (!props.allowedToMarkExample) return null;
let color = "grey";
let iconName = "bookmark outline";
if (props.anno) {
if (props.anno.isExample) {
color = "yellow";
iconName = "bookmark";
}
}
const mark = (
<Label
as="a"
color={color}
style={{ opacity: 0.8 }}
size="medium"
corner="left"
onClick={() => {
onMarkExampleClick();
}}
>
<Icon name={iconName} />
</Label>
);
return (
<PopUp
content="Mark this annotation as example for other annotators"
trigger={mark}
/>
);
};
const renderDescription = () => {
if (props.anno) {
return (
<div>
{renderExampleMark()}
{/* <Header>
Labels
</Header>
<div>
{renderLabels()}
</div> */}
<List>
<List.Item icon="at" content={props.anno.id} />
<List.Item icon="tag" content={renderLabels()} />
<List.Item
icon="time"
content={`${props.anno.annoTime.toLocaleString("us", {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
})} seconds`}
/>
{/* <List.Item icon='time' content={props.anno.annoTime} /> */}
</List>
{renderComment()}
</div>
);
} else {
return "No annotation selected!";
}
};
return (
<InfoBox
header={"Annotation Details"}
content={renderDescription()}
visible={props.visible}
defaultPos={props.defaultPos}
onDismiss={(e) => onDismiss()}
/>
);
};
export default AnnoDetails;