@@ -7,6 +7,7 @@ var Token = require('./token');
77var KeyEvent = require ( '../keyevent' ) ;
88var Typeahead = require ( '../typeahead' ) ;
99var classNames = require ( 'classnames' ) ;
10+ var update = require ( 'react-addons-update' ) ;
1011
1112function _arraysAreDifferent ( array1 , array2 ) {
1213 if ( array1 . length != array2 . length ) {
@@ -58,7 +59,8 @@ var TypeaheadTokenizer = React.createClass({
5859 return {
5960 // We need to copy this to avoid incorrect sharing
6061 // of state across instances (e.g., via getDefaultProps())
61- selected : this . props . defaultSelected . slice ( 0 )
62+ selected : this . props . defaultSelected . slice ( 0 ) ,
63+ value : this . props . defaultValue
6264 } ;
6365 } ,
6466
@@ -88,7 +90,9 @@ var TypeaheadTokenizer = React.createClass({
8890 componentWillReceiveProps : function ( nextProps ) {
8991 // if we get new defaultProps, update selected
9092 if ( _arraysAreDifferent ( this . props . defaultSelected , nextProps . defaultSelected ) ) {
91- this . setState ( { selected : nextProps . defaultSelected . slice ( 0 ) } )
93+ this . setState ( {
94+ selected : nextProps . defaultSelected . slice ( 0 )
95+ } ) ;
9296 }
9397 } ,
9498
@@ -144,8 +148,7 @@ var TypeaheadTokenizer = React.createClass({
144148 var entry = this . refs . typeahead . refs . entry ;
145149 if ( entry . selectionStart == entry . selectionEnd &&
146150 entry . selectionStart == 0 ) {
147- this . _removeTokenForValue (
148- this . state . selected [ this . state . selected . length - 1 ] ) ;
151+ this . _removeTokenForValue ( this . state . selected [ this . state . selected . length - 1 ] ) ;
149152 event . preventDefault ( ) ;
150153 }
151154 } ,
@@ -156,22 +159,30 @@ var TypeaheadTokenizer = React.createClass({
156159 return ;
157160 }
158161
159- this . state . selected . splice ( index , 1 ) ;
160- this . setState ( { selected : this . state . selected } ) ;
162+ this . setState ( {
163+ selected : update ( this . state . selected , { $splice : [ [ index , 1 ] ] } )
164+ } ) ;
161165 this . props . onTokenRemove ( value ) ;
162166 return ;
163167 } ,
164168
165169 _addTokenForValue : function ( value ) {
166- if ( this . state . selected . indexOf ( value ) != - 1 ) {
170+ if ( this . state . selected . indexOf ( value ) !== - 1 ) {
167171 return ;
168172 }
169- this . state . selected . push ( value ) ;
170- this . setState ( { selected : this . state . selected } ) ;
171- this . refs . typeahead . setEntryText ( "" ) ;
173+ this . setState ( {
174+ selected : update ( this . state . selected , { $push : [ value ] } ) ,
175+ value : ""
176+ } ) ;
172177 this . props . onTokenAdd ( value ) ;
173178 } ,
174179
180+ _onChange : function ( event ) {
181+ this . setState ( {
182+ value : event . target . value
183+ } ) ;
184+ } ,
185+
175186 render : function ( ) {
176187 var classes = { } ;
177188 classes [ this . props . customClasses . typeahead ] = ! ! this . props . customClasses . typeahead ;
@@ -193,6 +204,7 @@ var TypeaheadTokenizer = React.createClass({
193204 options = { this . _getOptionsForTypeahead ( ) }
194205 defaultValue = { this . props . defaultValue }
195206 maxVisible = { this . props . maxVisible }
207+ onChange = { this . _onChange }
196208 onOptionSelected = { this . _addTokenForValue }
197209 onKeyDown = { this . _onKeyDown }
198210 onKeyPress = { this . props . onKeyPress }
@@ -201,7 +213,8 @@ var TypeaheadTokenizer = React.createClass({
201213 onBlur = { this . props . onBlur }
202214 displayOption = { this . props . displayOption }
203215 defaultClassNames = { this . props . defaultClassNames }
204- filterOption = { this . props . filterOption } />
216+ filterOption = { this . props . filterOption }
217+ value = { this . state . value } />
205218 </ div >
206219 ) ;
207220 }
0 commit comments