@zohodesk/components 1.0.0-temp-230.1 → 1.0.0-temp-234

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/.cli/propValidation_report.html +1 -1
  2. package/README.md +41 -11
  3. package/assets/Appearance/dark/mode/Component_DarkMode.module.css +0 -8
  4. package/assets/Appearance/light/mode/Component_LightMode.module.css +0 -8
  5. package/assets/Appearance/pureDark/mode/Component_PureDarkMode.module.css +0 -8
  6. package/es/DateTime/__tests__/__snapshots__/DateTime.spec.js.snap +18 -9
  7. package/es/DateTime/__tests__/__snapshots__/DateWidget.spec.js.snap +6 -3
  8. package/es/DateTime/__tests__/__snapshots__/Time.spec.js.snap +18 -9
  9. package/es/ListItem/ListItem.js +7 -8
  10. package/es/ListItem/ListItem.module.css +0 -6
  11. package/es/ListItem/ListItemWithAvatar.js +12 -6
  12. package/es/ListItem/ListItemWithCheckBox.js +12 -6
  13. package/es/ListItem/ListItemWithIcon.js +11 -5
  14. package/es/ListItem/ListItemWithRadio.js +12 -6
  15. package/es/ListItem/__tests__/ListItem.spec.js +14 -3
  16. package/es/ListItem/__tests__/ListItemWithAvatar.spec.js +19 -0
  17. package/es/ListItem/__tests__/ListItemWithCheckBox.spec.js +19 -0
  18. package/es/ListItem/__tests__/ListItemWithIcon.spec.js +17 -0
  19. package/es/ListItem/__tests__/ListItemWithRadio.spec.js +19 -0
  20. package/es/ListItem/__tests__/__snapshots__/ListItem.spec.js.snap +38 -7
  21. package/es/ListItem/__tests__/__snapshots__/ListItemWithAvatar.spec.js.snap +140 -46
  22. package/es/ListItem/__tests__/__snapshots__/ListItemWithCheckBox.spec.js.snap +251 -49
  23. package/es/ListItem/__tests__/__snapshots__/ListItemWithIcon.spec.js.snap +144 -50
  24. package/es/ListItem/__tests__/__snapshots__/ListItemWithRadio.spec.js.snap +252 -52
  25. package/es/ListItem/props/propTypes.js +14 -5
  26. package/es/MultiSelect/AdvancedGroupMultiSelect.js +16 -8
  27. package/es/MultiSelect/AdvancedMultiSelect.js +13 -6
  28. package/es/MultiSelect/EmptyState.js +2 -1
  29. package/es/MultiSelect/MultiSelect.js +67 -35
  30. package/es/MultiSelect/MultiSelectWithAvatar.js +9 -2
  31. package/es/MultiSelect/SelectedOptions.js +3 -24
  32. package/es/MultiSelect/Suggestions.js +175 -98
  33. package/es/MultiSelect/__tests__/MultiSelect.spec.js +19 -32
  34. package/es/MultiSelect/__tests__/SelectedOptions.spec.js +0 -13
  35. package/es/MultiSelect/__tests__/Suggestions.spec.js +52 -6
  36. package/es/MultiSelect/__tests__/__snapshots__/AdvancedGroupMultiSelect.spec.js.snap +3 -3
  37. package/es/MultiSelect/__tests__/__snapshots__/AdvancedMultiSelect.spec.js.snap +9 -9
  38. package/es/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +178 -10
  39. package/es/MultiSelect/__tests__/__snapshots__/MultiSelectWithAvatar.spec.js.snap +3 -3
  40. package/es/MultiSelect/__tests__/__snapshots__/SelectedOptions.spec.js.snap +0 -15
  41. package/es/MultiSelect/__tests__/__snapshots__/Suggestions.spec.js.snap +308 -31
  42. package/es/MultiSelect/constants.js +6 -0
  43. package/es/MultiSelect/props/defaultProps.js +2 -0
  44. package/es/MultiSelect/props/propTypes.js +16 -58
  45. package/es/Select/GroupSelect.js +4 -2
  46. package/es/Select/Select.js +50 -44
  47. package/es/Select/SelectWithAvatar.js +14 -3
  48. package/es/Select/SelectWithIcon.js +7 -3
  49. package/es/Select/__tests__/Select.spec.js +0 -10
  50. package/es/Select/__tests__/__snapshots__/GroupSelect.spec.js.snap +6 -3
  51. package/es/Select/__tests__/__snapshots__/Select.spec.js.snap +429 -245
  52. package/es/Select/__tests__/__snapshots__/SelectWithIcon.spec.js.snap +6 -3
  53. package/es/Select/props/defaultProps.js +2 -0
  54. package/es/Select/props/propTypes.js +7 -2
  55. package/es/TextBoxIcon/TextBoxIcon.js +12 -17
  56. package/es/TextBoxIcon/TextBoxIcon.module.css +38 -3
  57. package/es/TextBoxIcon/__tests__/TextBoxIcon.spec.js +2 -1
  58. package/es/TextBoxIcon/__tests__/__snapshots__/TextBoxIcon.spec.js.snap +225 -116
  59. package/es/TextBoxIcon/props/propTypes.js +2 -1
  60. package/es/utils/Common.js +3 -4
  61. package/es/utils/dropDownUtils.js +40 -16
  62. package/lib/DateTime/__tests__/__snapshots__/DateTime.spec.js.snap +18 -9
  63. package/lib/DateTime/__tests__/__snapshots__/DateWidget.spec.js.snap +6 -3
  64. package/lib/DateTime/__tests__/__snapshots__/Time.spec.js.snap +18 -9
  65. package/lib/ListItem/ListItem.js +8 -8
  66. package/lib/ListItem/ListItem.module.css +0 -6
  67. package/lib/ListItem/ListItemWithAvatar.js +13 -6
  68. package/lib/ListItem/ListItemWithCheckBox.js +13 -6
  69. package/lib/ListItem/ListItemWithIcon.js +11 -5
  70. package/lib/ListItem/ListItemWithRadio.js +13 -6
  71. package/lib/ListItem/__tests__/ListItem.spec.js +18 -3
  72. package/lib/ListItem/__tests__/ListItemWithAvatar.spec.js +23 -0
  73. package/lib/ListItem/__tests__/ListItemWithCheckBox.spec.js +23 -0
  74. package/lib/ListItem/__tests__/ListItemWithIcon.spec.js +21 -0
  75. package/lib/ListItem/__tests__/ListItemWithRadio.spec.js +23 -0
  76. package/lib/ListItem/__tests__/__snapshots__/ListItem.spec.js.snap +38 -7
  77. package/lib/ListItem/__tests__/__snapshots__/ListItemWithAvatar.spec.js.snap +140 -46
  78. package/lib/ListItem/__tests__/__snapshots__/ListItemWithCheckBox.spec.js.snap +251 -49
  79. package/lib/ListItem/__tests__/__snapshots__/ListItemWithIcon.spec.js.snap +144 -50
  80. package/lib/ListItem/__tests__/__snapshots__/ListItemWithRadio.spec.js.snap +252 -52
  81. package/lib/ListItem/props/propTypes.js +14 -6
  82. package/lib/MultiSelect/AdvancedGroupMultiSelect.js +94 -83
  83. package/lib/MultiSelect/AdvancedMultiSelect.js +16 -7
  84. package/lib/MultiSelect/EmptyState.js +3 -1
  85. package/lib/MultiSelect/MultiSelect.js +68 -33
  86. package/lib/MultiSelect/MultiSelectWithAvatar.js +11 -3
  87. package/lib/MultiSelect/SelectedOptions.js +3 -24
  88. package/lib/MultiSelect/Suggestions.js +177 -101
  89. package/lib/MultiSelect/__tests__/MultiSelect.spec.js +19 -34
  90. package/lib/MultiSelect/__tests__/SelectedOptions.spec.js +0 -15
  91. package/lib/MultiSelect/__tests__/Suggestions.spec.js +52 -8
  92. package/lib/MultiSelect/__tests__/__snapshots__/AdvancedGroupMultiSelect.spec.js.snap +3 -3
  93. package/lib/MultiSelect/__tests__/__snapshots__/AdvancedMultiSelect.spec.js.snap +9 -9
  94. package/lib/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +178 -10
  95. package/lib/MultiSelect/__tests__/__snapshots__/MultiSelectWithAvatar.spec.js.snap +3 -3
  96. package/lib/MultiSelect/__tests__/__snapshots__/SelectedOptions.spec.js.snap +0 -15
  97. package/lib/MultiSelect/__tests__/__snapshots__/Suggestions.spec.js.snap +308 -31
  98. package/lib/MultiSelect/constants.js +13 -0
  99. package/lib/MultiSelect/props/defaultProps.js +2 -0
  100. package/lib/MultiSelect/props/propTypes.js +15 -58
  101. package/lib/Select/GroupSelect.js +4 -3
  102. package/lib/Select/Select.js +48 -41
  103. package/lib/Select/SelectWithAvatar.js +14 -6
  104. package/lib/Select/SelectWithIcon.js +7 -4
  105. package/lib/Select/__tests__/Select.spec.js +0 -12
  106. package/lib/Select/__tests__/__snapshots__/GroupSelect.spec.js.snap +6 -3
  107. package/lib/Select/__tests__/__snapshots__/Select.spec.js.snap +429 -245
  108. package/lib/Select/__tests__/__snapshots__/SelectWithIcon.spec.js.snap +6 -3
  109. package/lib/Select/props/defaultProps.js +2 -0
  110. package/lib/Select/props/propTypes.js +7 -2
  111. package/lib/TextBoxIcon/TextBoxIcon.js +13 -18
  112. package/lib/TextBoxIcon/TextBoxIcon.module.css +38 -3
  113. package/lib/TextBoxIcon/__tests__/TextBoxIcon.spec.js +2 -1
  114. package/lib/TextBoxIcon/__tests__/__snapshots__/TextBoxIcon.spec.js.snap +225 -116
  115. package/lib/TextBoxIcon/props/propTypes.js +2 -1
  116. package/lib/utils/Common.js +5 -9
  117. package/lib/utils/dropDownUtils.js +40 -15
  118. package/package.json +10 -10
  119. package/es/ColorSelect/ColorMultiSelect.js +0 -36
  120. package/es/ColorSelect/ColorSingleSelect.js +0 -50
  121. package/es/ColorSelect/__tests__/ColorMultiSelect.spec.js +0 -59
  122. package/es/ColorSelect/__tests__/ColorSingleSelect.spec.js +0 -59
  123. package/es/ColorSelect/__tests__/__snapshots__/ColorMultiSelect.spec.js.snap +0 -547
  124. package/es/ColorSelect/__tests__/__snapshots__/ColorSingleSelect.spec.js.snap +0 -178
  125. package/es/ColorSelect/common/ColorIndicator/ColorIndicator.js +0 -27
  126. package/es/ColorSelect/common/ColorIndicator/ColorIndicator.module.css +0 -18
  127. package/es/ColorSelect/common/ColorIndicator/__tests__/ColorSingleSelect.spec.js +0 -60
  128. package/es/ColorSelect/common/ColorIndicator/__tests__/__snapshots__/ColorSingleSelect.spec.js.snap +0 -95
  129. package/es/ColorSelect/common/ColorIndicator/props/defaultProps.js +0 -7
  130. package/es/ColorSelect/common/ColorIndicator/props/propTypes.js +0 -9
  131. package/es/ColorSelect/common/ColoredTag/ColoredTag.js +0 -33
  132. package/es/ColorSelect/common/ColoredTag/__tests__/ColoredTag.spec.js +0 -50
  133. package/es/ColorSelect/common/ColoredTag/__tests__/__snapshots__/ColoredTag.spec.js.snap +0 -101
  134. package/es/ColorSelect/common/ColoredTag/props/propTypes.js +0 -9
  135. package/es/ColorSelect/common/helpers.js +0 -35
  136. package/es/ColorSelect/props/defaultProps.js +0 -13
  137. package/es/ColorSelect/props/propTypes.js +0 -14
  138. package/es/shared/ArrowIcon/ArrowIcon.js +0 -36
  139. package/es/shared/ArrowIcon/ArrowIcon.module.css +0 -22
  140. package/es/shared/ArrowIcon/props/defaultProps.js +0 -6
  141. package/es/shared/ArrowIcon/props/propTypes.js +0 -10
  142. package/es/shared/InputFieldLine/InputFieldLine.js +0 -39
  143. package/es/shared/InputFieldLine/InputFieldLine.module.css +0 -90
  144. package/es/shared/InputFieldLine/__tests__/InputFieldLine.spec.js +0 -114
  145. package/es/shared/InputFieldLine/__tests__/__snapshots__/InputFieldLine.spec.js.snap +0 -194
  146. package/es/shared/InputFieldLine/props/defaultProps.js +0 -14
  147. package/es/shared/InputFieldLine/props/propTypes.js +0 -19
  148. package/lib/ColorSelect/ColorMultiSelect.js +0 -65
  149. package/lib/ColorSelect/ColorSingleSelect.js +0 -78
  150. package/lib/ColorSelect/__tests__/ColorMultiSelect.spec.js +0 -70
  151. package/lib/ColorSelect/__tests__/ColorSingleSelect.spec.js +0 -70
  152. package/lib/ColorSelect/__tests__/__snapshots__/ColorMultiSelect.spec.js.snap +0 -547
  153. package/lib/ColorSelect/__tests__/__snapshots__/ColorSingleSelect.spec.js.snap +0 -178
  154. package/lib/ColorSelect/common/ColorIndicator/ColorIndicator.js +0 -40
  155. package/lib/ColorSelect/common/ColorIndicator/ColorIndicator.module.css +0 -18
  156. package/lib/ColorSelect/common/ColorIndicator/__tests__/ColorSingleSelect.spec.js +0 -67
  157. package/lib/ColorSelect/common/ColorIndicator/__tests__/__snapshots__/ColorSingleSelect.spec.js.snap +0 -95
  158. package/lib/ColorSelect/common/ColorIndicator/props/defaultProps.js +0 -14
  159. package/lib/ColorSelect/common/ColorIndicator/props/propTypes.js +0 -20
  160. package/lib/ColorSelect/common/ColoredTag/ColoredTag.js +0 -61
  161. package/lib/ColorSelect/common/ColoredTag/__tests__/ColoredTag.spec.js +0 -58
  162. package/lib/ColorSelect/common/ColoredTag/__tests__/__snapshots__/ColoredTag.spec.js.snap +0 -101
  163. package/lib/ColorSelect/common/ColoredTag/props/propTypes.js +0 -28
  164. package/lib/ColorSelect/common/helpers.js +0 -53
  165. package/lib/ColorSelect/props/defaultProps.js +0 -31
  166. package/lib/ColorSelect/props/propTypes.js +0 -35
  167. package/lib/shared/ArrowIcon/ArrowIcon.js +0 -51
  168. package/lib/shared/ArrowIcon/ArrowIcon.module.css +0 -22
  169. package/lib/shared/ArrowIcon/props/defaultProps.js +0 -13
  170. package/lib/shared/ArrowIcon/props/propTypes.js +0 -21
  171. package/lib/shared/InputFieldLine/InputFieldLine.js +0 -53
  172. package/lib/shared/InputFieldLine/InputFieldLine.module.css +0 -90
  173. package/lib/shared/InputFieldLine/__tests__/InputFieldLine.spec.js +0 -122
  174. package/lib/shared/InputFieldLine/__tests__/__snapshots__/InputFieldLine.spec.js.snap +0 -194
  175. package/lib/shared/InputFieldLine/props/defaultProps.js +0 -21
  176. package/lib/shared/InputFieldLine/props/propTypes.js +0 -36
