-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathselect-patterns.js
58 lines (53 loc) · 1.95 KB
/
select-patterns.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
/** Select a pattern, given a route and a feed */
import React, {Component, PropTypes} from 'react'
import Select from 'react-select'
import {Group as FormGroup} from './components/input'
export default class SelectPatterns extends Component {
static propTypes = {
onChange: PropTypes.func.isRequired,
routePatterns: PropTypes.arrayOf(PropTypes.object).isRequired,
trips: PropTypes.arrayOf(PropTypes.object) // trips can be null indicating a wildcard
}
selectPatterns = (selectedPatterns) => {
const {onChange, routePatterns} = this.props
// convert to trip IDs as pattern IDs are not stable
let patterns = []
let trips = []
if (selectedPatterns) {
patterns = selectedPatterns.map(fromOptionToValue)
trips = patterns
.map(fromIdToPattern(routePatterns))
.map(toTripIds)
.reduce(flatten, [])
}
onChange({ patterns, trips })
}
render () {
const {routePatterns, trips} = this.props
const patternsWithTrips = (pattern) => {
return pattern.trips.findIndex((trip) => {
return trips.indexOf(trip.trip_id) > -1
}) > -1
}
// if trips is null it is a glob selector for all trips on the route
const patternsChecked = trips == null
? routePatterns
: routePatterns.filter(patternsWithTrips)
return (
<FormGroup>
<Select
multi
name='Patterns'
onChange={this.selectPatterns}
options={routePatterns.map((pattern) => { return { value: pattern.pattern_id, label: pattern.name } })}
placeholder='Select patterns'
value={patternsChecked.map((pattern) => pattern.pattern_id)}
/>
</FormGroup>
)
}
}
const fromOptionToValue = (option) => option.value
const fromIdToPattern = (patterns) => (id) => patterns.find((pattern) => pattern.pattern_id === id)
const toTripIds = (pattern) => pattern.trips.map((trip) => trip.trip_id)
const flatten = (memo, value) => memo.concat(value)