@progress/kendo-react-dropdowns 5.17.0-dev.202308081122 → 5.17.0-dev.202308091121

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 (41) hide show
  1. package/dist/cdn/js/kendo-react-dropdowns.js +1 -1
  2. package/dist/es/AutoComplete/AutoComplete.d.ts +5 -7
  3. package/dist/es/AutoComplete/AutoComplete.js +95 -13
  4. package/dist/es/AutoComplete/AutoCompleteProps.d.ts +4 -0
  5. package/dist/es/ComboBox/ComboBox.d.ts +7 -1
  6. package/dist/es/ComboBox/ComboBox.js +137 -23
  7. package/dist/es/ComboBox/ComboBoxProps.d.ts +4 -0
  8. package/dist/es/DropDownList/DropDownList.d.ts +5 -5
  9. package/dist/es/DropDownList/DropDownList.js +128 -22
  10. package/dist/es/DropDownList/DropDownListProps.d.ts +4 -0
  11. package/dist/es/MultiColumnComboBox/MultiColumnComboBox.js +2 -1
  12. package/dist/es/MultiSelect/MultiSelect.d.ts +3 -1
  13. package/dist/es/MultiSelect/MultiSelect.js +80 -9
  14. package/dist/es/MultiSelect/MultiSelectProps.d.ts +4 -0
  15. package/dist/es/common/List.js +2 -2
  16. package/dist/es/common/ListItem.d.ts +4 -0
  17. package/dist/es/common/ListItem.js +4 -3
  18. package/dist/es/common/Navigation.d.ts +1 -0
  19. package/dist/es/common/Navigation.js +2 -2
  20. package/dist/es/package-metadata.js +1 -1
  21. package/dist/npm/AutoComplete/AutoComplete.d.ts +5 -7
  22. package/dist/npm/AutoComplete/AutoComplete.js +95 -13
  23. package/dist/npm/AutoComplete/AutoCompleteProps.d.ts +4 -0
  24. package/dist/npm/ComboBox/ComboBox.d.ts +7 -1
  25. package/dist/npm/ComboBox/ComboBox.js +137 -23
  26. package/dist/npm/ComboBox/ComboBoxProps.d.ts +4 -0
  27. package/dist/npm/DropDownList/DropDownList.d.ts +5 -5
  28. package/dist/npm/DropDownList/DropDownList.js +127 -21
  29. package/dist/npm/DropDownList/DropDownListProps.d.ts +4 -0
  30. package/dist/npm/MultiColumnComboBox/MultiColumnComboBox.js +2 -1
  31. package/dist/npm/MultiSelect/MultiSelect.d.ts +3 -1
  32. package/dist/npm/MultiSelect/MultiSelect.js +80 -9
  33. package/dist/npm/MultiSelect/MultiSelectProps.d.ts +4 -0
  34. package/dist/npm/common/List.js +2 -2
  35. package/dist/npm/common/ListItem.d.ts +4 -0
  36. package/dist/npm/common/ListItem.js +4 -3
  37. package/dist/npm/common/Navigation.d.ts +1 -0
  38. package/dist/npm/common/Navigation.js +2 -2
  39. package/dist/npm/package-metadata.js +1 -1
  40. package/dist/systemjs/kendo-react-dropdowns.js +1 -1
  41. package/package.json +16 -16