@@ -2,6 +2,7 @@
2
2
  import React from 'react';
3
3
  import { AdvancedMultiSelect_propTypes } from "./props/propTypes";
4
4
  import { AdvancedMultiSelect_defaultProps } from "./props/defaultProps";
5
+ import { MULTISELECT_I18N_KEYS } from "./constants";
5
6
  /**** Components ****/
6
7
 
7
8
  import { MultiSelectComponent } from "./MultiSelect";
@@ -177,7 +178,8 @@ export class AdvancedMultiSelectComponent extends MultiSelectComponent {
177
178
  const {
178
179
  selectedOptionsLimit,
179
180
  selectedOptionDetails,
180
- allowValueFallback
181
+ allowValueFallback,
182
+ limit
181
183
  } = props;
182
184
  showedSelectedOptionsCount = getIsEmptyValue(showedSelectedOptionsCount) ? selectedOptionsLimit : showedSelectedOptionsCount;
183
185
  const {
@@ -191,7 +193,8 @@ export class AdvancedMultiSelectComponent extends MultiSelectComponent {
191
193
  selectedOptions,
192
194
  normalizedFormatOptions: formatOptions,
193
195
  selectedOptionsLength: showedSelectedOptionsCount,
194
- allowValueFallback: allowValueFallback
196
+ allowValueFallback,
197
+ limit
195
198
  });
196
199
  }
