UNPKG

@recogito/recogito-js

Version:

A JavaScript library for text annotation

105 lines (88 loc) 2.89 kB
import React, { Component } from 'react'; import { TrashIcon, CheckIcon } from '@recogito/recogito-client-core'; import Autocomplete from '@recogito/recogito-client-core/src/editor/widgets/Autocomplete'; /** * Shorthand to get the label (= first tag body value) from the * annotation of a relation. */ const getContent = relation => { const firstTag = relation.annotation.bodies.find(b => b.purpose === 'tagging'); return firstTag ? firstTag.value : ''; } /** * A React component for the relationship editor popup. Note that this * component is NOT wired into the RelationsLayer directly, but needs * to be used separately by the implementing application. We * still keep it in the /recogito-relations folder though, so that * all code that belongs together stays together. */ export default class RelationEditor extends Component { constructor(props) { super(props); this.element = React.createRef(); } componentDidMount() { this.setPosition(); } componentDidUpdate() { this.setPosition(); } setPosition() { if (this.element.current) { const el = this.element.current; const { midX, midY } = this.props.relation; el.style.top = `${midY}px`; el.style.left = `${midX}px`; } } onSubmit = () => { const value = this.element.current.querySelector('input').value; const updatedAnnotation = this.props.relation.annotation.clone({ motivation: 'linking', body: [{ type: 'TextualBody', value, purpose: 'tagging' }] }); const updatedRelation = { ...this.props.relation, annotation: updatedAnnotation }; if (value) { // Fire create or update event if (this.props.relation.annotation.bodies.length === 0) this.props.onRelationCreated(updatedRelation, this.props.relation); else this.props.onRelationUpdated(updatedRelation, this.props.relation); } else { // Leaving the tag empty and hitting Enter equals cancel this.props.onCancel(); } } onDelete = () => this.props.onRelationDeleted(this.props.relation); render() { return( <div className="r6o-relation-editor" ref={this.element}> <div className="input-wrapper"> <Autocomplete initialValue={getContent(this.props.relation)} placeholder="Tag..." onSubmit={this.onSubmit} onCancel={this.props.onCancel} vocabulary={this.props.vocabulary || []} /> </div> <div className="buttons"> <span className="r6o-icon delete" onClick={this.onDelete}> <TrashIcon width={14} /> </span> <span className="r6o-icon ok" onClick={this.onSubmit}> <CheckIcon width={14} /> </span> </div> </div> ) } }