Skip to content

Commit dcecad2

Browse files
authored
Merge pull request #12 from jarekwg/master
Modernize to extend React.Component; separate prop-types package
2 parents 1c72f6a + 167aca8 commit dcecad2

File tree

2 files changed

+35
-33
lines changed

2 files changed

+35
-33
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"umd"
2121
],
2222
"dependencies": {
23+
"prop-types": "^15.5.7"
2324
},
2425
"peerDependencies": {
2526
"react": ">=0.14.0"

src/index.js

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import React, {PropTypes} from 'react'
1+
import PropTypes from 'prop-types'
2+
import React from 'react'
23

34
function makeLookup(arr, prop) {
45
let lkup = {}
@@ -35,10 +36,8 @@ const DEFAULT_CLASS_NAMES = {
3536
select: 'FilteredMultiSelect__select'
3637
}
3738

38-
export default React.createClass({
39-
displayName: 'FilteredMultiSelect',
40-
41-
propTypes: {
39+
class FilteredMultiSelect extends React.Component {
40+
static propTypes = {
4241
onChange: PropTypes.func.isRequired,
4342
options: PropTypes.array.isRequired,
4443

@@ -52,34 +51,34 @@ export default React.createClass({
5251
size: PropTypes.number,
5352
textProp: PropTypes.string,
5453
valueProp: PropTypes.string
55-
},
56-
57-
getDefaultProps() {
58-
return {
59-
buttonText: 'Select',
60-
className: 'FilteredMultiSelect',
61-
classNames: {},
62-
defaultFilter: '',
63-
disabled: false,
64-
placeholder: 'type to filter',
65-
size: 6,
66-
selectedOptions: [],
67-
textProp: 'text',
68-
valueProp: 'value'
69-
}
70-
},
54+
}
55+
56+
static defaultProps = {
57+
buttonText: 'Select',
58+
className: 'FilteredMultiSelect',
59+
classNames: {},
60+
defaultFilter: '',
61+
disabled: false,
62+
placeholder: 'type to filter',
63+
size: 6,
64+
selectedOptions: [],
65+
textProp: 'text',
66+
valueProp: 'value'
67+
}
68+
69+
constructor(props) {
70+
super(props)
7171

72-
getInitialState() {
73-
let {defaultFilter, selectedOptions} = this.props
74-
return {
72+
let {defaultFilter, selectedOptions} = props
73+
this.state = {
7574
// Filter text
7675
filter: defaultFilter,
7776
// Options which haven't been selected and match the filter text
7877
filteredOptions: this._filterOptions(defaultFilter, selectedOptions),
7978
// Values of <options> currently selected in the <select>
8079
selectedValues: []
8180
}
82-
},
81+
}
8382

8483
componentWillReceiveProps(nextProps) {
8584
// Update visibile options in response to options or selectedOptions
@@ -95,7 +94,7 @@ export default React.createClass({
9594
nextProps.options)
9695
}, this._updateSelectedValues)
9796
}
98-
},
97+
}
9998

10099
_getClassName(name, ...modifiers) {
101100
let classNames = [this.props.classNames[name] || DEFAULT_CLASS_NAMES[name]]
@@ -105,7 +104,7 @@ export default React.createClass({
105104
}
106105
}
107106
return classNames.join(' ')
108-
},
107+
}
109108

110109
_filterOptions(filter, selectedOptions, options) {
111110
if (typeof filter == 'undefined') {
@@ -131,15 +130,15 @@ export default React.createClass({
131130
}
132131

133132
return filteredOptions
134-
},
133+
}
135134

136135
_onFilterChange(e) {
137136
let filter = e.target.value
138137
this.setState({
139138
filter,
140139
filteredOptions: this._filterOptions(filter)
141140
}, this._updateSelectedValues)
142-
},
141+
}
143142

144143
_onFilterKeyPress(e) {
145144
if (e.key === 'Enter') {
@@ -152,7 +151,7 @@ export default React.createClass({
152151
})
153152
}
154153
}
155-
},
154+
}
156155

157156
_updateSelectedValues(e) {
158157
let el = e ? e.target : this.refs.select
@@ -167,7 +166,7 @@ export default React.createClass({
167166
if (e || String(this.state.selectedValues) !== String(selectedValues)) {
168167
this.setState({selectedValues})
169168
}
170-
},
169+
}
171170

172171
/**
173172
* Adds backing objects for the currently selected options to the selection
@@ -181,7 +180,7 @@ export default React.createClass({
181180
this.setState({selectedValues: []}, () => {
182181
this.props.onChange(selectedOptions)
183182
})
184-
},
183+
}
185184

186185
render() {
187186
let {filter, filteredOptions, selectedValues} = this.state
@@ -217,4 +216,6 @@ export default React.createClass({
217216
</button>
218217
</div>
219218
}
220-
})
219+
}
220+
221+
export default FilteredMultiSelect

0 commit comments

Comments
 (0)