1
1
import React from 'react'
2
2
import DOM from 'react-dom'
3
3
import Autocomplete from '../../lib/index'
4
- import { fakeRequest } from '../../lib/utils'
4
+ import { fakeCategorizedRequest } from '../../lib/utils'
5
5
6
6
class App extends React . Component {
7
7
@@ -13,7 +13,6 @@ class App extends React.Component {
13
13
loading : false
14
14
}
15
15
this . requestTimer = null
16
- this . renderItems = this . renderItems . bind ( this )
17
16
}
18
17
19
18
render ( ) {
@@ -22,29 +21,33 @@ class App extends React.Component {
22
21
< h1 > Custom Menu</ h1 >
23
22
< p >
24
23
While Autocomplete ships with a decent looking menu, you can control the
25
- look as well as the rendering of it. In this case we put headers for each
26
- letter of the alphabet .
24
+ look as well as the rendering of it. In this example we'll group the states
25
+ into the region where they belong .
27
26
</ p >
28
27
< label htmlFor = "states-autocomplete" > Choose a state from the US</ label >
29
28
< Autocomplete
30
29
value = { this . state . value }
31
30
inputProps = { { id : 'states-autocomplete' } }
32
- wrapperStyle = { { position : 'relative' , display : 'inline-block' } }
33
31
items = { this . state . unitedStates }
34
32
getItemValue = { ( item ) => item . name }
35
33
onSelect = { ( value , state ) => this . setState ( { value, unitedStates : [ state ] } ) }
36
34
onChange = { ( event , value ) => {
37
35
this . setState ( { value, loading : true , unitedStates : [ ] } )
38
36
clearTimeout ( this . requestTimer )
39
- this . requestTimer = fakeRequest ( value , ( items ) => {
37
+ this . requestTimer = fakeCategorizedRequest ( value , ( items ) => {
40
38
this . setState ( { unitedStates : items , loading : false } )
41
39
} )
42
40
} }
43
41
renderItem = { ( item , isHighlighted ) => (
44
- < div
45
- className = { `item ${ isHighlighted ? 'item-highlighted' : '' } ` }
46
- key = { item . abbr }
47
- > { item . name } </ div >
42
+ item . header ?
43
+ < div
44
+ className = "item item-header"
45
+ key = { item . header }
46
+ > { item . header } </ div >
47
+ : < div
48
+ className = { `item ${ isHighlighted ? 'item-highlighted' : '' } ` }
49
+ key = { item . abbr }
50
+ > { item . name } </ div >
48
51
) }
49
52
renderMenu = { ( items , value ) => (
50
53
< div className = "menu" >
@@ -54,25 +57,14 @@ class App extends React.Component {
54
57
< div className = "item" > Loading...</ div >
55
58
) : items . length === 0 ? (
56
59
< div className = "item" > No matches for { value } </ div >
57
- ) : this . renderItems ( items ) }
60
+ ) : items }
58
61
</ div >
59
62
) }
63
+ isItemSelectable = { ( item ) => ! item . header }
60
64
/>
61
65
</ div >
62
66
)
63
67
}
64
-
65
- renderItems ( items ) {
66
- return items . map ( ( item , index ) => {
67
- const text = item . props . children
68
- if ( index === 0 || items [ index - 1 ] . props . children . charAt ( 0 ) !== text . charAt ( 0 ) ) {
69
- return [ < div className = "item item-header" > { text . charAt ( 0 ) } </ div > , item ]
70
- }
71
- else {
72
- return item
73
- }
74
- } )
75
- }
76
68
}
77
69
78
70
DOM . render ( < App /> , document . getElementById ( 'container' ) )
0 commit comments