@progress/kendo-react-dropdowns 5.17.0-dev.202308081128 → 5.17.0-dev.202308101044

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
@@ -35,7 +35,7 @@ import GroupStickyHeader from '../common/GroupStickyHeader';
35
35
  import ListDefaultItem from '../common/ListDefaultItem';
36
36
  import List from '../common/List';
37
37
  import DropDownBase from '../common/DropDownBase';
38
- import { isPresent, getItemValue, sameCharsOnly, shuffleData, matchText, areSame, getFocusedItem } from '../common/utils';
38
+ import { isPresent, getItemValue, sameCharsOnly, shuffleData, matchText, areSame, itemIndexStartsWith } from '../common/utils';
39
39
  import { validatePackage, canUseDOM } from '@progress/kendo-react-common';
40
40
  import { packageMetadata } from '../package-metadata';
41
41
  import { Button } from '@progress/kendo-react-buttons';
@@ -63,6 +63,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
63
63
  _this._skipFocusEvent = false;
64
64
  _this._filterInput = null;
65
65
  _this._navigated = false;
66
+ _this._lastKeypressIsFilter = false;
66
67
  _this._inputId = guid();
67
68
  _this.itemHeight = 0;
68
69
  /**
@@ -138,7 +139,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
138
139
  var opened = _this.props.opened !== undefined ? _this.props.opened : _this.state.opened;
139
140
  var popupSettings = _this.base.getPopupSettings();
140
141
  var translate = "translateY(".concat(vs.translate, "px)");
141
- return (React.createElement(List, { id: _this.base.listBoxId, show: opened, data: data.slice(), focusedIndex: _this.focusedIndex(), value: _this.value, textField: textField, valueField: dataItemKey, optionsGuid: _this.base.guid, groupField: _this.props.groupField, groupMode: 'modern', listRef: function (list) { return vs.list = _this.base.list = list; }, wrapperStyle: { maxHeight: popupSettings.height }, wrapperCssClass: "k-list-content", listStyle: vs.enabled ? { transform: translate } : undefined, key: "listkey", skip: skip, onClick: _this.handleItemClick, itemRender: itemRender, groupHeaderItemRender: groupHeaderItemRender, noDataRender: listNoDataRender, onScroll: _this.onScroll, wrapperRef: vs.scrollerRef, scroller: _this.base.renderScrollElement() }));
142
+ return (React.createElement(List, { id: _this.base.listBoxId, show: opened, data: data.slice(), focusedIndex: _this.getFocusedIndex(), value: _this.value, textField: textField, valueField: dataItemKey, optionsGuid: _this.base.guid, groupField: _this.props.groupField, groupMode: 'modern', listRef: function (list) { return vs.list = _this.base.list = list; }, wrapperStyle: { maxHeight: popupSettings.height }, wrapperCssClass: "k-list-content", listStyle: vs.enabled ? { transform: translate } : undefined, key: "listkey", skip: skip, onClick: _this.handleItemClick, itemRender: itemRender, groupHeaderItemRender: groupHeaderItemRender, noDataRender: listNoDataRender, onScroll: _this.onScroll, wrapperRef: vs.scrollerRef, scroller: _this.base.renderScrollElement() }));
142
143
  };
143
144
  _this.onScroll = function (event) {
144
145
  var _a = _this.base, vs = _a.vs, list = _a.list;
@@ -223,7 +224,9 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
223
224
  }
224
225
  };
225
226
  _this.handleKeyDown = function (event) {
226
- var _a = _this.props, _b = _a.data, data = _b === void 0 ? [] : _b, filterable = _a.filterable, disabled = _a.disabled, _c = _a.leftRightKeysNavigation, leftRightKeysNavigation = _c === void 0 ? true : _c, _d = _a.virtual, virtual = _d === void 0 ? { skip: 0, total: 0, pageSize: 0 } : _d;
227
+ var _a = _this.props, _b = _a.data, data = _b === void 0 ? [] : _b, filterable = _a.filterable, disabled = _a.disabled, defaultItem = _a.defaultItem, _c = _a.leftRightKeysNavigation, leftRightKeysNavigation = _c === void 0 ? true : _c, _d = _a.virtual, virtual = _d === void 0 ? { skip: 0, total: 0, pageSize: 0 } : _d, dataItemKey = _a.dataItemKey, _e = _a.groupField, groupField = _e === void 0 ? '' : _e, textField = _a.textField;
228
+ var value = _this.value;
229
+ var selectedIndex = data.findIndex(function (i) { return areSame(i, value, dataItemKey); });
227
230
  var opened = _this.props.opened !== undefined ? _this.props.opened : _this.state.opened;
228
231
  var keyCode = event.keyCode;
229
232
  var homeOrEndKeys = keyCode === Keys.home || keyCode === Keys.end;
@@ -232,7 +235,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
232
235
  ((event.altKey && keyCode === Keys.down) || keyCode === Keys.enter || keyCode === Keys.space);
233
236
  var shouldClose = opened && ((event.altKey && keyCode === Keys.up) || keyCode === Keys.esc);
234
237
  var leftOrRightKeys = leftRightKeysNavigation && (keyCode === Keys.left || keyCode === Keys.right);
235
- var shouldNavigate = upOrDownKeys || (!filterable && (leftOrRightKeys || homeOrEndKeys));
238
+ var shouldNavigate = upOrDownKeys || (leftOrRightKeys && !filterable) || homeOrEndKeys;
236
239
  var state = _this.base.initState();
237
240
  state.syntheticEvent = event;
238
241
  if (disabled) {
@@ -259,19 +262,101 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
259
262
  }
260
263
  }
261
264
  else if (opened && keyCode === Keys.enter) {
262
- var focusedIndex = _this.focusedIndex();
263
- if (focusedIndex !== undefined) {
265
+ var focusedIndex = _this.getFocusedIndex();
266
+ if (focusedIndex !== undefined && focusedIndex !== -1 && data[focusedIndex].disabled) {
267
+ _this.triggerOnChange(null, state);
268
+ _this.applyState(state);
269
+ }
270
+ else {
264
271
  _this.handleItemSelect(focusedIndex, state);
265
272
  }
266
273
  _this.base.togglePopup(state);
267
274
  event.preventDefault();
268
275
  }
269
276
  else if (shouldOpen || shouldClose) {
277
+ if (shouldClose) {
278
+ _this.resetValueIfDisabledItem();
279
+ }
270
280
  _this.base.togglePopup(state);
271
281
  event.preventDefault();
272
282
  }
273
283
  else if (shouldNavigate) {
274
- _this.onNavigate(state, keyCode);
284
+ _this._lastKeypressIsFilter = false;
285
+ if (groupField !== '' && textField) {
286
+ if (!_this.props.skipDisabledItems && opened) {
287
+ _this.onNavigate(state, keyCode);
288
+ }
289
+ else {
290
+ var newIndex = undefined;
291
+ if (keyCode === Keys.down || keyCode === Keys.right) {
292
+ var tempnewIndex_1 = data.slice(selectedIndex + 1).find(function (i) { return !i.disabled && i[textField]; });
293
+ newIndex = tempnewIndex_1 && data.findIndex(function (el) { return el[textField] === tempnewIndex_1[textField]; });
294
+ }
295
+ else if (keyCode === Keys.up || keyCode === Keys.left) {
296
+ var dataToSearch = void 0;
297
+ if (selectedIndex === 0 && defaultItem) {
298
+ newIndex = -1;
299
+ }
300
+ else if (selectedIndex === -1) {
301
+ dataToSearch = data;
302
+ newIndex = data.findIndex(function (i) { return !i.disabled && i[textField]; });
303
+ }
304
+ else {
305
+ dataToSearch = data.slice(0, selectedIndex);
306
+ var tempnewIndex_2 = dataToSearch.pop();
307
+ while (tempnewIndex_2 && tempnewIndex_2.disabled) {
308
+ tempnewIndex_2 = dataToSearch.pop();
309
+ }
310
+ newIndex = tempnewIndex_2 && data.findIndex(function (el) { return el[textField] === tempnewIndex_2[textField]; });
311
+ }
312
+ }
313
+ if (newIndex !== undefined) {
314
+ var skipItems = newIndex - selectedIndex;
315
+ _this.onNavigate(state, keyCode, skipItems);
316
+ }
317
+ else if (newIndex === undefined && data.findIndex(function (el) { return el[textField] === value[textField]; }) === data.length - 1) {
318
+ _this.onNavigate(state, keyCode);
319
+ }
320
+ }
321
+ }
322
+ else if (!_this.props.skipDisabledItems && opened || homeOrEndKeys) {
323
+ _this.onNavigate(state, keyCode);
324
+ }
325
+ else if (textField) {
326
+ var newIndex = undefined;
327
+ if (keyCode === Keys.down || keyCode === Keys.right) {
328
+ var tempnewIndex_3 = data.slice(selectedIndex + 1).find(function (i) { return !i.disabled && i[textField]; });
329
+ newIndex = tempnewIndex_3 && data.findIndex(function (el) { return el[textField] === tempnewIndex_3[textField]; });
330
+ }
331
+ else if (keyCode === Keys.up || keyCode === Keys.left) {
332
+ var dataTest = void 0;
333
+ if (selectedIndex === 0 && defaultItem) {
334
+ newIndex = -1;
335
+ }
336
+ else if (selectedIndex === -1) {
337
+ dataTest = data;
338
+ newIndex = data.find(function (i) { return !i.disabled && i[textField]; });
339
+ }
340
+ else {
341
+ dataTest = data.slice(0, selectedIndex);
342
+ var tempnewIndex_4 = dataTest.pop();
343
+ while (tempnewIndex_4 && tempnewIndex_4.disabled) {
344
+ tempnewIndex_4 = dataTest.pop();
345
+ }
346
+ newIndex = tempnewIndex_4 && data.findIndex(function (el) { return el[textField] === tempnewIndex_4[textField]; });
347
+ }
348
+ }
349
+ if (newIndex !== undefined) {
350
+ var skipItems = newIndex - selectedIndex;
351
+ _this.onNavigate(state, keyCode, skipItems);
352
+ }
353
+ else if (newIndex === undefined && data.findIndex(function (el) { return el[textField] === value[textField]; }) === data.length - 1) {
354
+ _this.onNavigate(state, keyCode);
355
+ }
356
+ }
357
+ else {
358
+ _this.onNavigate(state, keyCode);
359
+ }
275
360
  event.preventDefault();
276
361
  }
277
362
  _this.applyState(state);
@@ -298,6 +383,9 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
298
383
  state.syntheticEvent = event;
299
384
  state.data.focused = false;
300
385
  state.events.push({ type: 'onBlur' });
386
+ if (opened) {
387
+ _this.resetValueIfDisabledItem();
388
+ }
301
389
  if (opened && !renderAdaptive) {
302
390
  _this.base.togglePopup(state);
303
391
  }
@@ -319,6 +407,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
319
407
  if (!_this.state.focused) {
320
408
  state.data.focused = true;
321
409
  }
410
+ _this.resetValueIfDisabledItem();
322
411
  _this.base.togglePopup(state);
323
412
  _this.applyState(state);
324
413
  };
@@ -346,6 +435,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
346
435
  state.data.text = event.target.value;
347
436
  }
348
437
  _this.base.filterChanged(event.target.value, state);
438
+ _this._lastKeypressIsFilter = true;
349
439
  _this.applyState(state);
350
440
  _this.setState({ group: undefined });
351
441
  };
@@ -494,7 +584,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
494
584
  */
