@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
@@ -66,6 +66,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
66
66
  _this._skipFocusEvent = false;
67
67
  _this._filterInput = null;
68
68
  _this._navigated = false;
69
+ _this._lastKeypressIsFilter = false;
69
70
  _this._inputId = (0, kendo_react_common_1.guid)();
70
71
  _this.itemHeight = 0;
71
72
  /**
@@ -141,7 +142,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
141
142
  var opened = _this.props.opened !== undefined ? _this.props.opened : _this.state.opened;
142
143
  var popupSettings = _this.base.getPopupSettings();
143
144
  var translate = "translateY(".concat(vs.translate, "px)");
144
- return (React.createElement(List_1.default, { 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() }));
145
+ return (React.createElement(List_1.default, { 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() }));
145
146
  };
146
147
  _this.onScroll = function (event) {
147
148
  var _a = _this.base, vs = _a.vs, list = _a.list;
@@ -226,7 +227,9 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
226
227
  }
227
228
  };
228
229
  _this.handleKeyDown = function (event) {
229
- 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;
230
+ 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;
231
+ var value = _this.value;
232
+ var selectedIndex = data.findIndex(function (i) { return (0, utils_1.areSame)(i, value, dataItemKey); });
230
233
  var opened = _this.props.opened !== undefined ? _this.props.opened : _this.state.opened;
231
234
  var keyCode = event.keyCode;
232
235
  var homeOrEndKeys = keyCode === kendo_react_common_1.Keys.home || keyCode === kendo_react_common_1.Keys.end;
@@ -235,7 +238,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
235
238
  ((event.altKey && keyCode === kendo_react_common_1.Keys.down) || keyCode === kendo_react_common_1.Keys.enter || keyCode === kendo_react_common_1.Keys.space);
236
239
  var shouldClose = opened && ((event.altKey && keyCode === kendo_react_common_1.Keys.up) || keyCode === kendo_react_common_1.Keys.esc);
237
240
  var leftOrRightKeys = leftRightKeysNavigation && (keyCode === kendo_react_common_1.Keys.left || keyCode === kendo_react_common_1.Keys.right);
238
- var shouldNavigate = upOrDownKeys || (!filterable && (leftOrRightKeys || homeOrEndKeys));
241
+ var shouldNavigate = upOrDownKeys || (leftOrRightKeys && !filterable) || homeOrEndKeys;
239
242
  var state = _this.base.initState();
240
243
  state.syntheticEvent = event;
241
244
  if (disabled) {
@@ -262,19 +265,101 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
262
265
  }
263
266
  }
264
267
  else if (opened && keyCode === kendo_react_common_1.Keys.enter) {
265
- var focusedIndex = _this.focusedIndex();
266
- if (focusedIndex !== undefined) {
268
+ var focusedIndex = _this.getFocusedIndex();
269
+ if (focusedIndex !== undefined && focusedIndex !== -1 && data[focusedIndex].disabled) {
270
+ _this.triggerOnChange(null, state);
271
+ _this.applyState(state);
272
+ }
273
+ else {
267
274
  _this.handleItemSelect(focusedIndex, state);
268
275
  }
269
276
  _this.base.togglePopup(state);
270
277
  event.preventDefault();
271
278
  }
272
279
  else if (shouldOpen || shouldClose) {
280
+ if (shouldClose) {
281
+ _this.resetValueIfDisabledItem();
282
+ }
273
283
  _this.base.togglePopup(state);
274
284
  event.preventDefault();
275
285
  }
276
286
  else if (shouldNavigate) {
277
- _this.onNavigate(state, keyCode);
287
+ _this._lastKeypressIsFilter = false;
288
+ if (groupField !== '' && textField) {
289
+ if (!_this.props.skipDisabledItems && opened) {
290
+ _this.onNavigate(state, keyCode);
291
+ }
292
+ else {
293
+ var newIndex = undefined;
294
+ if (keyCode === kendo_react_common_1.Keys.down || keyCode === kendo_react_common_1.Keys.right) {
295
+ var tempnewIndex_1 = data.slice(selectedIndex + 1).find(function (i) { return !i.disabled && i[textField]; });
296
+ newIndex = tempnewIndex_1 && data.findIndex(function (el) { return el[textField] === tempnewIndex_1[textField]; });
297
+ }
298
+ else if (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.left) {
299
+ var dataToSearch = void 0;
300
+ if (selectedIndex === 0 && defaultItem) {
301
+ newIndex = -1;
302
+ }
303
+ else if (selectedIndex === -1) {
304
+ dataToSearch = data;
305
+ newIndex = data.findIndex(function (i) { return !i.disabled && i[textField]; });
306
+ }
307
+ else {
308
+ dataToSearch = data.slice(0, selectedIndex);
309
+ var tempnewIndex_2 = dataToSearch.pop();
310
+ while (tempnewIndex_2 && tempnewIndex_2.disabled) {
311
+ tempnewIndex_2 = dataToSearch.pop();
312
+ }
313
+ newIndex = tempnewIndex_2 && data.findIndex(function (el) { return el[textField] === tempnewIndex_2[textField]; });
314
+ }
315
+ }
316
+ if (newIndex !== undefined) {
317
+ var skipItems = newIndex - selectedIndex;
318
+ _this.onNavigate(state, keyCode, skipItems);
319
+ }
320
+ else if (newIndex === undefined && data.findIndex(function (el) { return el[textField] === value[textField]; }) === data.length - 1) {
321
+ _this.onNavigate(state, keyCode);
322
+ }
323
+ }
324
+ }
325
+ else if (!_this.props.skipDisabledItems && opened || homeOrEndKeys) {
326
+ _this.onNavigate(state, keyCode);
327
+ }
328
+ else if (textField) {
329
+ var newIndex = undefined;
330
+ if (keyCode === kendo_react_common_1.Keys.down || keyCode === kendo_react_common_1.Keys.right) {
331
+ var tempnewIndex_3 = data.slice(selectedIndex + 1).find(function (i) { return !i.disabled && i[textField]; });
332
+ newIndex = tempnewIndex_3 && data.findIndex(function (el) { return el[textField] === tempnewIndex_3[textField]; });
333
+ }
334
+ else if (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.left) {
335
+ var dataTest = void 0;
336
+ if (selectedIndex === 0 && defaultItem) {
337
+ newIndex = -1;
338
+ }
339
+ else if (selectedIndex === -1) {
340
+ dataTest = data;
341
+ newIndex = data.find(function (i) { return !i.disabled && i[textField]; });
342
+ }
343
+ else {
344
+ dataTest = data.slice(0, selectedIndex);
345
+ var tempnewIndex_4 = dataTest.pop();
346
+ while (tempnewIndex_4 && tempnewIndex_4.disabled) {
347
+ tempnewIndex_4 = dataTest.pop();
348
+ }
349
+ newIndex = tempnewIndex_4 && data.findIndex(function (el) { return el[textField] === tempnewIndex_4[textField]; });
350
+ }
351
+ }
352
+ if (newIndex !== undefined) {
353
+ var skipItems = newIndex - selectedIndex;
354
+ _this.onNavigate(state, keyCode, skipItems);
355
+ }
356
+ else if (newIndex === undefined && data.findIndex(function (el) { return el[textField] === value[textField]; }) === data.length - 1) {
357
+ _this.onNavigate(state, keyCode);
358
+ }
359
+ }
360
+ else {
361
+ _this.onNavigate(state, keyCode);
362
+ }
278
363
  event.preventDefault();
279
364
  }
280
365
  _this.applyState(state);
@@ -301,6 +386,9 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
301
386
  state.syntheticEvent = event;
302
387
  state.data.focused = false;
303
388
  state.events.push({ type: 'onBlur' });
389
+ if (opened) {
390
+ _this.resetValueIfDisabledItem();
391
+ }
304
392
  if (opened && !renderAdaptive) {
305
393
  _this.base.togglePopup(state);
306
394
  }
@@ -322,6 +410,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
322
410
  if (!_this.state.focused) {
323
411
  state.data.focused = true;
324
412
  }
413
+ _this.resetValueIfDisabledItem();
325
414
  _this.base.togglePopup(state);
326
415
  _this.applyState(state);
327
416
  };
@@ -349,6 +438,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
349
438
  state.data.text = event.target.value;
350
439
  }
351
440
  _this.base.filterChanged(event.target.value, state);
441
+ _this._lastKeypressIsFilter = true;
352
442
  _this.applyState(state);
353
443
  _this.setState({ group: undefined });
354
444
  };
@@ -497,7 +587,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
497
587
  */
