UNPKG

lost-sia

Version:

Single Image Annotation Tool

166 lines (153 loc) 4.08 kB
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;