495
585
  DropDownListWithoutContext.prototype.componentDidUpdate = function (prevProps, prevState) {
496
586
  var _a;
497
- var _b = this.props, dataItemKey = _b.dataItemKey, virtual = _b.virtual, _c = _b.groupField, groupField = _c === void 0 ? '' : _c;
587
+ var _b = this.props, dataItemKey = _b.dataItemKey, virtual = _b.virtual, _c = _b.groupField, groupField = _c === void 0 ? '' : _c, textField = _b.textField;
498
588
  var _d = this.props.data, data = _d === void 0 ? [] : _d;
499
589
  var prevTotal = prevProps.virtual ? prevProps.virtual.total : 0;
500
590
  var opened = this.props.opened !== undefined ? this.props.opened : this.state.opened;
@@ -517,8 +607,8 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
517
607
  var selectedItem_1 = this.value;
518
608
  var prevSelectedItem = prevProps.value !== undefined ? prevProps.value : prevState.value;
519
609
  var selectedItemIndex = data.findIndex(function (i) { return areSame(i, selectedItem_1, dataItemKey); });
520
- if (groupField !== '') {
521
- selectedItemIndex = (_a = this.base.getGroupedDataModernMode(data, groupField)) === null || _a === void 0 ? void 0 : _a.indexOf(selectedItem_1);
610
+ if (groupField !== '' && selectedItem_1 && textField) {
611
+ selectedItemIndex = (_a = this.base.getGroupedDataModernMode(data, groupField)) === null || _a === void 0 ? void 0 : _a.map(function (el) { return el[textField]; }).indexOf(selectedItem_1[textField]);
522
612
  }
523
613
  var selectedItemChanged = !areSame(prevSelectedItem, selectedItem_1, dataItemKey);
524
614
  if (opening && virtual) {
@@ -624,7 +714,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
624
714
  /**
625
715
  * @hidden
626
716
  */
627
- DropDownListWithoutContext.prototype.onNavigate = function (state, keyCode) {
717
+ DropDownListWithoutContext.prototype.onNavigate = function (state, keyCode, skipItems) {
628
718
  var _a = this.props, _b = _a.data, data = _b === void 0 ? [] : _b, defaultItem = _a.defaultItem, dataItemKey = _a.dataItemKey, _c = _a.virtual, virtual = _c === void 0 ? { skip: 0, total: 0, pageSize: 0 } : _c;
629
719
  var vs = this.base.vs;
630
720
  var value = this.value;
@@ -633,7 +723,8 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
633
723
  current: virtual.skip + index,
634
724
  max: (vs.enabled ? virtual.total : data.length) - 1,
635
725
  min: defaultItem !== undefined ? -1 : 0,
636
- keyCode: keyCode
726
+ keyCode: keyCode,
727
+ skipItems: skipItems ? skipItems : undefined
637
728
  });
638
729
  if (newIndex !== undefined) {
639
730
  this.handleItemSelect(newIndex, state);
@@ -678,18 +769,24 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
678
769
  this.renderList()),
679
770
  footer && React.createElement("div", { className: "k-list-footer" }, footer)))));
