@@ -10,12 +10,15 @@ import prepareProps from '../prepare-props';
10
10
11
11
export const multiOnChange = ( input , simpleValue ) => ( { selectedItem, selectedItems } ) => {
12
12
if ( simpleValue ) {
13
- return input . onChange ( selectedItems . map ( ( { value } ) => value ) || selectedItem . value ) ;
13
+ return input . onChange ( selectedItems ? .map ( ( { value } ) => value ) || selectedItem . value ) ;
14
14
} else {
15
15
return input . onChange ( selectedItems || selectedItem ) ;
16
16
}
17
17
} ;
18
18
19
+ const getMultiValue = ( value , options ) =>
20
+ ( Array . isArray ( value ) ? value : [ value ] ) . map ( ( item ) => ( typeof item === 'object' ? item : options . find ( ( { value } ) => value === item ) ) ) || [ ] ;
21
+
19
22
const ClearedMultiSelectFilterable = ( {
20
23
invalidText,
21
24
hideSelectedOptions,
@@ -44,7 +47,7 @@ const ClearedMultiSelectFilterable = ({
44
47
invalid = { Boolean ( invalidText ) }
45
48
invalidText = { invalidText }
46
49
items = { options }
47
- initialSelectedItems = { Array . isArray ( rest . value ) ? rest . value : [ ] }
50
+ initialSelectedItems = { getMultiValue ( rest . value , options ) }
48
51
/>
49
52
) ;
50
53
@@ -95,7 +98,7 @@ const ClearedMultiSelect = ({
95
98
invalid = { Boolean ( invalidText ) }
96
99
invalidText = { invalidText }
97
100
items = { options }
98
- initialSelectedItems = { Array . isArray ( rest . value ) ? rest . value : [ ] }
101
+ initialSelectedItems = { getMultiValue ( rest . value , options ) }
99
102
/>
100
103
) ;
101
104
@@ -118,6 +121,8 @@ ClearedMultiSelect.propTypes = {
118
121
isDisabled : PropTypes . bool
119
122
} ;
120
123
124
+ const getSelectValue = ( value , isMulti ) => ( isMulti ? value : Array . isArray ( value ) ? value [ 0 ] : value ) ;
125
+
121
126
const ClearedSelect = ( {
122
127
isSearchable,
123
128
isClearable,
@@ -134,9 +139,17 @@ const ClearedSelect = ({
134
139
closeMenuOnSelect,
135
140
originalOnChange,
136
141
placeholder,
142
+ value,
137
143
...rest
138
144
} ) => (
139
- < CarbonSelect disabled = { isFetching } { ...rest } id = { rest . name } invalid = { Boolean ( invalidText ) } invalidText = { invalidText } >
145
+ < CarbonSelect
146
+ value = { getSelectValue ( value , isMulti ) }
147
+ disabled = { isFetching }
148
+ { ...rest }
149
+ id = { rest . name }
150
+ invalid = { Boolean ( invalidText ) }
151
+ invalidText = { invalidText }
152
+ >
140
153
{ isFetching && < SelectItem text = { placeholder } value = { '' } /> }
141
154
{ options . map ( ( option , index ) => (
142
155
< SelectItem key = { option . value || index } text = { option . label } { ...option } />
@@ -162,9 +175,18 @@ ClearedSelect.propTypes = {
162
175
isDisabled : PropTypes . bool ,
163
176
isRequired : PropTypes . bool ,
164
177
isSearchable : PropTypes . bool ,
165
- isClearable : PropTypes . bool
178
+ isClearable : PropTypes . bool ,
179
+ value : PropTypes . any
166
180
} ;
167
181
182
+ const getComboInitialValue = ( value , options = [ ] ) => {
183
+ const result = Array . isArray ( value ) ? value [ 0 ] : value ;
184
+ return typeof result === 'object' ? result : options . find ( ( { value } ) => value === result ) || result ;
185
+ } ;
186
+
187
+ /**
188
+ * Combobox cannot be multi value
189
+ */
168
190
const ClearedSelectSearchable = ( {
169
191
isSearchable,
170
192
isClearable,
@@ -174,7 +196,7 @@ const ClearedSelectSearchable = ({
174
196
hideSelectedOptions,
175
197
noOptionsMessage,
176
198
onInputChange,
177
- options,
199
+ options = [ ] ,
178
200
isFetching,
179
201
invalid,
180
202
classNamePrefix,
@@ -190,7 +212,7 @@ const ClearedSelectSearchable = ({
190
212
id = { rest . name }
191
213
invalid = { Boolean ( invalidText ) }
192
214
invalidText = { invalidText }
193
- initialSelectedItem = { rest . value }
215
+ initialSelectedItem = { getComboInitialValue ( rest . value , options ) }
194
216
items = { options }
195
217
placeholder = { placeholder }
196
218
titleText = { labelText }
0 commit comments