@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.
- package/dist/cdn/js/kendo-react-dropdowns.js +1 -1
- package/dist/es/AutoComplete/AutoComplete.d.ts +5 -7
- package/dist/es/AutoComplete/AutoComplete.js +95 -13
- package/dist/es/AutoComplete/AutoCompleteProps.d.ts +4 -0
- package/dist/es/ComboBox/ComboBox.d.ts +7 -1
- package/dist/es/ComboBox/ComboBox.js +137 -23
- package/dist/es/ComboBox/ComboBoxProps.d.ts +4 -0
- package/dist/es/DropDownList/DropDownList.d.ts +5 -5
- package/dist/es/DropDownList/DropDownList.js +128 -22
- package/dist/es/DropDownList/DropDownListProps.d.ts +4 -0
- package/dist/es/MultiColumnComboBox/MultiColumnComboBox.js +2 -1
- package/dist/es/MultiSelect/MultiSelect.d.ts +3 -1
- package/dist/es/MultiSelect/MultiSelect.js +80 -9
- package/dist/es/MultiSelect/MultiSelectProps.d.ts +4 -0
- package/dist/es/common/List.js +2 -2
- package/dist/es/common/ListItem.d.ts +4 -0
- package/dist/es/common/ListItem.js +4 -3
- package/dist/es/common/Navigation.d.ts +1 -0
- package/dist/es/common/Navigation.js +2 -2
- package/dist/es/package-metadata.js +1 -1
- package/dist/npm/AutoComplete/AutoComplete.d.ts +5 -7
- package/dist/npm/AutoComplete/AutoComplete.js +95 -13
- package/dist/npm/AutoComplete/AutoCompleteProps.d.ts +4 -0
- package/dist/npm/ComboBox/ComboBox.d.ts +7 -1
- package/dist/npm/ComboBox/ComboBox.js +137 -23
- package/dist/npm/ComboBox/ComboBoxProps.d.ts +4 -0
- package/dist/npm/DropDownList/DropDownList.d.ts +5 -5
- package/dist/npm/DropDownList/DropDownList.js +127 -21
- package/dist/npm/DropDownList/DropDownListProps.d.ts +4 -0
- package/dist/npm/MultiColumnComboBox/MultiColumnComboBox.js +2 -1
- package/dist/npm/MultiSelect/MultiSelect.d.ts +3 -1
- package/dist/npm/MultiSelect/MultiSelect.js +80 -9
- package/dist/npm/MultiSelect/MultiSelectProps.d.ts +4 -0
- package/dist/npm/common/List.js +2 -2
- package/dist/npm/common/ListItem.d.ts +4 -0
- package/dist/npm/common/ListItem.js +4 -3
- package/dist/npm/common/Navigation.d.ts +1 -0
- package/dist/npm/common/Navigation.js +2 -2
- package/dist/npm/package-metadata.js +1 -1
- package/dist/systemjs/kendo-react-dropdowns.js +1 -1
- 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
|
-
|
|
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
|
-
|
|
417
|
-
|
|
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
|
-
|
|
497
|
-
data.findIndex(function (i) { return (0, utils_1.areSame)(i, _this.state.focusedItem, textField); })
|
|
498
|
-
|
|
499
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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
|
|
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.
|