498
588
  DropDownListWithoutContext.prototype.componentDidUpdate = function (prevProps, prevState) {
499
589
  var _a;
500
- var _b = this.props, dataItemKey = _b.dataItemKey, virtual = _b.virtual, _c = _b.groupField, groupField = _c === void 0 ? '' : _c;
590
+ var _b = this.props, dataItemKey = _b.dataItemKey, virtual = _b.virtual, _c = _b.groupField, groupField = _c === void 0 ? '' : _c, textField = _b.textField;
501
591
  var _d = this.props.data, data = _d === void 0 ? [] : _d;
502
592
  var prevTotal = prevProps.virtual ? prevProps.virtual.total : 0;
503
593
  var opened = this.props.opened !== undefined ? this.props.opened : this.state.opened;
@@ -520,8 +610,8 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
520
610
  var selectedItem_1 = this.value;
521
611
  var prevSelectedItem = prevProps.value !== undefined ? prevProps.value : prevState.value;
522
612
  var selectedItemIndex = data.findIndex(function (i) { return (0, utils_1.areSame)(i, selectedItem_1, dataItemKey); });
523
- if (groupField !== '') {
524
- selectedItemIndex = (_a = this.base.getGroupedDataModernMode(data, groupField)) === null || _a === void 0 ? void 0 : _a.indexOf(selectedItem_1);
613
+ if (groupField !== '' && selectedItem_1 && textField) {
614
+ selectedItemIndex = (_a = this.base.getGroupedDataModernMode(data, groupField)) === null || _a === void 0 ? void 0 : _a.map(function (el) { return el[textField]; }).indexOf(selectedItem_1[textField]);
525
615
  }
526
616
  var selectedItemChanged = !(0, utils_1.areSame)(prevSelectedItem, selectedItem_1, dataItemKey);
527
617
  if (opening && virtual) {
@@ -627,7 +717,7 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
627
717
  /**
628
718
  * @hidden
629
719
  */
630
- DropDownListWithoutContext.prototype.onNavigate = function (state, keyCode) {
720
+ DropDownListWithoutContext.prototype.onNavigate = function (state, keyCode, skipItems) {
631
721
  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;
632
722
  var vs = this.base.vs;
633
723
  var value = this.value;
@@ -636,7 +726,8 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
636
726
  current: virtual.skip + index,
637
727
  max: (vs.enabled ? virtual.total : data.length) - 1,
638
728
  min: defaultItem !== undefined ? -1 : 0,
639
- keyCode: keyCode
729
+ keyCode: keyCode,
730
+ skipItems: skipItems ? skipItems : undefined
640
731
  });
641
732
  if (newIndex !== undefined) {
642
733
  this.handleItemSelect(newIndex, state);
@@ -681,18 +772,24 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
681
772
  this.renderList()),
682
773
  footer && React.createElement("div", { className: "k-list-footer" }, footer)))));
