-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathvariant-editor.js
104 lines (93 loc) · 3.46 KB
/
variant-editor.js
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
import React, {Component, PropTypes} from 'react'
import {connect} from 'react-redux'
import {createVariant, expandVariant, showVariant, updateVariant} from './actions'
import {Button, Group as ButtonGroup} from './components/buttons'
import Icon from './components/icon'
import {Text} from './components/input'
import Title from './components/dock-content-title'
import convertToR5Modification from './export/export'
function mapStateToProps (state) {
return {
feeds: state.scenario.feeds,
modifications: state.scenario.modifications,
scenarioName: state.scenario.name,
variants: state.scenario.variants
}
}
function mapDispatchToProps (dispatch) {
return {
createVariant: (name) => dispatch(createVariant(name)),
expandVariant: (index) => dispatch(expandVariant(index)),
showVariant: (index) => dispatch(showVariant(index)),
updateVariant: (opts) => dispatch(updateVariant(opts))
}
}
class VariantEditor extends Component {
static propTypes = {
createVariant: PropTypes.func.isRequired,
expandVariant: PropTypes.func.isRequired,
modifications: PropTypes.array.isRequired,
scenarioName: PropTypes.string,
showVariant: PropTypes.func.isRequired,
updateVariant: PropTypes.func.isRequired,
variants: PropTypes.array.isRequired
}
exportVariant (variantIndex) {
const {feeds, modifications, scenarioName} = this.props
const r5modifications = modifications
.filter((mod) => mod.variants[variantIndex])
.map((mod) => convertToR5Modification(mod))
const feedChecksums = {}
feeds.forEach((f) => {
feedChecksums[f.id] = f.checksum
})
const scenario = {
id: 0,
// scenario name should probably not be at top level of props, but it is
description: scenarioName,
feedChecksums,
modifications: r5modifications
}
// pretty print the json
const out = JSON.stringify(scenario, null, 2)
const uri = `data:application/json;base64,${window.btoa(out)}`
const a = document.createElement('a')
a.setAttribute('href', uri)
a.setAttribute('target', '_blank')
a.click()
}
render () {
const {createVariant, expandVariant, showVariant, updateVariant, variants} = this.props
return (
<div className='ModificationGroup'>
<Title>
Variants
<Button
className='pull-right'
onClick={() => createVariant('New variant')}
style='success'
>
<Icon type='plus' /> Create
</Button>
</Title>
<form className='Variants form-inline'>
{/* using an ordered list as we number the variants rather than spelling out their names in each modification class */}
{variants.map((v, index) =>
<div className='Variants-Variant' key={`variant-${index}`}>
<Text
label={`${index + 1}. `}
onChange={(e) => updateVariant({index, value: e.target.value})}
value={v}
/>
<ButtonGroup>
<Button onClick={(e) => this.exportVariant(index)} title='Export'>Export</Button>
<Button onClick={(e) => expandVariant(index)} title='Expand'>Expand</Button>
<Button onClick={(e) => showVariant(index)} style='info' title='Show on map'><Icon type='eye' /></Button>
</ButtonGroup>
</div>)}
</form>
</div>
)
}
}
export default connect(mapStateToProps, mapDispatchToProps)(VariantEditor)