UNPKG

@wesionary/annotorious-openseadragon

Version:

Annotorious image annotation for OpenSeadragon

129 lines (103 loc) 3.96 kB
import React, { Component } from 'react'; import { Editor } from '@recogito/recogito-client-core'; import OSDAnnotationLayer from './annotations/OSDAnnotationLayer'; export default class OpenSeadragonAnnotator extends Component { state = { selectedAnnotation: null, selectedDOMElement: null } /** Shorthand **/ clearState = () => this.setState({ selectedAnnotation: null, selectedDOMElement: null }); componentDidMount() { this.annotationLayer = new OSDAnnotationLayer(this.props); this.annotationLayer.on('mouseEnterAnnotation', this.props.onMouseEnterAnnotation); this.annotationLayer.on('mouseLeaveAnnotation', this.props.onMouseLeaveAnnotation); this.annotationLayer.on('select', this.handleSelect); this.annotationLayer.on('moveSelection', this.handleMoveSelection); } componentWillUnmount() { this.annotationLayer.destroy(); } handleSelect = evt => { const { annotation, element, skipEvent } = evt; if (annotation) { this.setState({ selectedAnnotation: annotation, selectedDOMElement: element }); if (!annotation.isSelection && !skipEvent) this.props.onAnnotationSelected(annotation.clone()); } else { this.clearState(); } } handleMoveSelection = selectedDOMElement => this.setState({ selectedDOMElement }); /**************************/ /* Annotation CRUD events */ /**************************/ onCreateOrUpdateAnnotation = method => (annotation, previous) => { this.clearState(); this.annotationLayer.deselect(); this.annotationLayer.addOrUpdateAnnotation(annotation, previous); // Call CREATE or UPDATE handler this.props[method](annotation, previous?.clone()); } onDeleteAnnotation = annotation => { this.clearState(); this.annotationLayer.removeAnnotation(annotation); this.props.onAnnotationDeleted(annotation); } onCancelAnnotation = () => { this.clearState(); this.annotationLayer.deselect(); } /****************/ /* External API */ /****************/ addAnnotation = annotation => this.annotationLayer.addOrUpdateAnnotation(annotation.clone()); removeAnnotation = annotation => this.annotationLayer.removeAnnotation(annotation.clone()); setAnnotations = annotations =>{ this.annotationLayer.init(annotations.map(a => a.clone())); } getAnnotations = () => this.annotationLayer.getAnnotations().map(a => a.clone()); setDrawingTool = shape => this.annotationLayer.setDrawingTool(shape); setDrawingEnabled = enable => this.annotationLayer.setDrawingEnabled(enable); selectAnnotation = arg => { const annotation = this.annotationLayer.selectAnnotation(arg); if (annotation) return annotation.clone(); else this.clearState(); // Deselect } panTo = (annotationOrId, immediately) => this.annotationLayer.panTo(annotationOrId, immediately); fitBounds = (annotationOrId, immediately) => this.annotationLayer.fitBounds(annotationOrId, immediately); render() { return ( this.state.selectedAnnotation && ( <Editor wrapperEl={this.props.wrapperEl} annotation={this.state.selectedAnnotation} selectedElement={this.state.selectedDOMElement} readOnly={this.props.readOnly} onAnnotationCreated={this.onCreateOrUpdateAnnotation('onAnnotationCreated')} onAnnotationUpdated={this.onCreateOrUpdateAnnotation('onAnnotationUpdated')} onAnnotationDeleted={this.onDeleteAnnotation} onCancel={this.onCancelAnnotation}> <Editor.TagWidget vocabulary={this.props.tagVocabulary} placeholder={this.props.tagPlaceholder} observationOptions={this.props.observationOptions} /> <Editor.CommentWidget placeholder={this.props.commentPlaceholder} maxCommentLength={this.props.maxCommentLength} /> </Editor> ) ) } }