683
774
  };
684
- DropDownListWithoutContext.prototype.focusedIndex = function () {
685
- var filterText = (0, utils_1.isPresent)(this.props.filter) ? this.props.filter : this.state.text;
686
- 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;
775
+ DropDownListWithoutContext.prototype.getFocusedIndex = function () {
687
776
  var value = this.value;
688
- var selectedIndex = data.findIndex(function (i) { return (0, utils_1.areSame)(i, value, dataItemKey); });
689
- var hasSelected = !(selectedIndex < 0 && !this.props.defaultItem);
690
- if (!hasSelected && filterText && virtual.skip === 0) {
691
- return focusedItemIndex ? focusedItemIndex(data, filterText, textField) :
692
- data.indexOf((0, utils_1.getFocusedItem)(data, filterText, textField));
777
+ 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, filterable = _a.filterable, _e = _a.skipDisabledItems, skipDisabledItems = _e === void 0 ? true : _e;
778
+ var text = this.props.filter ? this.props.filter : this.state.text;
779
+ if (skipDisabledItems && textField && !text && !value) {
780
+ return data.findIndex(function (i) { return !i.disabled && i[textField]; });
781
+ }
782
+ else if ((0, utils_1.isPresent)(value) && text === undefined || filterable && text === '') {
783
+ return data.findIndex(function (i) { return (0, utils_1.areSame)(i, value, dataItemKey); });
784
+ }
785
+ else if (text) {
786
+ if (this._lastKeypressIsFilter) {
787
+ return focusedItemIndex(data, text, textField);
788
+ }
789
+ return data.findIndex(function (i) { return (0, utils_1.areSame)(i, value, dataItemKey); });
693
790
  }
694
791
  else {
695
- return !hasSelected && virtual.skip === 0 ? 0 : undefined;
792
+ return virtual.skip === 0 ? 0 : -1;
696
793
  }
697
794
  };
698
795
  DropDownListWithoutContext.prototype.focusElement = function (element) {
@@ -723,11 +820,20 @@ var DropDownListWithoutContext = /** @class */ (function (_super) {
723
820
  ;
724
821
  };
725
822
  ;
823
+ DropDownListWithoutContext.prototype.resetValueIfDisabledItem = function () {
824
+ var data = this.props.data;
825
+ var state = this.base.initState();
826
+ var focusedIndex = this.getFocusedIndex();
827
+ if (focusedIndex !== undefined && focusedIndex !== -1 && data && data[focusedIndex].disabled) {
828
+ this.triggerOnChange(null, state);
829
+ this.applyState(state);
830
+ }
831
+ };
726
832
  DropDownListWithoutContext.displayName = 'DropDownList';
727
833
  /**
728
834
  * @hidden
729
835
  */
730
- DropDownListWithoutContext.propTypes = __assign({ delay: PropTypes.number, ignoreCase: PropTypes.bool, iconClassName: PropTypes.string, svgIcon: kendo_react_common_1.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_1.default.propTypes);
836
+ DropDownListWithoutContext.propTypes = __assign({ delay: PropTypes.number, ignoreCase: PropTypes.bool, iconClassName: PropTypes.string, svgIcon: kendo_react_common_1.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_1.default.propTypes);
731
837
  /**
732
838
  * @hidden
733
839
  */
@@ -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
  }
@@ -118,7 +118,8 @@ exports.MultiColumnComboBox = React.forwardRef(function (directProps, ref) {
118
118
  'k-table-alt-row': liProps.index % 2 !== 0,
119
119
  'k-focus': liProps.focused,
120
120
  'k-selected': liProps.selected,
121
- 'k-first': Boolean(group)
121
+ 'k-first': Boolean(group),
122
+ 'k-disabled': liProps.dataItem.disabled
122
123
  }) }), children);
123
124
  return props.itemRender ? props.itemRender.call(undefined, rendering, liProps) : rendering;
124
125
  }, [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 */
@@ -212,9 +212,11 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
212
212
  _this.applyState(state);
213
213
  };
214
214
  _this.onInputKeyDown = function (event) {
215
+ var _a = _this.props, _b = _a.data, data = _b === void 0 ? [] : _b, textField = _a.textField, groupField = _a.groupField;
215
216
  var keyCode = event.keyCode;
216
217
  var text = _this.props.filter !== undefined ? _this.props.filter : _this.state.text;
217
- var focusedItem = _this.getFocusedState().focusedItem;
218
+ var opened = _this.props.opened !== undefined ? _this.props.opened : _this.state.opened;
219
+ var _c = _this.getFocusedState(), focusedItem = _c.focusedItem, focusedIndex = _c.focusedIndex;
218
220
  var state = _this.base.initState();
219
221
  state.syntheticEvent = event;
220
222
  if (!text && _this.value.length > 0 &&
@@ -233,14 +235,74 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
233
235
  togglePopup();
234
236
  }
235
237
  else if (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.down) {
238
+ if (groupField !== '' && textField) {
239
+ if (!_this.props.skipDisabledItems && opened) {
240
+ _this.onNavigate(state, keyCode);
241
+ }
242
+ else {
243
+ var newIndex = 0;
244
+ if (keyCode === kendo_react_common_1.Keys.down || keyCode === kendo_react_common_1.Keys.right) {
245
+ var tempnewIndex_1 = data.slice(focusedIndex + 1).find(function (i) { return !i.disabled && i[textField]; });
246
+ newIndex = tempnewIndex_1 && data.findIndex(function (el) { return el[textField] === tempnewIndex_1[textField]; });
247
+ }
248
+ else if (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.left) {
249
+ var dataToSearch = void 0;
250
+ if (focusedIndex === -1) {
251
+ dataToSearch = data;
252
+ newIndex = data.findIndex(function (i) { return !i.disabled && i[textField]; });
253
+ }
254
+ else {
255
+ dataToSearch = data.slice(0, focusedIndex);
256
+ var tempnewIndex_2 = dataToSearch.pop();
257
+ while (tempnewIndex_2 && tempnewIndex_2.disabled) {
258
+ tempnewIndex_2 = dataToSearch.pop();
259
+ }
260
+ newIndex = tempnewIndex_2 && data.findIndex(function (el) { return el[textField] === tempnewIndex_2[textField]; });
261
+ }
262
+ }
263
+ if (newIndex) {
264
+ var skipItems = newIndex - focusedIndex;
265
+ _this.onNavigate(state, keyCode, skipItems);
266
+ }
267
+ else if (newIndex !== undefined) {
268
+ _this.onNavigate(state, keyCode);
269
+ }
270
+ }
271
+ }
272
+ else if (!_this.props.skipDisabledItems && opened) {
273
+ _this.onNavigate(state, keyCode);
274
+ }
275
+ else {
276
+ var newIndex = null;
277
+ if (keyCode === kendo_react_common_1.Keys.down || keyCode === kendo_react_common_1.Keys.right) {
278
+ newIndex = data.slice(focusedIndex + 1).find(function (i) { return !i.disabled; });
279
+ }
280
+ else if (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.left) {
281
+ var dataTest = data.slice(0, focusedIndex);
282
+ newIndex = dataTest.pop();
283
+ while (newIndex && newIndex.disabled) {
284
+ newIndex = dataTest.pop();
285
+ }
286
+ }
287
+ if (newIndex) {
288
+ var skipItems = newIndex.id - focusedIndex - 1;
289
+ _this.onNavigate(state, keyCode, skipItems);
290
+ }
291
+ else {
292
+ _this.onNavigate(state, keyCode);
293
+ }
294
+ }
295
+ _this.applyState(state);
236
296
  event.preventDefault();
237
- _this.onNavigate(state, keyCode);
238
297
  }
239
298
  else if (keyCode === kendo_react_common_1.Keys.enter) {
240
299
  event.preventDefault();
241
300
  if (_this.props.allowCustom && text && focusedItem === null) {
242
301
  _this.customItemSelect(event);
243
302
  }
303
+ else if (focusedItem.disabled) {
304
+ togglePopup();
305
+ }
244
306
  else {
245
307
  _this.selectFocusedItem(event);
246
308
  }
@@ -685,7 +747,7 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
685
747
  }
686
748
  };
687
749
  /** @hidden */
688
- MultiSelectWithoutContext.prototype.onNavigate = function (state, keyCode) {
750
+ MultiSelectWithoutContext.prototype.onNavigate = function (state, keyCode, skipItems) {
689
751
  var _a = this.props, allowCustom = _a.allowCustom, _b = _a.data, data = _b === void 0 ? [] : _b;
690
752
  var text = this.props.filter !== undefined ? this.props.filter : this.state.text;
691
753
  var _c = this.getFocusedState(), focusedType = _c.focusedType, focusedIndex = _c.focusedIndex;
@@ -703,7 +765,8 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
703
765
  keyCode: keyCode,
704
766
  current: focusedIndex,
705
767
  max: (vs.enabled ? vs.total : data.length) - 1,
706
- min: customItem ? -1 : 0
768
+ min: customItem ? -1 : 0,
769
+ skipItems: skipItems ? skipItems : undefined
707
770
  });
708
771
  if (newFocused !== undefined) {
709
772
  this.itemFocus(newFocused, state);
@@ -830,9 +893,9 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
830
893
  this.setItems(items, this._valueItemsDuringOnChange);
831
894
  state.events.push({ type: 'onChange' });
832
895
  };
833
- MultiSelectWithoutContext.prototype.selectFocusedItem = function (event) {
896
+ MultiSelectWithoutContext.prototype.selectFocusedItem = function (event, itemtoSelect) {
834
897
  var _a = this.props, _b = _a.data, data = _b === void 0 ? [] : _b, virtual = _a.virtual;
835
- var focusedIndex = this.getFocusedState().focusedIndex;
898
+ var focusedIndex = (itemtoSelect || this.getFocusedState()).focusedIndex;
836
899
  var skip = virtual ? virtual.skip : 0;
837
900
  if (data[focusedIndex - skip] !== undefined) {
838
901
  this.handleItemClick(focusedIndex, event);
@@ -845,7 +908,7 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
845
908
  MultiSelectWithoutContext.prototype.getFocusedState = function () {
846
909
  var focusedIndex = this.state.focusedIndex;
847
910
  var text = this.props.filter !== undefined ? this.props.filter : this.state.text;
848
- 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 ? utils_1.itemIndexStartsWith : _c;
911
+ 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 ? utils_1.itemIndexStartsWith : _c, skipDisabledItems = _a.skipDisabledItems;
849
912
  var skip = (virtual && virtual.skip) || 0;
850
913
  var focusedInd;
851
914
  if (focusedIndex !== undefined) {
@@ -879,6 +942,14 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
879
942
  }
880
943
  return { focusedType: FocusedItemType.None, focusedIndex: -1 };
881
944
  }
945
+ else if (skipDisabledItems && textField && !text && skip === 0) {
946
+ var newIndex = data.findIndex(function (i) { return !i.disabled && i[textField]; });
947
+ return {
948
+ focusedIndex: newIndex,
949
+ focusedItem: data[newIndex - skip],
950
+ focusedType: FocusedItemType.ListItem
951
+ };
952
+ }
882
953
  return skip === 0 ?
883
954
  { focusedItem: data[0], focusedIndex: 0, focusedType: FocusedItemType.ListItem } :
884
955
  { focusedType: FocusedItemType.None, focusedIndex: -1 };
@@ -906,9 +977,9 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
906
977
  MultiSelectWithoutContext.propTypes = __assign(__assign({}, DropDownBase_1.default.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({
907
978
  text: PropTypes.string,
908
979
  data: PropTypes.arrayOf(PropTypes.any)
909
- })), 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 });
980
+ })), 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 });
910
981
  /** @hidden */
