1- import React , { PropTypes } from 'react'
1+ import PropTypes from 'prop-types'
2+ import React from 'react'
23
34function 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