import React, { Component } from 'react'
import PropTypes from 'prop-types'
import cloneDeep from 'lodash.clonedeep'
import bounding from '../../lib/utils/bounding.js'
import LabellingTransition from './LabellingTransition.js'
import { SelectTree } from 'react-viewerbase'
import { getAddLabelButtonStyle } from './labellingPositionUtils.js'
import OHIFLabellingData from './OHIFLabellingData.js'
export default class LabellingFlow extends Component {
static propTypes = {
eventData: PropTypes.object.isRequired,
measurementData: PropTypes.object.isRequired,
labellingDoneCallback: PropTypes.func.isRequired,
updateLabelling: PropTypes.func.isRequired,
skipAddLabelButton: PropTypes.bool,
editLocation: PropTypes.bool,
editDescription: PropTypes.bool,
}
constructor(props) {
super(props)
const { location, locationLabel, description } = props.measurementData
let style = props.componentStyle
if (!props.skipAddLabelButton) {
style = getAddLabelButtonStyle(props.measurementData, props.eventData)
}
this.state = {
location,
locationLabel,
description,
skipAddLabelButton: props.skipAddLabelButton,
editDescription: props.editDescription,
editLocation: props.editLocation,
componentStyle: style,
confirmationState: false,
displayComponent: true,
}
this.mainElement = React.createRef()
this.descriptionInput = React.createRef()
this.initialItems = OHIFLabellingData
this.currentItems = cloneDeep(this.initialItems)
}
componentDidUpdate = () => {
this.repositionComponent()
}
render() {
let mainElementClassName = 'labellingComponent'
if (this.state.editDescription) {
mainElementClassName += ' editDescription'
}
const style = Object.assign({}, this.state.componentStyle)
if (this.state.skipAddLabelButton) {
style.left -= 160
}
return (
{this.labellingStateFragment()}
)
}
labellingStateFragment = () => {
const {
skipAddLabelButton,
editLocation,
description,
locationLabel,
} = this.state
const Icons = `${window.config.routerBasename}/icons.svg`.replace('//', '/')
if (!skipAddLabelButton) {
return (
<>
>
)
} else {
if (editLocation) {
return (
)
} else {
return (
<>
>
)
}
}
}
relabel = () => {
this.setState({
editLocation: true,
})
}
setDescriptionUpdateMode = () => {
this.descriptionInput.current.focus()
this.setState({
editDescription: true,
})
}
descriptionCancel = () => {
const { description = '' } = cloneDeep(this.state)
this.descriptionInput.current.value = description
this.setState({
editDescription: false,
})
}
descriptionSave = () => {
const description = this.descriptionInput.current.value
this.props.updateLabelling({ description })
this.setState({
description,
editDescription: false,
})
}
selectTreeSelectCalback = (event, itemSelected) => {
const location = itemSelected.value
this.props.updateLabelling({ location })
const viewportTopPosition = this.mainElement.current.offsetParent.offsetTop
const componentStyle = {
top: event.nativeEvent.y - viewportTopPosition - 25,
left: this.state.componentStyle.left,
}
this.setState({
editLocation: false,
confirmationState: true,
location: itemSelected.value,
locationLabel: itemSelected.label,
componentStyle,
})
if (this.isTouchScreen) {
this.setTimeout = setTimeout(() => {
this.setState({
displayComponent: false,
})
}, 2000)
}
}
showLabelling = () => {
this.setState({
skipAddLabelButton: true,
editLocation: false,
})
}
fadeOutAndLeave = () => {
// Wait for 1 sec to dismiss the labelling component
this.fadeOutTimer = setTimeout(() => {
this.setState({
displayComponent: false,
})
}, 1000)
}
fadeOutAndLeaveFast = () => {
this.setState({
displayComponent: false,
})
}
clearFadeOutTimer = () => {
if (!this.fadeOutTimer) {
return
}
clearTimeout(this.fadeOutTimer)
}
repositionComponent = () => {
// SetTimeout for the css animation to end.
setTimeout(() => {
bounding(this.mainElement)
}, 200)
}
}