680
771
  };
681
- DropDownListWithoutContext.prototype.focusedIndex = function () {
682
- var filterText = isPresent(this.props.filter) ? this.props.filter : this.state.text;
683
- var _a = this.props, _b = _a.data, data = _b === void 0 ? [] : _b, _c = _a.virtual, virtual = _c === void 0 ? { skip: 0 } : _c, dataItemKey = _a.dataItemKey, textField = _a.textField, focusedItemIndex = _a.focusedItemIndex;
772
+ DropDownListWithoutContext.prototype.getFocusedIndex = function () {
684
773
  var value = this.value;
685
- var selectedIndex = data.findIndex(function (i) { return areSame(i, value, dataItemKey); });
686
- var hasSelected = !(selectedIndex < 0 && !this.props.defaultItem);
687
- if (!hasSelected && filterText && virtual.skip === 0) {
688
- return focusedItemIndex ? focusedItemIndex(data, filterText, textField) :
689
- data.indexOf(getFocusedItem(data, filterText, textField));
774
+ 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 ? itemIndexStartsWith : _d, filterable = _a.filterable, _e = _a.skipDisabledItems, skipDisabledItems = _e === void 0 ? true : _e;
775
+ var text = this.props.filter ? this.props.filter : this.state.text;
776
+ if (skipDisabledItems && textField && !text && !value) {
777
+ return data.findIndex(function (i) { return !i.disabled && i[textField]; });
778
+ }
779
+ else if (isPresent(value) && text === undefined || filterable && text === '') {
780
+ return data.findIndex(function (i) { return areSame(i, value, dataItemKey); });
781
+ }
782
+ else if (text) {
783
+ if (this._lastKeypressIsFilter) {
784
+ return focusedItemIndex(data, text, textField);
785
+ }
786
+ return data.findIndex(function (i) { return areSame(i, value, dataItemKey); });
690
787
  }
691
788
  else {
692
- return !hasSelected && virtual.skip === 0 ? 0 : undefined;
789
+ return virtual.skip === 0 ? 0 : -1;
693
790
  }
694
791
  };
695
792
  DropDownListWithoutContext.prototype.focusElement = function (element) {
@@ -720,11 +817,20 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
720
817
  ;
721
818
  };
722
819
  ;
820
+ DropDownListWithoutContext.prototype.resetValueIfDisabledItem = function () {
821
+ var data = this.props.data;
822
+ var state = this.base.initState();
823
+ var focusedIndex = this.getFocusedIndex();
824
+ if (focusedIndex !== undefined && focusedIndex !== -1 && data && data[focusedIndex].disabled) {
825
+ this.triggerOnChange(null, state);
826
+ this.applyState(state);
827
+ }
828
+ };
723
829
  DropDownListWithoutContext.displayName = 'DropDownList';
724
830
  /**
725
831
  * @hidden
726
832
  */
727
- DropDownListWithoutContext.propTypes = __assign({ delay: PropTypes.number, ignoreCase: PropTypes.bool, iconClassName: PropTypes.string, svgIcon: svgIconPropType, defaultItem: PropTypes.any, valueRender: PropTypes.func, valueMap: PropTypes.func, validationMessage: PropTypes.string, required: PropTypes.bool, id: PropTypes.string, ariaLabelledBy: PropTypes.string, ariaDescribedBy: PropTypes.string, ariaLabel: PropTypes.string, leftRightKeysNavigation: PropTypes.bool, title: PropTypes.string, groupField: PropTypes.string, list: PropTypes.any }, DropDownBase.propTypes);
833
+ DropDownListWithoutContext.propTypes = __assign({ delay: PropTypes.number, ignoreCase: PropTypes.bool, iconClassName: PropTypes.string, svgIcon: svgIconPropType, defaultItem: PropTypes.any, valueRender: PropTypes.func, valueMap: PropTypes.func, validationMessage: PropTypes.string, required: PropTypes.bool, id: PropTypes.string, ariaLabelledBy: PropTypes.string, ariaDescribedBy: PropTypes.string, ariaLabel: PropTypes.string, leftRightKeysNavigation: PropTypes.bool, title: PropTypes.string, groupField: PropTypes.string, list: PropTypes.any, skipDisabledItems: PropTypes.bool }, DropDownBase.propTypes);
728
834
  /**
729
835
  * @hidden
730
836
  */
@@ -319,4 +319,8 @@ export interface DropDownListProps extends FormComponentProps {
319
319
  * @hidden
320
320
  */
321
321
  groupMode?: string;
322
+ /**
323
+ * Defines if DropDownList's disabled items will be skipped or focused when navigating through the list of items using a keyboard. Defaults to `true`.
324
+ */
325
+ skipDisabledItems?: boolean;
322
326
  }
@@ -115,7 +115,8 @@ export var MultiColumnComboBox = React.forwardRef(function (directProps, ref) {
115
115
  'k-table-alt-row': liProps.index % 2 !== 0,
116
116
  'k-focus': liProps.focused,
117
117
  'k-selected': liProps.selected,
118
- 'k-first': Boolean(group)
118
+ 'k-first': Boolean(group),
119
+ 'k-disabled': liProps.dataItem.disabled
119
120
  }) }), children);