197
200
 
@@ -385,7 +388,8 @@ export class AdvancedMultiSelectComponent extends MultiSelectComponent {
385
388
  positionsOffset,
386
389
  targetOffset,
387
390
  isRestrictScroll,
388
- isFocus
391
+ isFocus,
392
+ limit
389
393
  } = this.props;
390
394
  let {
391
395
  SuggestionsProps = {},
@@ -395,10 +399,11 @@ export class AdvancedMultiSelectComponent extends MultiSelectComponent {
395
399
  containerClass = ''
396
400
  } = customClass;
397
401
  const {
398
- clearText = 'Clear all'
402
+ clearText = MULTISELECT_I18N_KEYS.clearText,
403
+ limitReachedMessage = MULTISELECT_I18N_KEYS.limitReachedMessage
399
404
  } = i18nKeys;
400
405
  const {
401
- clearLabel = 'Clear all'
406
+ clearLabel = MULTISELECT_I18N_KEYS.clearText
402
407
  } = a11y;
403
408
  i18nKeys = Object.assign({}, i18nKeys, {
404
409
  emptyText: i18nKeys.emptyText || emptyMessage,
@@ -541,7 +546,7 @@ export class AdvancedMultiSelectComponent extends MultiSelectComponent {
541
546
  }, /*#__PURE__*/React.createElement(Card, {
542
547
  customClass: style.box,
543
548
  onScroll: this.handleScroll
544
- }, needSelectAll ? /*#__PURE__*/React.createElement(CardHeader, null, /*#__PURE__*/React.createElement(MultiSelectHeader, {
549
+ }, needSelectAll && !(limit >= 0) ? /*#__PURE__*/React.createElement(CardHeader, null, /*#__PURE__*/React.createElement(MultiSelectHeader, {
545
550
  onSelect: this.handleSelectAll,
546
551
  selectAllText: selectAllText,
547
552
  suggestions: suggestions,
@@ -563,6 +568,8 @@ export class AdvancedMultiSelectComponent extends MultiSelectComponent {
563
568
  role: 'option'
564
569
  },
565
570
  dataId: `${dataIdMultiSelectComp}_Options`,
571
+ limit: limit,
572
+ limitReachedMessage: limitReachedMessage,
566
573
  ...SuggestionsProps
567
574
  }) : /*#__PURE__*/React.createElement(EmptyState, {
568
575
  isLoading: isFetchingOptions,
@@ -2,6 +2,7 @@
2
2
  import React from 'react';
3
3
  import { EmptyState_propTypes } from "./props/propTypes";
4
4
  import { EmptyState_defaultProps } from "./props/defaultProps";
5
+ import { MULTISELECT_I18N_KEYS } from "./constants";
5
6
  /**** CSS ****/
6
7
 
7
8
  import style from "./MultiSelect.module.css";
@@ -23,7 +24,7 @@ export default class EmptyState extends React.PureComponent {
23
24
  a11y
24
25
  } = this.props;
25
26
  let {
26
- loadingText = 'Loading',
27
+ loadingText = MULTISELECT_I18N_KEYS.loadingText,
27
28
  emptyText = emptyMessage,
28
29
  noMoreText = noMoreOptionsMessage,
29
30
  searchEmptyText = searchEmptyMessage
@@ -3,6 +3,7 @@ import React from 'react';
3
3
  import { MultiSelect_propTypes } from "./props/propTypes";
4
4
  import { MultiSelect_defaultProps } from "./props/defaultProps";
5
5
  import { defaultProps as MobileHeader_defaultProps } from "./MobileHeader/props/defaultProps";
6
+ import { MULTISELECT_I18N_KEYS } from "./constants";
6
7
  /**** Components ****/
7
8
 
8
9
  import Popup from "../Popup/Popup";
@@ -80,6 +81,8 @@ export class MultiSelectComponent extends React.Component {
80
81
  this.handleSearchOptions = debounce(this.handleSearchOptions.bind(this), searchDebounceTime);
81
82
  this.handleScroll = this.handleScroll.bind(this);
82
83
  this.handleScrollFuncCall = debounce(this.handleScrollFuncCall.bind(this), 500);
84
+ this.getVirtualizerPublicMethods = this.getVirtualizerPublicMethods.bind(this);
85
+ this.setSuggestionsVirtualizerContainerRefFunction = this.setSuggestionsVirtualizerContainerRefFunction.bind(this);
83
86
  }
84
87
 
85
88
  componentDidMount() {
@@ -139,11 +142,6 @@ export class MultiSelectComponent extends React.Component {
139
142
  }
140
143
 
141
144
  componentDidUpdate(prevProps, prevState) {
142
- const {
143
- suggestionContainer,
144
- selectedOptionContainer,
145
- suggestionsOrder
146
- } = this;
147
145
  const {
148
146
  hoverOption,
149
147
  highLightedSelectOptions,
@@ -155,7 +153,8 @@ export class MultiSelectComponent extends React.Component {
155
153
  isPopupOpen,
156
154
  onDropBoxClose,
157
155
  onDropBoxOpen,
158
- isSearchClearOnClose
156
+ isSearchClearOnClose,
157
+ isVirtualizerEnabled
159
158
  } = this.props; //handle dropbox open & close
160
159
 
161
160
  if (prevProps.isPopupOpen !== isPopupOpen) {
@@ -171,12 +170,23 @@ export class MultiSelectComponent extends React.Component {
171
170
  } //scrollTo handling
172
171
 
173
172
 
174
- const hoverId = suggestionsOrder[hoverOption] || '';
175
- const selectedSuggestion = this[`suggestion_${hoverId}`];
176
- const lastHighLightedSelectOption = highLightedSelectOptions.slice(-1).length ? highLightedSelectOptions.slice(-1)[0] : null;
177
- const selectedOption = this[`selectedOption_${lastHighLightedSelectOption}`];
178
- isPopupOpen && scrollTo(suggestionContainer, selectedSuggestion);
179
- selectedOptions.length && selectedOption && scrollTo(selectedOptionContainer, selectedOption); //When suggestions length less than 5, getNextOptions function call
173
+ if (isVirtualizerEnabled && !!this.virtualizerMethods) {
174
+ let position = prevState.hoverOption > hoverOption ? 'top' : 'bottom';
175
+ this.virtualizerMethods.getElementVisiblePercentage(hoverOption) < 50 && this.virtualizerMethods.scrollToIndex(hoverOption, position);
176
+ } else {
177
+ const {
178
+ suggestionContainer,
179
+ selectedOptionContainer,
180
+ suggestionsOrder
181
+ } = this;
182
+ const hoverId = suggestionsOrder[hoverOption] || '';
183
+ const selectedSuggestion = this[`suggestion_${hoverId}`];
184
+ const lastHighLightedSelectOption = highLightedSelectOptions.slice(-1).length ? highLightedSelectOptions.slice(-1)[0] : null;
185
+ const selectedOption = this[`selectedOption_${lastHighLightedSelectOption}`];
186
+ isPopupOpen && scrollTo(suggestionContainer, selectedSuggestion);
187
+ selectedOptions.length && selectedOption && scrollTo(selectedOptionContainer, selectedOption);
188
+ } //When suggestions length less than 5, getNextOptions function call
189
+
180
190
 
181
191
  const {
182
192
  isNextOptions,
@@ -215,6 +225,7 @@ export class MultiSelectComponent extends React.Component {
215
225
  options,
216
226
  valueField,
217
227
  textField,
228
+ secondaryField,
218
229
  prefixText,
219
230
  disabledOptions,
220
231
  allowValueFallback,
@@ -228,18 +239,21 @@ export class MultiSelectComponent extends React.Component {
228
239
  optionType: 'default',
229
240
  disabledOptions,
230
241
  allowValueFallback,
242
+ secondaryField,
231
243
  searchFields
232
244
  });
233
245
  }
234
246
 
235
247
  handleGetSelectedOptions(selectedOptions, normalizedFormatOptions, props) {
236
248
  const {
237
- allowValueFallback
249
+ allowValueFallback,
250
+ limit
238
251
  } = props;
239
252
  return this.getSelectedOptions({
240
253
  selectedOptions,
241
254
  normalizedFormatOptions,
242
- allowValueFallback
255
+ allowValueFallback,
256
+ limit
243
257
  });
244
258
  }
245
259
 
@@ -313,8 +327,10 @@ export class MultiSelectComponent extends React.Component {
313
327
  getNextOptions,
314
328
  isPopupOpen,
315
329
  isPopupOpenOnEnter,
316
- onKeyDown
330
+ onKeyDown,
331
+ limit
317
332
  } = this.props;
333
+ const allowKeyboardActions = !limit || limit && selectedOptions.length < limit;
318
334
  const highLightedSelectOptionsLen = highLightedSelectOptions.length;
319
335
 
320
336
  if (isPopupOpen && (keyCode === 38 || keyCode === 40 || keyCode === 13 || keyCode === 27 || keyCode === 9)) {
@@ -334,7 +350,7 @@ export class MultiSelectComponent extends React.Component {
334
350
 
335
351
  const suggestionsLen = suggestions.length;
336
352
 
337
- if (suggestionsLen && isPopupOpen && keyCode === 38) {
353
+ if (suggestionsLen && isPopupOpen && keyCode === 38 && allowKeyboardActions) {
338
354
  //up arrow
339
355
 
340
356
  /*if (hoverOption === 0) { //disable first to last option higlight
@@ -345,7 +361,7 @@ export class MultiSelectComponent extends React.Component {
345
361
  hoverOption: hoverOption - 1
346
362
  });
347
363
  }
348
- } else if (suggestionsLen && isPopupOpen && keyCode === 40) {
364
+ } else if (suggestionsLen && isPopupOpen && keyCode === 40 && allowKeyboardActions) {
349
365
  //down arrow
350
366
 
351
367
  /*else if (hoverOption === suggestionsLen - 1 || hoverOption === null) {
@@ -362,8 +378,8 @@ export class MultiSelectComponent extends React.Component {
362
378
  hoverOption: hoverOption + 1
363
379
  });
364
380
  }
365
- } else if (keyCode === 13) {
366
- //enter key
381
+ } else if (keyCode === 13 && allowKeyboardActions) {
382
+ //enter ke
367
383
  const selectedOption = suggestions[hoverOption] || {};
368
384
  const {
369
385
  id
@@ -727,14 +743,16 @@ export class MultiSelectComponent extends React.Component {
727
743
  needToCloseOnSelect,
728
744
  togglePopup,
729
745
  selectedOptions: propSelectedOptions,
730
- disabledOptions = dummyArray
746
+ disabledOptions = dummyArray,
747
+ limit
731
748
  } = this.props;
732
749
  const {
733
750
  newSelectedOptions
734
751
  } = filterSelectedOptions({
735
752
  selectedOptions,
736
753
  propSelectedOptions,
737
- disabledOptions
754
+ disabledOptions,
755
+ limit
738
756
  });
739
757
  const selectedOptionsLen = newSelectedOptions.length;
740
758
  const allSelectedOptionsDetails = [];
@@ -791,6 +809,7 @@ export class MultiSelectComponent extends React.Component {
791
809
 
792
810
  suggestionContainerRef(el) {
793
811
  this.suggestionContainer = el;
812
+ typeof this.setSuggestionsVirtualizerRef === 'function' && this.setSuggestionsVirtualizerRef(el);
794
813
  }
795
814
 
796
815
  suggestionItemRef(el, index, id) {
@@ -855,6 +874,15 @@ export class MultiSelectComponent extends React.Component {
855
874
  });
856
875
  }
857
876
 
877
+ getVirtualizerPublicMethods(methods) {
878
+ this.virtualizerMethods = methods;
879
+ }
880
+
881
+ setSuggestionsVirtualizerContainerRefFunction(refFunc) {
882
+ this.setSuggestionsVirtualizerRef = refFunc;
883
+ this.suggestionContainer && refFunc(this.suggestionContainer);
884
+ }
885
+
858
886
  getSelectionUI() {
859
887
  let isResponsive = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
860
888
  let {
@@ -882,7 +910,6 @@ export class MultiSelectComponent extends React.Component {
882
910
  isPopupOpen,
883
911
  ariaErrorId,
884
912
  customProps,
885
- renderCustomSelectedValue,
886
913
  isFocus,
887
914
  isPopupReady,
888
915
  renderCustomClearComponent,
@@ -895,10 +922,10 @@ export class MultiSelectComponent extends React.Component {
895
922
  searchStr
896
923
  } = this.state;
897
924
  const {
898
- clearText = 'Clear all'
925
+ clearText = MULTISELECT_I18N_KEYS.clearText
899
926
  } = i18nKeys;
900
927
  const {
901
- clearLabel = 'Clear all',
928
+ clearLabel = MULTISELECT_I18N_KEYS.clearLabel,
902
929
  ariaLabelledby
903
930
  } = a11y;
904
931
  let {
@@ -927,11 +954,7 @@ export class MultiSelectComponent extends React.Component {
927
954
  onSelect: this.handleClickSelectedOption,
928
955
  size: size,
929
956
  palette: palette,
930
- dataId: `${dataId}_selectedOptions`,
931
- renderCustomSelectedValue: renderCustomSelectedValue,
932
- isPopupReady: isPopupReady,
933
- isPopupOpen: isPopupOpen,
934
- isDisabled: isDisabled
957
+ dataId: `${dataId}_selectedOptions`
935
958
  }), /*#__PURE__*/React.createElement(Box, {
936
959
  flexible: true,
937
960
  className: style.wrapper,
@@ -1040,11 +1063,10 @@ export class MultiSelectComponent extends React.Component {
1040
1063
  isLoading,
1041
1064
  selectAllText,
1042
1065
  needSelectAll,
1043
- customProps
1066
+ customProps,
1067
+ isVirtualizerEnabled,
1068
+ limit
1044
1069
  } = this.props;
1045
- let {
1046
- SuggestionsProps = {}
1047
- } = customProps;
1048
1070
  const {
1049
1071
  selectedOptions,
1050
1072
  searchStr,
@@ -1054,7 +1076,8 @@ export class MultiSelectComponent extends React.Component {
1054
1076
  selectedOptionIds
1055
1077
  } = this.state;
1056
1078
  const {
1057
- searchText = 'Searching...'
1079
+ searchText = MULTISELECT_I18N_KEYS.searchText,
1080
+ limitReachedMessage = MULTISELECT_I18N_KEYS.limitReachedMessage
1058
1081
  } = i18nKeys;
1059
1082
  const suggestions = this.handleFilterSuggestions();
1060
1083
  const setAriaId = this.getNextAriaId();
@@ -1065,6 +1088,9 @@ export class MultiSelectComponent extends React.Component {
1065
1088
  noMoreText: i18nKeys.noMoreText || noMoreOptionsMessage
1066
1089
  });
1067
1090
  let isModel = isMobilePopover(needResponsive);
1091
+ let {
1092
+ SuggestionsProps
1093
+ } = customProps;
1068
1094
  return /*#__PURE__*/React.createElement("div", {
1069
1095
  className: `${style.wrapper} ${isDisabled ? style.disabled : ''} ${isReadOnly ? style.readOnly : ''} ${disableAction ? CssProvider('isBlock') : ''} ${borderColor === 'transparent' ? style.transparentContainer : ''} ${needEffect && !(isDisabled || isReadOnly) ? style.effect : ''}`,
1070
1096
  "data-id": `${isDisabled ? `${dataId}_disabled` : isReadOnly ? `${dataId}_readOnly` : dataId}`,
@@ -1108,7 +1134,7 @@ export class MultiSelectComponent extends React.Component {
1108
1134
  onClick: this.handlePopupClose
1109
1135
  }, /*#__PURE__*/React.createElement("div", {
1110
1136
  className: style.effect
1111
- }, this.getSelectionUI(true))) : null, needSelectAll ? /*#__PURE__*/React.createElement(CardHeader, null, /*#__PURE__*/React.createElement(MultiSelectHeader, {
1137
+ }, this.getSelectionUI(true))) : null, needSelectAll && !(limit >= 0) ? /*#__PURE__*/React.createElement(CardHeader, null, /*#__PURE__*/React.createElement(MultiSelectHeader, {
1112
1138
  onSelect: this.handleSelectAll,
1113
1139
  selectAllText: selectAllText,
1114
1140
  suggestions: suggestions,
@@ -1123,7 +1149,11 @@ export class MultiSelectComponent extends React.Component {
1123
1149
  }, isSearching ? /*#__PURE__*/React.createElement("div", {
1124
1150
  className: style[palette]
1125
1151
  }, searchText) : suggestions.length ? /*#__PURE__*/React.createElement(Suggestions, {
1152
+ key: searchStr.trim(),
1126
1153
  suggestions: suggestions,
1154
+ isVirtualizerEnabled: isVirtualizerEnabled,
1155
+ getVirtualizerPublicMethods: this.getVirtualizerPublicMethods,
1156
+ setVirtualizerContainerRefFunction: this.setSuggestionsVirtualizerContainerRefFunction,
1127
1157
  getRef: this.suggestionItemRef,
1128
1158
  hoverOption: hoverOption,
1129
1159
  onClick: this.handleSelectOption,
@@ -1135,6 +1165,8 @@ export class MultiSelectComponent extends React.Component {
1135
1165
  a11y: {
1136
1166
  role: 'option'
1137
1167
  },
1168
+ limit: limit,
1169
+ limitReachedMessage: limitReachedMessage,
1138
1170
  ...SuggestionsProps
1139
1171
  }) : /*#__PURE__*/React.createElement(EmptyState, {
1140
1172
  isLoading: isFetchingOptions,
@@ -3,6 +3,7 @@ import React from 'react';
3
3
  import { MultiSelectWithAvatar_propTypes } from "./props/propTypes";
4
4
  import { MultiSelectWithAvatar_defaultProps } from "./props/defaultProps";
5
5
  import { defaultProps as MobileHeader_defaultProps } from "./MobileHeader/props/defaultProps";
6
+ import { MULTISELECT_I18N_KEYS } from "./constants";
6
7
  /**** Components ****/
7
8
 
8
9
  import { MultiSelectComponent } from "./MultiSelect";
@@ -93,11 +94,15 @@ class MultiSelectWithAvatarComponent extends MultiSelectComponent {
93
94
  needEffect,
94
95
  isLoading,
95
96
  keepSelectedOptions,
96
- customProps
97
+ customProps,
98
+ limit
97
99
  } = this.props;
98
100
  let {
99
101
  SuggestionsProps = {}
100
102
  } = customProps;
103
+ let {
104
+ limitReachedMessage = MULTISELECT_I18N_KEYS.limitReachedMessage
105
+ } = i18nKeys;
101
106
  i18nKeys = Object.assign({}, MobileHeader_defaultProps.i18nKeys, i18nKeys, {
102
107
  emptyText: i18nKeys.emptyText || emptyMessage,
103
108
  searchEmptyText: i18nKeys.searchEmptyText || searchEmptyMessage,
@@ -158,7 +163,7 @@ class MultiSelectWithAvatarComponent extends MultiSelectComponent {
158
163
  onClick: this.handlePopupClose
159
164
  }, /*#__PURE__*/React.createElement("div", {
160
165
  className: style.effect
161
- }, this.getSelectionUI(true)))) : null, needSelectAll ? /*#__PURE__*/React.createElement(CardHeader, null, /*#__PURE__*/React.createElement(MultiSelectHeader, {
166
+ }, this.getSelectionUI(true)))) : null, needSelectAll && !(limit >= 0) ? /*#__PURE__*/React.createElement(CardHeader, null, /*#__PURE__*/React.createElement(MultiSelectHeader, {
162
167
  onSelect: this.handleSelectAll,
163
168
  selectAllText: selectAllText,
164
169
  suggestions: suggestions,
@@ -184,6 +189,8 @@ class MultiSelectWithAvatarComponent extends MultiSelectComponent {
184
189
  a11y: {
185
190
  role: 'option'
186
191
  },
192
+ limit: limit,
193
+ limitReachedMessage: limitReachedMessage,
187
194
  ...SuggestionsProps
188
195
  }) : /*#__PURE__*/React.createElement(EmptyState, {
189
196
  isLoading: isFetchingOptions,
@@ -23,13 +23,11 @@ export default class SelectedOptions extends React.PureComponent {
23
23
  size,
24
24
  palette,
25
25
  dataId,
26
- renderCustomSelectedValue,
27
- isPopupOpen,
28
- isPopupReady,
29
- isDisabled: isInputDisabled
26
+ limit
30
27
  } = this.props;
31
28
  const isDarkPalette = palette === 'dark' ? 'dark' : 'danger';
32
- return /*#__PURE__*/React.createElement(React.Fragment, null, selectedOptions.map(option => {
29
+ const selectedData = limit && limit > 0 ? selectedOptions.slice(0, limit) : selectedOptions;
30
+ return /*#__PURE__*/React.createElement(React.Fragment, null, selectedData.map(option => {
33
31
  const {
34
32
  id,
35
33
  value,
@@ -71,25 +69,6 @@ export default class SelectedOptions extends React.PureComponent {
71
69
  iconName: icon,
72
70
  iconSize: iconSize
73
71
  }));
74
- } else if (optionType === 'custom') {
75
- return /*#__PURE__*/React.createElement(Box, {
76
- className: `${style.tag} ${style[size]}`,
77
- key: `${id}customTag`,
78
- dataId: dataId
79
- }, typeof renderCustomSelectedValue == 'function' ? renderCustomSelectedValue({
80
- onRemove: isDisabled || isReadOnly ? null : onRemove,
81
- palette: isDarkPalette,
82
- onSelectTag: isReadOnly ? null : onSelect,
83
- getRef: getRef,
84
- isReadOnly: isReadOnly,
85
- isPopupReady: isPopupReady,
86
- isPopupOpen: isPopupOpen,
87
- isDisabled: isInputDisabled,
88
- size,
89
- highLightedSelectOptions,
90
- isActive: highLightedSelectOptions.indexOf(id) >= 0,
91
- option
92
- }) : renderCustomSelectedValue);
93
72
  }
94
73
 
95
74
  return /*#__PURE__*/React.createElement(Box, {