1
+ import React from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import keycode from 'keycode'
4
+ import Downshift from 'downshift'
5
+ import Paper from '@material-ui/core/Paper'
6
+ import Chip from '@material-ui/core/Chip'
7
+ import { renderInput , renderSuggestion , getSuggestions } from './helpers'
8
+ import { styles } from './styles'
9
+ import { withStyles } from '@material-ui/core' ;
10
+
11
+ class DownshiftMultiple extends React . Component {
12
+ state = {
13
+ inputValue : '' ,
14
+ selectedItem : [ ] ,
15
+ }
16
+
17
+ handleKeyDown = event => {
18
+ const { inputValue, selectedItem } = this . state
19
+ if ( selectedItem . length && ! inputValue . length && keycode ( event ) === 'backspace' ) {
20
+ this . setState ( {
21
+ selectedItem : selectedItem . slice ( 0 , selectedItem . length - 1 ) ,
22
+ } )
23
+ }
24
+ }
25
+
26
+ handleInputChange = event => {
27
+ this . setState ( { inputValue : event . target . value } )
28
+ }
29
+
30
+ handleChange = item => {
31
+ let { selectedItem } = this . state
32
+
33
+ if ( selectedItem . indexOf ( item ) === - 1 ) {
34
+ selectedItem = [ ...selectedItem , item ]
35
+ }
36
+
37
+ this . setState ( {
38
+ inputValue : '' ,
39
+ selectedItem,
40
+ } )
41
+ }
42
+
43
+ handleDelete = item => ( ) => {
44
+ this . setState ( state => {
45
+ const selectedItem = [ ...state . selectedItem ]
46
+ selectedItem . splice ( selectedItem . indexOf ( item ) , 1 )
47
+ return { selectedItem }
48
+ } )
49
+ }
50
+
51
+ render ( ) {
52
+ const { classes } = this . props
53
+ const { inputValue, selectedItem } = this . state
54
+
55
+ return (
56
+ < div className = { classes . root } >
57
+ < Downshift
58
+ id = "downshift-multiple"
59
+ inputValue = { inputValue }
60
+ onChange = { this . handleChange }
61
+ selectedItem = { selectedItem }
62
+ >
63
+ { ( {
64
+ getInputProps,
65
+ getItemProps,
66
+ isOpen,
67
+ inputValue : inputValue2 ,
68
+ selectedItem : selectedItem2 ,
69
+ highlightedIndex,
70
+ } ) => (
71
+ < div className = { classes . container } >
72
+ { renderInput ( {
73
+ fullWidth : true ,
74
+ classes,
75
+ InputProps : getInputProps ( {
76
+ startAdornment : selectedItem . map ( item => (
77
+ < Chip
78
+ key = { item }
79
+ tabIndex = { - 1 }
80
+ label = { item }
81
+ className = { classes . chip }
82
+ onDelete = { this . handleDelete ( item ) }
83
+ />
84
+ ) ) ,
85
+ onChange : this . handleInputChange ,
86
+ onKeyDown : this . handleKeyDown ,
87
+ placeholder : 'Select multiple countries' ,
88
+ } ) ,
89
+ label : 'Label' ,
90
+ } ) }
91
+ { isOpen ? (
92
+ < Paper className = { classes . paper } square >
93
+ { getSuggestions ( inputValue2 ) . map ( ( suggestion , index ) =>
94
+ renderSuggestion ( {
95
+ suggestion,
96
+ index,
97
+ itemProps : getItemProps ( { item : suggestion . label } ) ,
98
+ highlightedIndex,
99
+ selectedItem : selectedItem2 ,
100
+ } ) ,
101
+ ) }
102
+ </ Paper >
103
+ ) : null }
104
+ </ div >
105
+ ) }
106
+ </ Downshift >
107
+ </ div >
108
+ )
109
+ }
110
+ }
111
+
112
+ DownshiftMultiple . propTypes = {
113
+ classes : PropTypes . object . isRequired ,
114
+ }
115
+
116
+ export default withStyles ( styles ) ( DownshiftMultiple )
0 commit comments