120
121
  return props.itemRender ? props.itemRender.call(undefined, rendering, liProps) : rendering;
121
122
  }, [columns, props.groupField, props.itemRender, props.data, skip]);
@@ -42,6 +42,7 @@ export declare class MultiSelectWithoutContext extends React.Component<MultiSele
42
42
  adaptive: PropTypes.Requireable<boolean>;
43
43
  adaptiveTitle: PropTypes.Requireable<string>;
44
44
  onCancel: PropTypes.Requireable<(...args: any[]) => any>;
45
+ skipDisabledItems: PropTypes.Requireable<boolean>;
45
46
  filterable: PropTypes.Requireable<boolean>;
46
47
  filter: PropTypes.Requireable<string>;
47
48
  virtual: PropTypes.Requireable<PropTypes.InferProps<{
@@ -91,6 +92,7 @@ export declare class MultiSelectWithoutContext extends React.Component<MultiSele
91
92
  rounded: "small" | "medium" | "full" | "large" | null | undefined;
92
93
  fillMode: "flat" | "outline" | "solid" | null | undefined;
93
94
  groupMode: string | undefined;
95
+ skipDisabledItems: boolean;
94
96
  popupSettings: {
95
97
  height: string;
96
98
  };
@@ -150,7 +152,7 @@ export declare class MultiSelectWithoutContext extends React.Component<MultiSele
150
152
  /** @hidden */
151
153
  onTagDelete: (itemsToRemove: Array<any>, event: React.MouseEvent<HTMLSpanElement>) => void;
152
154
  /** @hidden */
153
- onNavigate(state: MultiSelectInternalState, keyCode: number): void;
155
+ onNavigate(state: MultiSelectInternalState, keyCode: number, skipItems?: number): void;
154
156
  /** @hidden */
155
157
  itemFocus: (index: number, state: MultiSelectInternalState) => void;
156
158
  /** @hidden */
@@ -209,9 +209,11 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
209
209
  _this.applyState(state);
210
210
  };
