summaryrefslogtreecommitdiff
path: root/animism-align/frontend/views/align/components/annotations/annotation.form.js
blob: b62c36e8ea9e6a52fef9a241a36cb593640fbb3e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import React, { Component } from 'react'
// import { Link } from 'react-router-dom'
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'

import actions from '../../../../actions'
// import * as alignActions from '../align.actions'

import { ZOOM_STEPS } from '../../constants'
import { clamp } from '../../../../util'
import { timeToPosition } from '../../align.util'
import { Select } from '../../../../common'

const ANNOTATION_TYPES = [
  'sentence', 'header'
].map(name => ({ name, label: name }))

class AnnotationForm extends Component {
  constructor(props){
    super(props)
    this.handleChange = this.handleChange.bind(this)
    this.handleSelect = this.handleSelect.bind(this)
    this.handleKeyDown = this.handleKeyDown.bind(this)
    this.handleSubmit = this.handleSubmit.bind(this)
  }
  handleKeyDown(e) {
    if (e.keyCode === 27) { // escape
      actions.align.hideAnnotationForm()
      return      
    }
    // console.log(e.keyCode)
    if (!e.metaKey && !e.ctrlKey) return
    let { start_ts } = this.props.annotation
    switch (e.keyCode) {
      case 38: // up
        e.preventDefault()
        start_ts -= 0.1
        actions.align.updateAnnotationForm('start_ts', start_ts)
        actions.audio.seek(start_ts)
        actions.align.setCursor(start_ts)
        break
      case 40: // down
        e.preventDefault()
        start_ts += 0.1
        actions.align.updateAnnotationForm('start_ts', start_ts)
        actions.audio.seek(start_ts)
        actions.align.setCursor(start_ts)
        break
      case 83: // ctrl-S
        e.preventDefault()
        this.handleSubmit()
      default:
        break
    }
  }
  handleChange(e) {
    const { name, value } = e.target
    this.handleSelect(name, value)
  }
  handleSelect(name, value) {
    actions.align.updateAnnotationForm(name, value)
  }
  handleSubmit() {
    const { annotation } = this.props
    if (annotation.id === 'new') {
      delete annotation.id
      actions.annotation.create(annotation)
        .then(response => {
          console.log(response)
          actions.align.hideAnnotationForm()
        })
    } else {
      actions.annotation.update(annotation)
        .then(response => {
          console.log(response)
          actions.align.hideAnnotationForm()
        })
    }
  }
  render() {
    const { timeline, annotation } = this.props
    if (!annotation.start_ts) return <div></div>
    return (
      <div
        className='annotationForm'
        style={{
          top: timeToPosition(annotation.start_ts, timeline),
        }}
      >
        {annotation.type === 'sentence' && this.renderTextarea()}
        {annotation.type === 'header' && this.renderTextarea()}
        <div className='row'>
          <Select
            name='type'
            selected={annotation.type}
            options={ANNOTATION_TYPES}
            defaultOption='text'
            onChange={this.handleSelect}
          />
          <button onClick={this.handleSubmit}>Save</button>
        </div>
      </div>
    )
  }
  renderTextarea() {
    const { annotation } = this.props
    return (
      <div>
        <textarea
          name='text'
          value={annotation.text}
          onKeyDown={this.handleKeyDown}
          onChange={this.handleChange}
        />
      </div>
    )
  }
}

const mapStateToProps = state => ({
  annotation: state.align.annotation,
  timeline: state.align.timeline,
})

const mapDispatchToProps = dispatch => ({
})

export default connect(mapStateToProps, mapDispatchToProps)(AnnotationForm)