911
- MultiSelectWithoutContext.defaultProps = __assign(__assign({}, DropDownBase_1.default.defaultProps), { autoClose: true, required: false, size: 'medium', rounded: 'medium', fillMode: 'solid', groupMode: 'modern' });
982
+ MultiSelectWithoutContext.defaultProps = __assign(__assign({}, DropDownBase_1.default.defaultProps), { autoClose: true, required: false, size: 'medium', rounded: 'medium', fillMode: 'solid', groupMode: 'modern', skipDisabledItems: true });
912
983
  return MultiSelectWithoutContext;
913
984
  }(React.Component));
914
985
  exports.MultiSelectWithoutContext = 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
  }
@@ -37,7 +37,7 @@ var List = /** @class */ (function (_super) {
37
37
  return data.map(function (item, index) {
38
38
  var realIndex = skip + index;
39
39
  var idIndex = skip + index + groupCounter;
40
- var selected = highlightSelected &&
40
+ var selected = item.disabled ? false : highlightSelected &&
41
41
  ((!isArray && (0, utils_1.areSame)(item, value, valueField)) ||
42
42
  (isArray && value.findIndex(function (i) { return (0, utils_1.areSame)(i, item, valueField); }) !== -1));
43
43
  var group = undefined;
@@ -52,7 +52,7 @@ var List = /** @class */ (function (_super) {
52
52
  group !== undefined && groupMode === 'modern' ? groupCounter += 1 : '';
53
53
  return [
54
54
  group !== undefined && groupMode === 'modern' && React.createElement(ListGroupItem_1.default, { id: "option-".concat(optionsGuid, "-").concat(idIndex), virtual: virtual, key: realIndex + '-group-item', group: group, isMultiColumn: isMultiColumn, render: groupHeaderItemRender }),
55
- React.createElement(ListItem_1.default, { 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 })
55
+ React.createElement(ListItem_1.default, { 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 })
56
56
  ];
57
57
  });
58
58
  };
@@ -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
  */
@@ -30,11 +30,12 @@ var ListItem = /** @class */ (function (_super) {
30
30
  return _this;
31
31
  }
32
32
  ListItem.prototype.render = function () {
33
- var _a = this.props, selected = _a.selected, group = _a.group, dataItem = _a.dataItem, virtual = _a.virtual, groupMode = _a.groupMode, renderer = _a.render;
34
- var item = (React.createElement("li", { id: this.props.id, role: "option", "aria-selected": selected, className: (0, kendo_react_common_1.classNames)('k-list-item', {
33
+ 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;
34
+ var item = (React.createElement("li", { id: this.props.id, role: "option", "aria-selected": selected, "aria-disabled": disabled ? true : undefined, className: (0, kendo_react_common_1.classNames)('k-list-item', {
35
35
  'k-selected': selected,
36
36
  'k-focus': this.props.focused,
37
- 'k-first': Boolean(group) && groupMode === 'classic'
37
+ 'k-first': Boolean(group) && groupMode === 'classic',
38
+ 'k-disabled': disabled
38
39
  }), onClick: this.handleClick, style: { position: virtual ? 'relative' : 'unset' } },
39
40
  React.createElement("span", { className: 'k-list-item-text' }, (0, utils_1.getItemValue)(dataItem, this.props.textField).toString()),
40
41
  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
  }
@@ -12,10 +12,10 @@ var Navigation = /** @class */ (function () {
12
12
  Navigation.prototype.navigate = function (args) {
13
13
  var keyCode = args.keyCode;
14
14
  if (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.left) {
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 === kendo_react_common_1.Keys.down || keyCode === kendo_react_common_1.Keys.right) {
18
- return this.next({ current: args.current, min: args.min, max: args.max, step: 1 });
18
+ return this.next({ current: args.current, min: args.min, max: args.max, step: args.skipItems ? args.skipItems : 1 });
19
19
  }
20
20
  else if (keyCode === kendo_react_common_1.Keys.home) {
21
21
  return 0;
@@ -8,7 +8,7 @@ exports.packageMetadata = {
8
8
  name: '@progress/kendo-react-dropdowns',
9
9
  productName: 'KendoReact',
10
10
  productCodes: ['KENDOUIREACT', 'KENDOUICOMPLETE'],
11
- publishDate: 1691491862,
11
+ publishDate: 1691577562,
12
12
  version: '',
13
13
  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'
14
14
  };