211
211
  _this.onInputKeyDown = function (event) {
212
+ var _a = _this.props, _b = _a.data, data = _b === void 0 ? [] : _b, textField = _a.textField, groupField = _a.groupField;
212
213
  var keyCode = event.keyCode;
213
214
  var text = _this.props.filter !== undefined ? _this.props.filter : _this.state.text;
214
- var focusedItem = _this.getFocusedState().focusedItem;
215
+ var opened = _this.props.opened !== undefined ? _this.props.opened : _this.state.opened;
216
+ var _c = _this.getFocusedState(), focusedItem = _c.focusedItem, focusedIndex = _c.focusedIndex;
215
217
  var state = _this.base.initState();
216
218
  state.syntheticEvent = event;
217
219
  if (!text && _this.value.length > 0 &&
@@ -230,14 +232,74 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
230
232
  togglePopup();
231
233
  }
232
234
  else if (keyCode === Keys.up || keyCode === Keys.down) {
235
+ if (groupField !== '' && textField) {
236
+ if (!_this.props.skipDisabledItems && opened) {
237
+ _this.onNavigate(state, keyCode);
238
+ }
239
+ else {
240
+ var newIndex = 0;
241
+ if (keyCode === Keys.down || keyCode === Keys.right) {
242
+ var tempnewIndex_1 = data.slice(focusedIndex + 1).find(function (i) { return !i.disabled && i[textField]; });
243
+ newIndex = tempnewIndex_1 && data.findIndex(function (el) { return el[textField] === tempnewIndex_1[textField]; });
244
+ }
245
+ else if (keyCode === Keys.up || keyCode === Keys.left) {
246
+ var dataToSearch = void 0;
247
+ if (focusedIndex === -1) {
248
+ dataToSearch = data;
249
+ newIndex = data.findIndex(function (i) { return !i.disabled && i[textField]; });
250
+ }
251
+ else {
252
+ dataToSearch = data.slice(0, focusedIndex);
253
+ var tempnewIndex_2 = dataToSearch.pop();
254
+ while (tempnewIndex_2 && tempnewIndex_2.disabled) {
255
+ tempnewIndex_2 = dataToSearch.pop();
256
+ }
257
+ newIndex = tempnewIndex_2 && data.findIndex(function (el) { return el[textField] === tempnewIndex_2[textField]; });
258
+ }
259
+ }
260
+ if (newIndex) {
261
+ var skipItems = newIndex - focusedIndex;
262
+ _this.onNavigate(state, keyCode, skipItems);
263
+ }
264
+ else if (newIndex !== undefined) {
265
+ _this.onNavigate(state, keyCode);
266
+ }
267
+ }
268
+ }
269
+ else if (!_this.props.skipDisabledItems && opened) {
270
+ _this.onNavigate(state, keyCode);
271
+ }
272
+ else {
273
+ var newIndex = null;
274
+ if (keyCode === Keys.down || keyCode === Keys.right) {
275
+ newIndex = data.slice(focusedIndex + 1).find(function (i) { return !i.disabled; });
276
+ }
277
+ else if (keyCode === Keys.up || keyCode === Keys.left) {
278
+ var dataTest = data.slice(0, focusedIndex);
279
+ newIndex = dataTest.pop();
280
+ while (newIndex && newIndex.disabled) {
281
+ newIndex = dataTest.pop();
282
+ }
283
+ }
284
+ if (newIndex) {
285
+ var skipItems = newIndex.id - focusedIndex - 1;
286
+ _this.onNavigate(state, keyCode, skipItems);
287
+ }
288
+ else {
289
+ _this.onNavigate(state, keyCode);
290
+ }
291
+ }
292
+ _this.applyState(state);
233
293
  event.preventDefault();
234
- _this.onNavigate(state, keyCode);
235
294
  }
236
295
  else if (keyCode === Keys.enter) {
237
296
  event.preventDefault();
238
297
  if (_this.props.allowCustom && text && focusedItem === null) {
239
298
  _this.customItemSelect(event);
240
299
  }
300
+ else if (focusedItem.disabled) {
301
+ togglePopup();
302
+ }
241
303
  else {
242
304
  _this.selectFocusedItem(event);
243
305
  }
@@ -682,7 +744,7 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
682
744
  }
683
745
  };