@@ -186,9 +186,12 @@ var AutoCompleteWithoutContext = /** @class */ (function (_super) {
186
186
  _this.applyState(state);
187
187
  };
188
188
  _this.onInputKeyDown = function (event) {
189
+ var _a = _this.props, _b = _a.data, data = _b === void 0 ? [] : _b, skipDisabledItems = _a.skipDisabledItems, groupField = _a.groupField, textField = _a.textField;
189
190
  if (_this._isScrolling) {
190
191
  _this._isScrolling = false;
191
192
  }
193
+ var focusedIndex = _this.focusedIndex();
194
+ var focusedItem = data[focusedIndex];
192
195
  var keyCode = event.keyCode;
193
196
  var opened = _this.props.opened !== undefined ? _this.props.opened : _this.state.opened;
194
197
  var state = _this.base.initState();
@@ -200,11 +203,76 @@ var AutoCompleteWithoutContext = /** @class */ (function (_super) {
200
203
  };
201
204
  if (keyCode === kendo_react_common_1.Keys.enter || keyCode === kendo_react_common_1.Keys.esc) {
202
205
  preventDefault();
203
- _this.applyInputValue(event.currentTarget.value, state, event.keyCode);
206
+ if (skipDisabledItems === false && focusedItem.disabled) {
207
+ if (opened) {
208
+ _this.togglePopup(state);
209
+ }
210
+ _this.applyState(state);
211
+ }
212
+ else {
213
+ _this.applyInputValue(event.currentTarget.value, state, event.keyCode);
214
+ }
204
215
  }
205
216
  else if (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.down) {
217
+ if (groupField !== '' && textField) {
218
+ if (!_this.props.skipDisabledItems && opened) {
219
+ _this.onNavigate(state, keyCode);
220
+ }
221
+ else {
222
+ var newIndex = 0;
223
+ if (keyCode === kendo_react_common_1.Keys.down || keyCode === kendo_react_common_1.Keys.right) {
224
+ var tempnewIndex_1 = data.slice(focusedIndex + 1).find(function (i) { return !i.disabled && i[textField]; });
225
+ newIndex = tempnewIndex_1 && data.findIndex(function (el) { return el[textField] === tempnewIndex_1[textField]; });
226
+ }
227
+ else if (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.left) {
228
+ var dataToSearch = void 0;
229
+ if (focusedIndex === -1) {
230
+ dataToSearch = data;
231
+ newIndex = data.findIndex(function (i) { return !i.disabled && i[textField]; });
232
+ }
233
+ else {
234
+ dataToSearch = data.slice(0, focusedIndex);
235
+ var tempnewIndex_2 = dataToSearch.pop();
236
+ while (tempnewIndex_2 && tempnewIndex_2.disabled) {
237
+ tempnewIndex_2 = dataToSearch.pop();
238
+ }
239
+ newIndex = tempnewIndex_2 && data.findIndex(function (el) { return el[textField] === tempnewIndex_2[textField]; });
240
+ }
241
+ }
242
+ if (newIndex !== undefined) {
243
+ var skipItems = newIndex - focusedIndex;
244
+ _this.onNavigate(state, keyCode, skipItems);
245
+ }
246
+ else if (newIndex === undefined && data.findIndex(function (el) { return el[textField]; }) === data.length - 1) {
247
+ _this.onNavigate(state, keyCode);
248
+ }
249
+ }
250
+ }
251
+ else if (!_this.props.skipDisabledItems && opened) {
252
+ _this.onNavigate(state, keyCode);
253
+ }
254
+ else {
255
+ var newIndex = null;
256
+ if (keyCode === kendo_react_common_1.Keys.down || keyCode === kendo_react_common_1.Keys.right) {
257
+ newIndex = data.slice(focusedIndex + 1).find(function (i) { return !i.disabled; });
258
+ }
259
+ else if (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.left) {
260
+ var dataTest = data.slice(0, focusedIndex);
261
+ newIndex = dataTest.pop();
262
+ while (newIndex && newIndex.disabled) {
263
+ newIndex = dataTest.pop();
264
+ }
265
+ }
266
+ if (newIndex) {
267
+ var skipItems = newIndex.id - focusedIndex - 1;
268
+ _this.onNavigate(state, keyCode, skipItems);
269
+ }
270
+ else {
271
+ _this.onNavigate(state, keyCode);
272
+ }
273
+ }
274
+ _this.applyState(state);
206
275
  preventDefault();
207
- _this.onNavigate(state, keyCode);
208
276
  }
209
277
  };
210
278
  _this.handleBlur = function (event) {
@@ -386,7 +454,7 @@ var AutoCompleteWithoutContext = /** @class */ (function (_super) {
386
454
  /**
387
455
  * @hidden
388
456
  */
389
- AutoCompleteWithoutContext.prototype.onNavigate = function (state, keyCode) {
457
+ AutoCompleteWithoutContext.prototype.onNavigate = function (state, keyCode, skipItems) {
390
458
  var _this = this;
391
459
  var typedText = this.value;
392
460
  var _a = this.props, _b = _a.data, data = _b === void 0 ? [] : _b, textField = _a.textField, focusedItemIndex = _a.focusedItemIndex;
@@ -398,7 +466,8 @@ var AutoCompleteWithoutContext = /** @class */ (function (_super) {
398
466
  keyCode: keyCode,
399
467
  current: focusedIndex,
400
468
  max: data.length - 1,
401
- min: 0
469
+ min: 0,
470
+ skipItems: skipItems ? skipItems : undefined
402
471
  });
403
472
  if (newFocused !== undefined) {
404
473
  this.itemFocus(newFocused, state);
@@ -411,10 +480,14 @@ var AutoCompleteWithoutContext = /** @class */ (function (_super) {
411
480
  AutoCompleteWithoutContext.prototype.applyInputValue = function (value, state, eventKey) {
412
481
  var opened = this.props.opened !== undefined ? this.props.opened : this.state.opened;
413
482
  var _a = this.props, _b = _a.data, data = _b === void 0 ? [] : _b, textField = _a.textField;
483
+ var focusedIndex = this.focusedIndex();
484
+ var focusedItem = data[focusedIndex];
414
485
  this._suggested = '';
415
486
  if (opened && eventKey === kendo_react_common_1.Keys.enter) {
416
- var newValue = (0, utils_1.getItemValue)(data[this.focusedIndex(value)], textField);
417
- this.triggerOnChange(newValue, state);
487
+ if (!focusedItem.disabled) {
488
+ var newValue = (0, utils_1.getItemValue)(data[this.focusedIndex(value)], textField);
489
+ this.triggerOnChange(newValue, state);
490
+ }
418
491
  }
419
492
  if (opened) {
420
493
  this.togglePopup(state);
@@ -491,22 +564,31 @@ var AutoCompleteWithoutContext = /** @class */ (function (_super) {
491
564
  };
492
565
  AutoCompleteWithoutContext.prototype.focusedIndex = function (value) {
493
566
  var _this = this;
494
- var _a = this.props, _b = _a.data, data = _b === void 0 ? [] : _b, textField = _a.textField, focusedItemIndex = _a.focusedItemIndex;
567
+ var _a = this.props, _b = _a.data, data = _b === void 0 ? [] : _b, textField = _a.textField, focusedItemIndex = _a.focusedItemIndex, skipDisabledItems = _a.skipDisabledItems;
495
568
  var inputValue = value !== undefined ? value : this.value;
496
- return this.state.focusedItem !== undefined ?
497
- data.findIndex(function (i) { return (0, utils_1.areSame)(i, _this.state.focusedItem, textField); }) :
498
- (focusedItemIndex ? focusedItemIndex(data, inputValue, textField) :
499
- Math.max(0, data.indexOf((0, utils_1.getFocusedItem)(data, inputValue, textField))));
569
+ if (this.state.focusedItem !== undefined) {
570
+ return data.findIndex(function (i) { return (0, utils_1.areSame)(i, _this.state.focusedItem, textField); });
571
+ }
572
+ else if (focusedItemIndex) {
573
+ return focusedItemIndex(data, inputValue, textField);
574
+ }
575
+ else {
576
+ var indexOfFocusedItem = data.indexOf((0, utils_1.getFocusedItem)(data, inputValue, textField));
577
+ if (skipDisabledItems && textField && indexOfFocusedItem === -1) {
578
+ return data.findIndex(function (i) { return !i.disabled && i[textField]; });
579
+ }
580
+ return Math.max(0, indexOfFocusedItem);
581
+ }
500
582
  };
501
583
  AutoCompleteWithoutContext.displayName = 'AutoComplete';
502
584
  /**
503
585
  * @hidden
504
586
  */
505
- AutoCompleteWithoutContext.propTypes = __assign(__assign({}, DropDownBase_1.default.basicPropTypes), { size: PropTypes.oneOf([null, 'small', 'medium', 'large']), rounded: PropTypes.oneOf([null, 'small', 'medium', 'large', 'full']), fillMode: PropTypes.oneOf([null, 'solid', 'flat', 'outline']), groupField: PropTypes.string, suggest: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]), placeholder: PropTypes.string, value: PropTypes.string, defaultValue: PropTypes.string, validationMessage: PropTypes.string, required: PropTypes.bool, readonly: PropTypes.bool, clearButton: PropTypes.bool, valueRender: PropTypes.func, id: PropTypes.string, ariaLabelledBy: PropTypes.string, ariaDescribedBy: PropTypes.string, list: PropTypes.any });
587
+ AutoCompleteWithoutContext.propTypes = __assign(__assign({}, DropDownBase_1.default.basicPropTypes), { size: PropTypes.oneOf([null, 'small', 'medium', 'large']), rounded: PropTypes.oneOf([null, 'small', 'medium', 'large', 'full']), fillMode: PropTypes.oneOf([null, 'solid', 'flat', 'outline']), groupField: PropTypes.string, suggest: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]), placeholder: PropTypes.string, value: PropTypes.string, defaultValue: PropTypes.string, validationMessage: PropTypes.string, required: PropTypes.bool, readonly: PropTypes.bool, clearButton: PropTypes.bool, valueRender: PropTypes.func, id: PropTypes.string, ariaLabelledBy: PropTypes.string, ariaDescribedBy: PropTypes.string, list: PropTypes.any, skipDisabledItems: PropTypes.bool });
506
588
  /**
507
589
  * @hidden
508
590
  */
509
- AutoCompleteWithoutContext.defaultProps = __assign(__assign({}, DropDownBase_1.default.defaultProps), { size: 'medium', rounded: 'medium', fillMode: 'solid' });
591
+ AutoCompleteWithoutContext.defaultProps = __assign(__assign({}, DropDownBase_1.default.defaultProps), { size: 'medium', rounded: 'medium', fillMode: 'solid', skipDisabledItems: true });
510
592
  return AutoCompleteWithoutContext;
511
593
  }(React.Component));
512
594
  exports.AutoCompleteWithoutContext = AutoCompleteWithoutContext;
@@ -236,4 +236,8 @@ export interface AutoCompleteProps extends FormComponentProps {
236
236
  * Sets the key for comparing the data items of the AutoComplete. If `dataItemKey` is not set, the AutoComplete compares the items by reference.
237
237
  */
238
238
  dataItemKey?: string;
239
+ /**
240
+ * Defines if AutoComplete's disabled items will be skipped or focused when navigating through the list of items using a keyboard. Defaults to `true`.
241
+ */
242
+ skipDisabledItems?: boolean;
239
243
  }
@@ -45,6 +45,7 @@ export declare class ComboBoxWithoutContext extends React.Component<ComboBoxProp
45
45
  ariaDescribedBy: PropTypes.Requireable<string>;
46
46
  list: PropTypes.Requireable<any>;
47
47
  valueRender: PropTypes.Requireable<(...args: any[]) => any>;
48
+ skipDisabledItems: PropTypes.Requireable<boolean>;
48
49
  value: PropTypes.Requireable<any>;
49
50
  defaultValue: PropTypes.Requireable<any>;
50
51
  filterable: PropTypes.Requireable<boolean>;
@@ -98,6 +99,7 @@ export declare class ComboBoxWithoutContext extends React.Component<ComboBoxProp
98
99
  required: boolean;
99
100
  groupMode: string | undefined;
100
101
  isMultiColumn: boolean;
102
+ skipDisabledItems: boolean;
101
103
  popupSettings: {
102
104
  height: string;
103
105
  };
@@ -156,7 +158,7 @@ export declare class ComboBoxWithoutContext extends React.Component<ComboBoxProp
156
158
  /** @hidden */
157
159
  handleItemSelect: (index: number, state: ComboInternalState) => void;
158
160
  /** @hidden */
159
- onNavigate(state: InternalState, keyCode: number): void;
161
+ onNavigate(state: InternalState, keyCode: number, skipItems?: number): void;
160
162
  private onPopupOpened;
161
163
  private componentRef;
162
164
  private toggleBtnClick;
@@ -175,7 +177,11 @@ export declare class ComboBoxWithoutContext extends React.Component<ComboBoxProp
175
177
  private onInputClick;
176
178
  private onInputKeyDown;
177
179
  private inputOnChange;
180
+ private clearValue;
178
181
  private clearButtonClick;
182
+ private clearValueOnEnterOrEsc;
183
+ private clearValueOnBlur;
184
+ private clearValueOnToggleBtnClick;
179
185
  private triggerOnChange;
180
186
  private getFocusedIndex;
181
187
  private suggestValue;
@@ -98,9 +98,15 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
98
98
  _this.base.wrapper = element;
99
99
  };
100
100
  _this.toggleBtnClick = function (event) {
101
+ var _a = _this.props, _b = _a.data, data = _b === void 0 ? [] : _b, skipDisabledItems = _a.skipDisabledItems, textField = _a.textField;
102
+ var focusedIndex = _this.getFocusedIndex();
103
+ var isCurrentValueDisabled = textField && data[focusedIndex].disabled;
101
104
  var opened = _this.props.opened !== undefined ? _this.props.opened : _this.state.opened;
102
105
  var state = _this.base.initState();
103
106
  state.syntheticEvent = event;
107
+ if (!skipDisabledItems && textField && isCurrentValueDisabled) {
108
+ _this.clearValueOnToggleBtnClick(event);
109
+ }
104
110
  _this.base.togglePopup(state);
105
111
  if (!opened && _this.mobileMode) {
106
112
  var mobileText = _this.props.adaptiveFilter !== undefined ? _this.props.adaptiveFilter : _this.state.text || null;
@@ -161,9 +167,16 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
161
167
  _this.handleBlur = function (event) {
162
168
  if (_this.state.focused && !_this._skipBlur) {
163
169
  var state = _this.base.initState();
170
+ var _a = _this.props, textField = _a.textField, data = _a.data;
171
+ var focusedIndex = _this.getFocusedIndex();
172
+ var isCustomValue = focusedIndex === -1;
173
+ var isCurrentValueDisabled = textField && !isCustomValue && data && data[focusedIndex].disabled;
164
174
  state.data.focused = false;
165
175
  state.events.push({ type: 'onBlur' });
166
176
  state.syntheticEvent = event;
177
+ if (textField && isCurrentValueDisabled) {
178
+ _this.clearValueOnBlur(event);
179
+ }
167
180
  _this.applyValueOnRejectSuggestions(event.currentTarget.value, state);
168
181
  }
169
182
  };
@@ -179,30 +192,105 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
179
192
  }
180
193
  };
181
194
  _this.onInputKeyDown = function (event) {
195
+ var _a = _this.props, _b = _a.data, data = _b === void 0 ? [] : _b, skipDisabledItems = _a.skipDisabledItems, textField = _a.textField, dataItemKey = _a.dataItemKey, groupField = _a.groupField;
196
+ var value = _this.value;
197
+ var selectedIndex = Math.max(0, data.findIndex(function (i) { return (0, utils_1.areSame)(i, value, dataItemKey); }));
182
198
  var keyCode = event.keyCode;
183
199
  var opened = _this.props.opened !== undefined ? _this.props.opened : _this.state.opened;
184
200
  var state = _this.base.initState();
185
201
  state.syntheticEvent = event;
186
202
  if (!event.altKey && (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.down)) {
187
203
  event.preventDefault();
188
- _this.onNavigate(state, keyCode);
204
+ if (groupField !== '' && textField) {
205
+ if (!_this.props.skipDisabledItems && opened) {
206
+ _this.onNavigate(state, keyCode);
207
+ }
208
+ else {
209
+ var newIndex = 0;
210
+ if (keyCode === kendo_react_common_1.Keys.down || keyCode === kendo_react_common_1.Keys.right) {
211
+ var tempnewIndex_1 = data.slice(selectedIndex + 1).find(function (i) { return !i.disabled && i[textField]; });
212
+ newIndex = tempnewIndex_1 && data.findIndex(function (el) { return el[textField] === tempnewIndex_1[textField]; });
213
+ }
214
+ else if (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.left) {
215
+ var dataToSearch = void 0;
216
+ if (selectedIndex === 0) {
217
+ dataToSearch = data;
218
+ newIndex = data.findIndex(function (i) { return !i.disabled && i[textField]; });
219
+ }
220
+ else {
221
+ dataToSearch = data.slice(0, selectedIndex);
222
+ var tempnewIndex_2 = dataToSearch.pop();
223
+ while (tempnewIndex_2 && tempnewIndex_2.disabled) {
224
+ tempnewIndex_2 = dataToSearch.pop();
225
+ }
226
+ newIndex = tempnewIndex_2 && data.findIndex(function (el) { return el[textField] === tempnewIndex_2[textField]; });
227
+ }
228
+ }
229
+ if (newIndex !== undefined) {
230
+ var skipItems = newIndex - selectedIndex;
231
+ _this.onNavigate(state, keyCode, skipItems);
232
+ }
233
+ else if (newIndex === undefined && data.findIndex(function (el) { return el[textField] === value[textField]; }) === data.length - 1) {
234
+ _this.onNavigate(state, keyCode);
235
+ }
236
+ }
237
+ }
238
+ else if (!_this.props.skipDisabledItems && opened) {
239
+ _this.onNavigate(state, keyCode);
240
+ }
241
+ else {
242
+ var newIndex = null;
243
+ if (keyCode === kendo_react_common_1.Keys.down || keyCode === kendo_react_common_1.Keys.right) {
244
+ newIndex = data.slice(selectedIndex + 1).find(function (i) { return !i.disabled; });
245
+ }
246
+ else if (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.left) {
247
+ var dataTest = data.slice(0, selectedIndex);
248
+ newIndex = dataTest.pop();
249
+ while (newIndex && newIndex.disabled) {
250
+ newIndex = dataTest.pop();
251
+ }
252
+ }
253
+ if (newIndex) {
254
+ var skipItems = newIndex.id - selectedIndex - 1;
255
+ _this.onNavigate(state, keyCode, skipItems);
256
+ }
257
+ else {
258
+ _this.onNavigate(state, keyCode);
259
+ }
260
+ }
189
261
  _this.applyState(state);
190
- return;
191
262
  }
192
263
  var togglePopup = function () {
193
264
  event.preventDefault();
194
265
  _this.base.togglePopup(state);
195
266
  _this.applyState(state);
196
267
  };
268
+ var focusedIndex = _this.getFocusedIndex();
269
+ var isCustomValue = focusedIndex === -1;
270
+ var isCurrentValueDisabled = textField && !isCustomValue && data[focusedIndex].disabled;
197
271
  if (opened) {
198
272
  if (event.altKey && keyCode === kendo_react_common_1.Keys.up) {
199
273
  togglePopup();
200
274
  }
201
275
  else if (keyCode === kendo_react_common_1.Keys.enter) {
202
276
  event.preventDefault();
203
- _this.applyValueOnEnter(event.currentTarget.value, state);
277
+ var currentValueText = textField && !isCustomValue && event.currentTarget.value ? data[focusedIndex][textField] : undefined;
278
+ if (currentValueText) {
279
+ if (!skipDisabledItems && textField && isCurrentValueDisabled) {
280
+ _this.clearValueOnEnterOrEsc(event);
281
+ }
282
+ else if (!isCurrentValueDisabled) {
283
+ _this.applyValueOnEnter(event.currentTarget.value, state);
284
+ }
285
+ }
286
+ else {
287
+ _this.applyValueOnEnter(event.currentTarget.value, state);
288
+ }
204
289
  }
205
290
  else if (keyCode === kendo_react_common_1.Keys.esc) {
291
+ if (!skipDisabledItems && textField && isCurrentValueDisabled) {
292
+ _this.clearValueOnEnterOrEsc(event);
293
+ }
206
294
  _this.applyValueOnRejectSuggestions(event.currentTarget.value, state);
207
295
  }
208
296
  }
@@ -248,18 +336,25 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
248
336
  var state = _this.base.initState();
249
337
  state.syntheticEvent = event;
250
338
  event.stopPropagation();
251
- _this._suggested = '';
252
- _this.base.filterChanged('', state);
253
- if (_this.props.filter === undefined && _this.state.text !== undefined) {
254
- state.data.text = undefined;
255
- }
256
- _this.triggerOnChange(null, state);
257
- var opened = _this.props.opened !== undefined ? _this.props.opened : _this.state.opened;
258
- var isAdaptive = _this.mobileMode;
259
- if (opened && !isAdaptive) {
260
- _this.base.togglePopup(state);
261
- }
262
- _this.applyState(state);
339
+ _this.clearValue();
340
+ };
341
+ _this.clearValueOnEnterOrEsc = function (event) {
342
+ var state = _this.base.initState();
343
+ state.syntheticEvent = event;
344
+ event.stopPropagation();
345
+ _this.clearValue();
346
+ };
347
+ _this.clearValueOnBlur = function (event) {
348
+ var state = _this.base.initState();
349
+ state.syntheticEvent = event;
350
+ event.stopPropagation();
351
+ _this.clearValue();
352
+ };
353
+ _this.clearValueOnToggleBtnClick = function (event) {
354
+ var state = _this.base.initState();
355
+ state.syntheticEvent = event;
356
+ event.stopPropagation();
357
+ _this.clearValue();
263
358
  };
264
359
  _this.setValidity = function () {
265
360
  if (_this._input && _this._input.setCustomValidity) {
@@ -388,7 +483,7 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
388
483
  /** @hidden */
389
484
  ComboBoxWithoutContext.prototype.componentDidUpdate = function (prevProps, prevState) {
390
485
  var _a;
391
- var _b = this.props, dataItemKey = _b.dataItemKey, virtual = _b.virtual, _c = _b.groupField, groupField = _c === void 0 ? '' : _c, _d = _b.data, data = _d === void 0 ? [] : _d;
486
+ var _b = this.props, dataItemKey = _b.dataItemKey, virtual = _b.virtual, _c = _b.groupField, groupField = _c === void 0 ? '' : _c, _d = _b.data, data = _d === void 0 ? [] : _d, textField = _b.textField;
392
487
  var prevTotal = prevProps.virtual ? prevProps.virtual.total : 0;
393
488
  var opened = this.props.opened !== undefined ? this.props.opened : this.state.opened;
394
489
  var prevOpened = prevProps.opened !== undefined ? prevProps.opened : prevState.opened;
@@ -403,8 +498,8 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
403
498
  var prevSelectedItem = prevProps.value !== undefined ? prevProps.value : prevState.value;
404
499
  var selectedItemIndex = data.findIndex(function (i) { return (0, utils_1.areSame)(i, selectedItem, dataItemKey); });
405
500
  // Needed to calculate the proper item index when in 'modern' grouping mode
406
- if (this.props.groupMode === 'modern') {
407
- selectedItemIndex = (_a = this.base.getGroupedDataModernMode(data, groupField)) === null || _a === void 0 ? void 0 : _a.indexOf(selectedItem);
501
+ if (this.props.groupMode === 'modern' && textField && selectedItem) {
502
+ selectedItemIndex = (_a = this.base.getGroupedDataModernMode(data, groupField)) === null || _a === void 0 ? void 0 : _a.map(function (el) { return el[textField]; }).indexOf(selectedItem[textField]);
408
503
  }
409
504
  var selectedItemChanged = !(0, utils_1.areSame)(prevSelectedItem, selectedItem, dataItemKey);
410
505
  if (opening && virtual) {
@@ -487,7 +582,7 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
487
582
  : combobox;
488
583
  };
489
584
  /** @hidden */
490
- ComboBoxWithoutContext.prototype.onNavigate = function (state, keyCode) {
585
+ ComboBoxWithoutContext.prototype.onNavigate = function (state, keyCode, skipItems) {
491
586
  var _a = this.props, _b = _a.data, data = _b === void 0 ? [] : _b, _c = _a.virtual, virtual = _c === void 0 ? { skip: 0 } : _c;
492
587
  var text = this.props.filter ? this.props.filter : this.state.text;
493
588
  var focusedIndex = this.getFocusedIndex();
@@ -506,7 +601,8 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
506
601
  keyCode: keyCode,
507
602
  current: currentIndex,
508
603
  max: (vs.enabled ? vs.total : data.length) - 1,
509
- min: 0
604
+ min: 0,
605
+ skipItems: skipItems ? skipItems : undefined
510
606
  });
511
607
  if (newIndex !== undefined) {
512
608
  this.handleItemSelect(newIndex, state);
@@ -706,6 +802,21 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
706
802
  }
707
803
  return (React.createElement(SearchBar_1.default, { id: id, readOnly: (opened && this.mobileMode), placeholder: placeholder, tabIndex: tabIndex, title: this.props.title, accessKey: this.props.accessKey, value: text + this._suggested, suggestedText: this._suggested, ref: function (el) { return _this._input = el && el.input; }, onClick: this.onInputClick, onKeyDown: this.onInputKeyDown, onChange: this.inputOnChange, onFocus: this.base.handleFocus, onBlur: this.handleBlur, disabled: disabled, expanded: opened, owns: this.base.listBoxId, activedescendant: "option-".concat(this.base.guid, "-").concat(selectedIndex + virtual.skip), role: "combobox", ariaLabelledBy: this.props.ariaLabelledBy, ariaDescribedBy: this.props.ariaDescribedBy, ariaRequired: this.required, render: this.props.valueRender }));
708
804
  };
805
+ ComboBoxWithoutContext.prototype.clearValue = function () {
806
+ var state = this.base.initState();
807
+ this._suggested = '';
808
+ this.base.filterChanged('', state);
809
+ if (this.props.filter === undefined && this.state.text !== undefined) {
810
+ state.data.text = undefined;
811
+ }
812
+ this.triggerOnChange(null, state);
813
+ var opened = this.props.opened !== undefined ? this.props.opened : this.state.opened;
814
+ var isAdaptive = this.mobileMode;
815
+ if (opened && !isAdaptive) {
816
+ this.base.togglePopup(state);
817
+ }
818
+ this.applyState(state);
819
+ };
709
820
  ComboBoxWithoutContext.prototype.triggerOnChange = function (item, state) {
710
821
  var value = this.value;
711
822
  if ((!(0, utils_1.isPresent)(value) && !(0, utils_1.isPresent)(item)) || (0, utils_1.areSame)(value, item, this.props.dataItemKey)) {
@@ -719,7 +830,7 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
719
830
  };
720
831
  ComboBoxWithoutContext.prototype.getFocusedIndex = function () {
721
832
  var value = this.value;
722
- var _a = this.props, _b = _a.data, data = _b === void 0 ? [] : _b, textField = _a.textField, dataItemKey = _a.dataItemKey, _c = _a.virtual, virtual = _c === void 0 ? { skip: 0 } : _c, _d = _a.focusedItemIndex, focusedItemIndex = _d === void 0 ? utils_1.itemIndexStartsWith : _d;
833
+ var _a = this.props, _b = _a.data, data = _b === void 0 ? [] : _b, textField = _a.textField, dataItemKey = _a.dataItemKey, _c = _a.virtual, virtual = _c === void 0 ? { skip: 0 } : _c, _d = _a.focusedItemIndex, focusedItemIndex = _d === void 0 ? utils_1.itemIndexStartsWith : _d, skipDisabledItems = _a.skipDisabledItems;
723
834
  var text = this.props.filter ? this.props.filter : this.state.text;
724
835
  if ((0, utils_1.isPresent)(value) && text === undefined) {
725
836
  return data.findIndex(function (i) { return (0, utils_1.areSame)(i, value, dataItemKey); });
@@ -727,6 +838,9 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
727
838
  else if (text) {
728
839
  return focusedItemIndex(data, text, textField);
729
840
  }
841
+ else if (skipDisabledItems && textField && !text && virtual.skip === 0) {
842
+ return data.findIndex(function (i) { return !i.disabled && i[textField]; });
843
+ }
730
844
  else {
731
845
  return virtual.skip === 0 ? 0 : -1;
732
846
  }
@@ -749,9 +863,9 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
749
863
  ;
750
864
  ComboBoxWithoutContext.displayName = 'ComboBox';
751
865
  /** @hidden */
752
- ComboBoxWithoutContext.propTypes = __assign(__assign({}, DropDownBase_1.default.propTypes), { size: PropTypes.oneOf([null, 'small', 'medium', 'large']), rounded: PropTypes.oneOf([null, 'small', 'medium', 'large', 'full']), fillMode: PropTypes.oneOf([null, 'solid', 'flat', 'outline']), dataItemKey: PropTypes.string, groupField: PropTypes.string, groupMode: PropTypes.oneOf([undefined, 'classic', 'modern']), isMultiColumn: PropTypes.bool, suggest: PropTypes.bool, placeholder: PropTypes.string, title: PropTypes.string, allowCustom: PropTypes.bool, clearButton: PropTypes.bool, iconClassName: PropTypes.string, svgIcon: kendo_react_common_1.svgIconPropType, validationMessage: PropTypes.string, required: PropTypes.bool, id: PropTypes.string, ariaLabelledBy: PropTypes.string, ariaDescribedBy: PropTypes.string, list: PropTypes.any, valueRender: PropTypes.func });
866
+ ComboBoxWithoutContext.propTypes = __assign(__assign({}, DropDownBase_1.default.propTypes), { size: PropTypes.oneOf([null, 'small', 'medium', 'large']), rounded: PropTypes.oneOf([null, 'small', 'medium', 'large', 'full']), fillMode: PropTypes.oneOf([null, 'solid', 'flat', 'outline']), dataItemKey: PropTypes.string, groupField: PropTypes.string, groupMode: PropTypes.oneOf([undefined, 'classic', 'modern']), isMultiColumn: PropTypes.bool, suggest: PropTypes.bool, placeholder: PropTypes.string, title: PropTypes.string, allowCustom: PropTypes.bool, clearButton: PropTypes.bool, iconClassName: PropTypes.string, svgIcon: kendo_react_common_1.svgIconPropType, validationMessage: PropTypes.string, required: PropTypes.bool, id: PropTypes.string, ariaLabelledBy: PropTypes.string, ariaDescribedBy: PropTypes.string, list: PropTypes.any, valueRender: PropTypes.func, skipDisabledItems: PropTypes.bool });
753
867
  /** @hidden */
754
- ComboBoxWithoutContext.defaultProps = __assign(__assign({}, DropDownBase_1.default.defaultProps), { size: 'medium', rounded: 'medium', fillMode: 'solid', allowCustom: false, clearButton: true, required: false, groupMode: 'classic', isMultiColumn: false });
868
+ ComboBoxWithoutContext.defaultProps = __assign(__assign({}, DropDownBase_1.default.defaultProps), { size: 'medium', rounded: 'medium', fillMode: 'solid', allowCustom: false, clearButton: true, required: false, groupMode: 'classic', isMultiColumn: false, skipDisabledItems: true });
755
869
  return ComboBoxWithoutContext;
756
870
  }(React.Component));
757
871
  exports.ComboBoxWithoutContext = ComboBoxWithoutContext;
@@ -306,4 +306,8 @@ export interface ComboBoxProps extends FormComponentProps {
306
306
  * Specifies the text that is rendered as title in the adaptive popup.
307
307
  */
308
308
  adaptiveTitle?: string;
309
+ /**
310
+ * Defines if Combobox's disabled items will be skipped or focused when navigating through the list of items using a keyboard. Defaults to `true`.
311
+ */
312
+ skipDisabledItems?: boolean;
309
313
  }
@@ -58,9 +58,6 @@ export declare class DropDownListWithoutContext extends React.Component<DropDown
58
58
  onChange: PropTypes.Requireable<(...args: any[]) => any>;
59
59
  itemRender: PropTypes.Requireable<(...args: any[]) => any>;
60
60
  listNoDataRender: PropTypes.Requireable<(...args: any[]) => any>;
61
- /**
62
- * @hidden
63
- */
64
61
  focusedItemIndex: PropTypes.Requireable<(...args: any[]) => any>;
65
62
  header: PropTypes.Requireable<PropTypes.ReactNodeLike>;
66
63
  footer: PropTypes.Requireable<PropTypes.ReactNodeLike>;
@@ -85,6 +82,7 @@ export declare class DropDownListWithoutContext extends React.Component<DropDown
85
82
  title: PropTypes.Requireable<string>;
86
83
  groupField: PropTypes.Requireable<string>;
87
84
  list: PropTypes.Requireable<any>;
85
+ skipDisabledItems: PropTypes.Requireable<boolean>;
88
86
  };
89
87
  /**
90
88
  * @hidden
@@ -116,6 +114,7 @@ export declare class DropDownListWithoutContext extends React.Component<DropDown
116
114
  private _filterInput;
117
115
  private _valueDuringOnChange;
118
116
  private _navigated;
117
+ private _lastKeypressIsFilter;
119
118
  private _inputId;
120
119
  private itemHeight;
121
120
  private observerResize?;
@@ -171,7 +170,7 @@ export declare class DropDownListWithoutContext extends React.Component<DropDown
171
170
  /**
172
171
  * @hidden
173
172
  */
174
- onNavigate(state: InternalState, keyCode: number): void;
173
+ onNavigate(state: InternalState, keyCode: number, skipItems?: number): void;
175
174
  private componentRef;
176
175
  private dummySelect;
177
176
  private renderAdaptiveListContainer;
@@ -192,12 +191,13 @@ export declare class DropDownListWithoutContext extends React.Component<DropDown
192
191
  private handleListFilterChange;
193
192
  private onPopupOpened;
194
193
  private onPopupClosed;
195
- private focusedIndex;
194
+ private getFocusedIndex;
196
195
  private focusElement;
197
196
  private setValidity;
198
197
  private triggerOnChange;
199
198
  private applyState;
200
199
  private calculateMedia;
200
+ private resetValueIfDisabledItem;
201
201
  }
202
202
  /**
203
203
  * Represents the PropsContext of the `DropDownList` component.