684
746
  /** @hidden */
685
- MultiSelectWithoutContext.prototype.onNavigate = function (state, keyCode) {
747
+ MultiSelectWithoutContext.prototype.onNavigate = function (state, keyCode, skipItems) {
686
748
  var _a = this.props, allowCustom = _a.allowCustom, _b = _a.data, data = _b === void 0 ? [] : _b;
687
749
  var text = this.props.filter !== undefined ? this.props.filter : this.state.text;
688
750
  var _c = this.getFocusedState(), focusedType = _c.focusedType, focusedIndex = _c.focusedIndex;
@@ -700,7 +762,8 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
700
762
  keyCode: keyCode,
701
763
  current: focusedIndex,
702
764
  max: (vs.enabled ? vs.total : data.length) - 1,
703
- min: customItem ? -1 : 0
765
+ min: customItem ? -1 : 0,
766
+ skipItems: skipItems ? skipItems : undefined
704
767
  });
705
768
  if (newFocused !== undefined) {
706
769
  this.itemFocus(newFocused, state);
@@ -827,9 +890,9 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
827
890
  this.setItems(items, this._valueItemsDuringOnChange);
828
891
  state.events.push({ type: 'onChange' });
829
892
  };
830
- MultiSelectWithoutContext.prototype.selectFocusedItem = function (event) {
893
+ MultiSelectWithoutContext.prototype.selectFocusedItem = function (event, itemtoSelect) {
831
894
  var _a = this.props, _b = _a.data, data = _b === void 0 ? [] : _b, virtual = _a.virtual;
832
- var focusedIndex = this.getFocusedState().focusedIndex;
895
+ var focusedIndex = (itemtoSelect || this.getFocusedState()).focusedIndex;
833
896
  var skip = virtual ? virtual.skip : 0;
834
897
  if (data[focusedIndex - skip] !== undefined) {
835
898
  this.handleItemClick(focusedIndex, event);
@@ -842,7 +905,7 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
842
905
  MultiSelectWithoutContext.prototype.getFocusedState = function () {
843
906
  var focusedIndex = this.state.focusedIndex;
844
907
  var text = this.props.filter !== undefined ? this.props.filter : this.state.text;
845
- var _a = this.props, allowCustom = _a.allowCustom, _b = _a.data, data = _b === void 0 ? [] : _b, dataItemKey = _a.dataItemKey, virtual = _a.virtual, textField = _a.textField, _c = _a.focusedItemIndex, focusedItemIndex = _c === void 0 ? itemIndexStartsWith : _c;
908
+ var _a = this.props, allowCustom = _a.allowCustom, _b = _a.data, data = _b === void 0 ? [] : _b, dataItemKey = _a.dataItemKey, virtual = _a.virtual, textField = _a.textField, _c = _a.focusedItemIndex, focusedItemIndex = _c === void 0 ? itemIndexStartsWith : _c, skipDisabledItems = _a.skipDisabledItems;
846
909
  var skip = (virtual && virtual.skip) || 0;
847
910
  var focusedInd;
848
911
  if (focusedIndex !== undefined) {
@@ -876,6 +939,14 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
876
939
  }
877
940
  return { focusedType: FocusedItemType.None, focusedIndex: -1 };
878
941
  }
942
+ else if (skipDisabledItems && textField && !text && skip === 0) {
943
+ var newIndex = data.findIndex(function (i) { return !i.disabled && i[textField]; });
944
+ return {
945
+ focusedIndex: newIndex,
946
+ focusedItem: data[newIndex - skip],
947
+ focusedType: FocusedItemType.ListItem
948
+ };
949
+ }
879
950
  return skip === 0 ?
880
951
  { focusedItem: data[0], focusedIndex: 0, focusedType: FocusedItemType.ListItem } :
881
952
  { focusedType: FocusedItemType.None, focusedIndex: -1 };
@@ -903,9 +974,9 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
903
974
  MultiSelectWithoutContext.propTypes = __assign(__assign({}, DropDownBase.propTypes), { autoClose: PropTypes.bool, value: PropTypes.arrayOf(PropTypes.any), defaultValue: PropTypes.arrayOf(PropTypes.any), dataItemKey: PropTypes.string, placeholder: PropTypes.string, tags: PropTypes.arrayOf(PropTypes.shape({
904
975
  text: PropTypes.string,
905
976
  data: PropTypes.arrayOf(PropTypes.any)
906
- })), tagRender: PropTypes.func, id: PropTypes.string, ariaLabelledBy: PropTypes.string, ariaDescribedBy: PropTypes.string, groupField: PropTypes.string, list: PropTypes.any, adaptive: PropTypes.bool, adaptiveTitle: PropTypes.string, onCancel: PropTypes.func });
977
+ })), tagRender: PropTypes.func, id: PropTypes.string, ariaLabelledBy: PropTypes.string, ariaDescribedBy: PropTypes.string, groupField: PropTypes.string, list: PropTypes.any, adaptive: PropTypes.bool, adaptiveTitle: PropTypes.string, onCancel: PropTypes.func, skipDisabledItems: PropTypes.bool });
907
978
  /** @hidden */
908
- MultiSelectWithoutContext.defaultProps = __assign(__assign({}, DropDownBase.defaultProps), { autoClose: true, required: false, size: 'medium', rounded: 'medium', fillMode: 'solid', groupMode: 'modern' });
979
+ MultiSelectWithoutContext.defaultProps = __assign(__assign({}, DropDownBase.defaultProps), { autoClose: true, required: false, size: 'medium', rounded: 'medium', fillMode: 'solid', groupMode: 'modern', skipDisabledItems: true });
909
980
  return MultiSelectWithoutContext;
910
981
  }(React.Component));
911
982
  export { MultiSelectWithoutContext };
@@ -307,4 +307,8 @@ export interface MultiSelectProps extends FormComponentProps {
307
307
  * Specifies the text that is rendered as title in the adaptive popup.
308
308
  */
309
309
  adaptiveTitle?: string;
310
+ /**
311
+ * Defines if MultiSelect's disabled items will be skipped or focused when navigating through the list of items using a keyboard. Defaults to `true`.
312
+ */
313
+ skipDisabledItems?: boolean;
310
314
  }
@@ -35,7 +35,7 @@ var List = /** @class */ (function (_super) {
35
35
  return data.map(function (item, index) {
36
36
  var realIndex = skip + index;
37
37
  var idIndex = skip + index + groupCounter;
38
- var selected = highlightSelected &&
38
+ var selected = item.disabled ? false : highlightSelected &&
39
39
  ((!isArray && areSame(item, value, valueField)) ||
40
40
  (isArray && value.findIndex(function (i) { return areSame(i, item, valueField); }) !== -1));
41
41
  var group = undefined;
@@ -50,7 +50,7 @@ var List = /** @class */ (function (_super) {
50
50
  group !== undefined && groupMode === 'modern' ? groupCounter += 1 : '';
51
51
  return [
52
52
  group !== undefined && groupMode === 'modern' && React.createElement(ListGroupItem, { id: "option-".concat(optionsGuid, "-").concat(idIndex), virtual: virtual, key: realIndex + '-group-item', group: group, isMultiColumn: isMultiColumn, render: groupHeaderItemRender }),
53
- React.createElement(ListItem, { id: "option-".concat(optionsGuid, "-").concat(group !== undefined && groupMode === 'modern' ? idIndex + 1 : idIndex), virtual: virtual, dataItem: item, groupMode: groupMode, selected: selected, focused: focusedIndex === index, index: realIndex, key: realIndex, onClick: _this.props.onClick, textField: textField, group: group, render: itemRender })
53
+ React.createElement(ListItem, { id: "option-".concat(optionsGuid, "-").concat(group !== undefined && groupMode === 'modern' ? idIndex + 1 : idIndex), virtual: virtual, dataItem: item, groupMode: groupMode, selected: selected, focused: focusedIndex === index, index: realIndex, key: realIndex, onClick: _this.props.onClick, textField: textField, group: group, render: itemRender, disabled: item.disabled })
54
54
  ];
55
55
  });
56
56
  };
@@ -35,6 +35,10 @@ export interface ListItemProps {
35
35
  * Indicates the selected state of the list item element.
36
36
  */
37
37
  selected: boolean;
38
+ /**
39
+ * Indicates the disabled/enabled state of the list item element.
40
+ */
41
+ disabled?: boolean;
38
42
  /**
39
43
  * @hidden
40
44
  */
@@ -28,11 +28,12 @@ var ListItem = /** @class */ (function (_super) {
28
28
  return _this;
29
29
  }
30
30
  ListItem.prototype.render = function () {
31
- var _a = this.props, selected = _a.selected, group = _a.group, dataItem = _a.dataItem, virtual = _a.virtual, groupMode = _a.groupMode, renderer = _a.render;
32
- var item = (React.createElement("li", { id: this.props.id, role: "option", "aria-selected": selected, className: classNames('k-list-item', {
31
+ var _a = this.props, selected = _a.selected, group = _a.group, dataItem = _a.dataItem, virtual = _a.virtual, groupMode = _a.groupMode, disabled = _a.disabled, renderer = _a.render;
32
+ var item = (React.createElement("li", { id: this.props.id, role: "option", "aria-selected": selected, "aria-disabled": disabled ? true : undefined, className: classNames('k-list-item', {
33
33
  'k-selected': selected,
34
34
  'k-focus': this.props.focused,
35
- 'k-first': Boolean(group) && groupMode === 'classic'
35
+ 'k-first': Boolean(group) && groupMode === 'classic',
36
+ 'k-disabled': disabled
36
37
  }), onClick: this.handleClick, style: { position: virtual ? 'relative' : 'unset' } },
37
38
  React.createElement("span", { className: 'k-list-item-text' }, getItemValue(dataItem, this.props.textField).toString()),
38
39
  group !== undefined && groupMode === 'classic' ? React.createElement("div", { className: "k-list-item-group-label" }, group) : null));
@@ -7,6 +7,7 @@ export declare class Navigation {
7
7
  current: number;
8
8
  max: number;
9
9
  min: number;
10
+ skipItems?: number;
10
11
  }): number | undefined;
11
12
  private next;
12
13
  }
@@ -9,10 +9,10 @@ var Navigation = /** @class */ (function () {
9
9
  Navigation.prototype.navigate = function (args) {
10
10
  var keyCode = args.keyCode;
11
11
  if (keyCode === Keys.up || keyCode === Keys.left) {
12
- return this.next({ current: args.current, min: args.min, max: args.max, step: -1 });
12
+ return this.next({ current: args.current, min: args.min, max: args.max, step: args.skipItems ? args.skipItems : -1 });
13
13
  }
14
14
  else if (keyCode === Keys.down || keyCode === Keys.right) {
15
- return this.next({ current: args.current, min: args.min, max: args.max, step: 1 });
15
+ return this.next({ current: args.current, min: args.min, max: args.max, step: args.skipItems ? args.skipItems : 1 });
16
16
  }
17
17
  else if (keyCode === Keys.home) {
18
18
  return 0;
@@ -5,7 +5,7 @@ export var packageMetadata = {
5
5
  name: '@progress/kendo-react-dropdowns',
6
6
  productName: 'KendoReact',
7
7
  productCodes: ['KENDOUIREACT', 'KENDOUICOMPLETE'],
8
- publishDate: 1691492049,
8
+ publishDate: 1691662558,
9
9
  version: '',
10
10
  licensingDocsUrl: 'https://www.telerik.com/kendo-react-ui/my-license/?utm_medium=product&utm_source=kendoreact&utm_campaign=kendo-ui-react-purchase-license-keys-warning'
11
11
  };
@@ -41,6 +41,7 @@ export declare class AutoCompleteWithoutContext extends React.Component<AutoComp
41
41
  ariaLabelledBy: PropTypes.Requireable<string>;
42
42
  ariaDescribedBy: PropTypes.Requireable<string>;
43
43
  list: PropTypes.Requireable<any>;
44
+ skipDisabledItems: PropTypes.Requireable<boolean>;
44
45
  opened: PropTypes.Requireable<boolean>;
45
46
  disabled: PropTypes.Requireable<boolean>;
46
47
  dir: PropTypes.Requireable<string>;
@@ -59,9 +60,7 @@ export declare class AutoCompleteWithoutContext extends React.Component<AutoComp
59
60
  popupClass: PropTypes.Requireable<string>;
60
61
  className: PropTypes.Requireable<string>;
61
62
  appendTo: PropTypes.Requireable<any>;
62
- width: PropTypes.Requireable<NonNullable<string | number | null | undefined>>; /**
63
- * @hidden
64
- */
63
+ width: PropTypes.Requireable<NonNullable<string | number | null | undefined>>;
65
64
  height: PropTypes.Requireable<NonNullable<string | number | null | undefined>>;
66
65
  }>>;
67
66
  onOpen: PropTypes.Requireable<(...args: any[]) => any>;
@@ -82,13 +81,12 @@ export declare class AutoCompleteWithoutContext extends React.Component<AutoComp
82
81
  size: "small" | "medium" | "large" | null | undefined;
83
82
  rounded: "small" | "medium" | "full" | "large" | null | undefined;
84
83
  fillMode: "flat" | "outline" | "solid" | null | undefined;
84
+ skipDisabledItems: boolean;
85
85
  popupSettings: {
86
86
  height: string;
87
87
  };
88
88
  required: boolean;
89
- validityStyles: boolean; /**
90
- * The value of the AutoComplete.
91
- */
89
+ validityStyles: boolean;
92
90
  };
93
91
  /**
94
92
  * @hidden
@@ -158,7 +156,7 @@ export declare class AutoCompleteWithoutContext extends React.Component<AutoComp
158
156
  /**
159
157
  * @hidden
160
158
  */
161
- onNavigate(state: AutoCompleteInternalState, keyCode: number): void;
159
+ onNavigate(state: AutoCompleteInternalState, keyCode: number, skipItems?: number): void;
162
160
  /**
163
161
  * @hidden
164
162
  */