@progress/kendo-react-dropdowns 6.1.0-dev.202311011714 → 6.1.0-dev.202311021101

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.
@@ -108,6 +108,7 @@ export declare class MultiSelectWithoutContext extends React.Component<MultiSele
108
108
  private _input;
109
109
  private _adaptiveInput;
110
110
  private _skipFocusEvent;
111
+ private _lastSelectedOrDeslectedItemIndex;
111
112
  private itemHeight;
112
113
  protected scrollToFocused: boolean;
113
114
  private localization;
@@ -186,6 +187,20 @@ export declare class MultiSelectWithoutContext extends React.Component<MultiSele
186
187
  private applyState;
187
188
  private setValidity;
188
189
  private calculateMedia;
190
+ /**
191
+ * Updates the state of the MultiSelect when the complex keyboard navigation that
192
+ * includes key combinations with the Ctrl/Command, Shift, Home and End keys
193
+ *
194
+ * @param {Array<string | Object>} dataToSet Defines the array of new values that will be applied to the MultiSelect
195
+ * @param {MultiSelectInternalState} state The current state of the MultiSelect
196
+ */
197
+ private updateStateOnKeyboardNavigation;
198
+ /**
199
+ * Returns the last element that was selected or deselected. Needed for the keyboard navigation specifications
200
+ *
201
+ * @param {number} correction A correction is needed depending on if UP or DOWN key is pressed
202
+ */
203
+ private getLastSelectedOrDeselectedIndex;
189
204
  }
190
205
  /**
191
206
  * Represents the PropsContext of the `MultiSelect` component.
@@ -83,6 +83,7 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
83
83
  _this._input = null;
84
84
  _this._adaptiveInput = null;
85
85
  _this._skipFocusEvent = false;
86
+ _this._lastSelectedOrDeslectedItemIndex = null; // Needed for handling the Shift + Up/Down Keyboard Navigation requirement
86
87
  _this.itemHeight = 0;
87
88
  _this.scrollToFocused = false;
88
89
  _this.localization = null;
@@ -98,6 +99,7 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
98
99
  var skip = virtual ? virtual.skip : 0;
99
100
  var dataItem = data[index - skip];
100
101
  var indexInValue = _this.value.findIndex(function (i) { return areSame(i, dataItem, dataItemKey); });
102
+ _this._lastSelectedOrDeslectedItemIndex = data.findIndex(function (i) { return areSame(i, dataItem, dataItemKey); });
101
103
  var newItems = [];
102
104
  if (indexInValue !== -1) { // item is already selected
103
105
  newItems = _this.value;
@@ -206,6 +208,7 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
206
208
  if (_this.state.text) {
207
209
  state.data.text = '';
208
210
  }
211
+ _this._lastSelectedOrDeslectedItemIndex = null; // Resets the last selected/deselected item according to the Keyboard navigation requirements
209
212
  _this.applyState(state);
210
213
  };
211
214
  _this.onInputKeyDown = function (event) {
@@ -219,7 +222,7 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
219
222
  if (!text && _this.value.length > 0 &&
220
223
  (keyCode === Keys.left || keyCode === Keys.right ||
221
224
  keyCode === Keys.home || keyCode === Keys.end ||
222
- keyCode === Keys.delete || keyCode === Keys.backspace)) {
225
+ keyCode === Keys.delete || keyCode === Keys.backspace) && !event.shiftKey) {
223
226
  return _this.onTagsNavigate(event, state);
224
227
  }
225
228
  var togglePopup = function () {
@@ -228,7 +231,74 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
228
231
  _this.applyState(state);
229
232
  };
230
233
  if (_this.opened) {
231
- if (event.altKey && keyCode === Keys.up) {
234
+ if (keyCode === Keys.pageUp) {
235
+ _this.base.scrollPopupByPageSize(-1);
236
+ }
237
+ else if (keyCode === Keys.pageDown) {
238
+ _this.base.scrollPopupByPageSize(1);
239
+ }
240
+ else if ((event.ctrlKey || event.metaKey) && event.code === 'KeyA') {
241
+ // Ctrl or Command + "A" Key selects/deselects all items
242
+ var currentValuesLength = _this.state.value && _this.state.value.length;
243
+ var dataToSet = currentValuesLength === data.length ? [] : data;
244
+ _this.updateStateOnKeyboardNavigation(dataToSet, state);
245
+ }
246
+ else if ((event.ctrlKey || event.metaKey) && event.shiftKey && event.keyCode === Keys.end) {
247
+ // Ctrl or Command + Shift + End from the Keyboard specifications
248
+ var dataToSet = data.slice(_this.getFocusedState().focusedIndex);
249
+ _this.itemFocus(data.length - 1, state);
250
+ _this.updateStateOnKeyboardNavigation(dataToSet, state);
251
+ }
252
+ else if ((event.ctrlKey || event.metaKey) && event.shiftKey && event.keyCode === Keys.home) {
253
+ // Ctrl or Command + Shift + Home from the Keyboard specifications
254
+ var dataToSet = data.slice(0, _this.getFocusedState().focusedIndex + 1);
255
+ _this.itemFocus(0, state);
256
+ _this.updateStateOnKeyboardNavigation(dataToSet, state);
257
+ }
258
+ else if (event.shiftKey && event.keyCode === Keys.up) {
259
+ // Shift + Up from the Keyboard specifications
260
+ var dataToSet = void 0;
261
+ var lastSelectedOrDeselectedIndex = _this.getLastSelectedOrDeselectedIndex(1, focusedIndex);
262
+ if (lastSelectedOrDeselectedIndex === null) {
263
+ dataToSet = focusedIndex !== 0 ? data.slice(focusedIndex - 1, focusedIndex) : [data[focusedIndex]];
264
+ }
265
+ else if (lastSelectedOrDeselectedIndex === focusedIndex) {
266
+ dataToSet = [data[lastSelectedOrDeselectedIndex - 1]];
267
+ }
268
+ else if (focusedIndex >= 0) {
269
+ dataToSet = lastSelectedOrDeselectedIndex > focusedIndex
270
+ ? data.slice(focusedIndex - 1, lastSelectedOrDeselectedIndex)
271
+ : data.slice(lastSelectedOrDeselectedIndex - 1, focusedIndex);
272
+ }
273
+ if (dataToSet && dataToSet.length > 0) {
274
+ if (focusedIndex >= 1) {
275
+ _this.itemFocus(focusedIndex - 1, state);
276
+ }
277
+ _this.updateStateOnKeyboardNavigation(dataToSet, state);
278
+ }
279
+ }
280
+ else if (event.shiftKey && event.keyCode === Keys.down) {
281
+ // Shift + Down from the Keyboard specifications
282
+ var dataToSet = void 0;
283
+ var lastSelectedOrDeselectedIndex = _this.getLastSelectedOrDeselectedIndex(0, focusedIndex);
284
+ if (lastSelectedOrDeselectedIndex === null) {
285
+ dataToSet = focusedIndex !== data.length - 1 ? data.slice(focusedIndex, focusedIndex + 1) : [data[focusedIndex]];
286
+ }
287
+ else if (lastSelectedOrDeselectedIndex === focusedIndex) {
288
+ dataToSet = data.slice(focusedIndex, focusedIndex + 2);
289
+ }
290
+ else if (focusedIndex >= 0) {
291
+ // dataToSet = data.slice(focusedIndex, lastSelectedOrDeselectedIndex);
292
+ dataToSet = lastSelectedOrDeselectedIndex > focusedIndex
293
+ ? data.slice(focusedIndex + 1, lastSelectedOrDeselectedIndex + 1)
294
+ : data.slice(lastSelectedOrDeselectedIndex, focusedIndex + 2);
295
+ }
296
+ if (dataToSet && dataToSet.length >= 1) {
297
+ _this.itemFocus(focusedIndex + 1, state);
298
+ _this.updateStateOnKeyboardNavigation(dataToSet, state);
299
+ }
300
+ }
301
+ else if (event.altKey && keyCode === Keys.up) {
232
302
  togglePopup();
233
303
  }
234
304
  else if (keyCode === Keys.up || keyCode === Keys.down) {
@@ -851,10 +921,10 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
851
921
  newFocusedTag = tags[focusedIndex];
852
922
  }
853
923
  }
854
- else if (keyCode === Keys.home) {
924
+ else if (keyCode === Keys.home && !event.shiftKey) {
855
925
  newFocusedTag = tags[0];
856
926
  }
857
- else if (keyCode === Keys.end) {
927
+ else if (keyCode === Keys.end && !event.shiftKey) {
858
928
  newFocusedTag = tags[tags.length - 1];
859
929
  }
860
930
  else if (keyCode === Keys.delete) {
@@ -969,6 +1039,29 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
969
1039
  ;
970
1040
  };
971
1041
  ;
1042
+ /**
1043
+ * Updates the state of the MultiSelect when the complex keyboard navigation that
1044
+ * includes key combinations with the Ctrl/Command, Shift, Home and End keys
1045
+ *
1046
+ * @param {Array<string | Object>} dataToSet Defines the array of new values that will be applied to the MultiSelect
1047
+ * @param {MultiSelectInternalState} state The current state of the MultiSelect
1048
+ */
1049
+ MultiSelectWithoutContext.prototype.updateStateOnKeyboardNavigation = function (dataToSet, state) {
1050
+ this.setState({ value: dataToSet });
1051
+ this.triggerOnChange(dataToSet, state);
1052
+ this.applyState(state);
1053
+ };
1054
+ /**
1055
+ * Returns the last element that was selected or deselected. Needed for the keyboard navigation specifications
1056
+ *
1057
+ * @param {number} correction A correction is needed depending on if UP or DOWN key is pressed
1058
+ */
1059
+ MultiSelectWithoutContext.prototype.getLastSelectedOrDeselectedIndex = function (correction, focusedIndex) {
1060
+ if (this._lastSelectedOrDeslectedItemIndex === null) {
1061
+ this._lastSelectedOrDeslectedItemIndex = focusedIndex;
1062
+ }
1063
+ return this._lastSelectedOrDeslectedItemIndex !== null ? this._lastSelectedOrDeslectedItemIndex + correction : null;
1064
+ };
972
1065
  MultiSelectWithoutContext.displayName = 'MultiSelect';
973
1066
  /** @hidden */
974
1067
  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({
@@ -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: 1698856370,
8
+ publishDate: 1698920941,
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
  };
@@ -108,6 +108,7 @@ export declare class MultiSelectWithoutContext extends React.Component<MultiSele
108
108
  private _input;
109
109
  private _adaptiveInput;
110
110
  private _skipFocusEvent;
111
+ private _lastSelectedOrDeslectedItemIndex;
111
112
  private itemHeight;
112
113
  protected scrollToFocused: boolean;
113
114
  private localization;
@@ -186,6 +187,20 @@ export declare class MultiSelectWithoutContext extends React.Component<MultiSele
186
187
  private applyState;
187
188
  private setValidity;
188
189
  private calculateMedia;
190
+ /**
191
+ * Updates the state of the MultiSelect when the complex keyboard navigation that
192
+ * includes key combinations with the Ctrl/Command, Shift, Home and End keys
193
+ *
194
+ * @param {Array<string | Object>} dataToSet Defines the array of new values that will be applied to the MultiSelect
195
+ * @param {MultiSelectInternalState} state The current state of the MultiSelect
196
+ */
197
+ private updateStateOnKeyboardNavigation;
198
+ /**
199
+ * Returns the last element that was selected or deselected. Needed for the keyboard navigation specifications
200
+ *
201
+ * @param {number} correction A correction is needed depending on if UP or DOWN key is pressed
202
+ */
203
+ private getLastSelectedOrDeselectedIndex;
189
204
  }
190
205
  /**
191
206
  * Represents the PropsContext of the `MultiSelect` component.
@@ -86,6 +86,7 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
86
86
  _this._input = null;
87
87
  _this._adaptiveInput = null;
88
88
  _this._skipFocusEvent = false;
89
+ _this._lastSelectedOrDeslectedItemIndex = null; // Needed for handling the Shift + Up/Down Keyboard Navigation requirement
89
90
  _this.itemHeight = 0;
90
91
  _this.scrollToFocused = false;
91
92
  _this.localization = null;
@@ -101,6 +102,7 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
101
102
  var skip = virtual ? virtual.skip : 0;
102
103
  var dataItem = data[index - skip];
103
104
  var indexInValue = _this.value.findIndex(function (i) { return (0, utils_1.areSame)(i, dataItem, dataItemKey); });
105
+ _this._lastSelectedOrDeslectedItemIndex = data.findIndex(function (i) { return (0, utils_1.areSame)(i, dataItem, dataItemKey); });
104
106
  var newItems = [];
105
107
  if (indexInValue !== -1) { // item is already selected
106
108
  newItems = _this.value;
@@ -209,6 +211,7 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
209
211
  if (_this.state.text) {
210
212
  state.data.text = '';
211
213
  }
214
+ _this._lastSelectedOrDeslectedItemIndex = null; // Resets the last selected/deselected item according to the Keyboard navigation requirements
212
215
  _this.applyState(state);
213
216
  };
214
217
  _this.onInputKeyDown = function (event) {
@@ -222,7 +225,7 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
222
225
  if (!text && _this.value.length > 0 &&
223
226
  (keyCode === kendo_react_common_1.Keys.left || keyCode === kendo_react_common_1.Keys.right ||
224
227
  keyCode === kendo_react_common_1.Keys.home || keyCode === kendo_react_common_1.Keys.end ||
225
- keyCode === kendo_react_common_1.Keys.delete || keyCode === kendo_react_common_1.Keys.backspace)) {
228
+ keyCode === kendo_react_common_1.Keys.delete || keyCode === kendo_react_common_1.Keys.backspace) && !event.shiftKey) {
226
229
  return _this.onTagsNavigate(event, state);
227
230
  }
228
231
  var togglePopup = function () {
@@ -231,7 +234,74 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
231
234
  _this.applyState(state);
232
235
  };
233
236
  if (_this.opened) {
234
- if (event.altKey && keyCode === kendo_react_common_1.Keys.up) {
237
+ if (keyCode === kendo_react_common_1.Keys.pageUp) {
238
+ _this.base.scrollPopupByPageSize(-1);
239
+ }
240
+ else if (keyCode === kendo_react_common_1.Keys.pageDown) {
241
+ _this.base.scrollPopupByPageSize(1);
242
+ }
243
+ else if ((event.ctrlKey || event.metaKey) && event.code === 'KeyA') {
244
+ // Ctrl or Command + "A" Key selects/deselects all items
245
+ var currentValuesLength = _this.state.value && _this.state.value.length;
246
+ var dataToSet = currentValuesLength === data.length ? [] : data;
247
+ _this.updateStateOnKeyboardNavigation(dataToSet, state);
248
+ }
249
+ else if ((event.ctrlKey || event.metaKey) && event.shiftKey && event.keyCode === kendo_react_common_1.Keys.end) {
250
+ // Ctrl or Command + Shift + End from the Keyboard specifications
251
+ var dataToSet = data.slice(_this.getFocusedState().focusedIndex);
252
+ _this.itemFocus(data.length - 1, state);
253
+ _this.updateStateOnKeyboardNavigation(dataToSet, state);
254
+ }
255
+ else if ((event.ctrlKey || event.metaKey) && event.shiftKey && event.keyCode === kendo_react_common_1.Keys.home) {
256
+ // Ctrl or Command + Shift + Home from the Keyboard specifications
257
+ var dataToSet = data.slice(0, _this.getFocusedState().focusedIndex + 1);
258
+ _this.itemFocus(0, state);
259
+ _this.updateStateOnKeyboardNavigation(dataToSet, state);
260
+ }
261
+ else if (event.shiftKey && event.keyCode === kendo_react_common_1.Keys.up) {
262
+ // Shift + Up from the Keyboard specifications
263
+ var dataToSet = void 0;
264
+ var lastSelectedOrDeselectedIndex = _this.getLastSelectedOrDeselectedIndex(1, focusedIndex);
265
+ if (lastSelectedOrDeselectedIndex === null) {
266
+ dataToSet = focusedIndex !== 0 ? data.slice(focusedIndex - 1, focusedIndex) : [data[focusedIndex]];
267
+ }
268
+ else if (lastSelectedOrDeselectedIndex === focusedIndex) {
269
+ dataToSet = [data[lastSelectedOrDeselectedIndex - 1]];
270
+ }
271
+ else if (focusedIndex >= 0) {
272
+ dataToSet = lastSelectedOrDeselectedIndex > focusedIndex
273
+ ? data.slice(focusedIndex - 1, lastSelectedOrDeselectedIndex)
274
+ : data.slice(lastSelectedOrDeselectedIndex - 1, focusedIndex);
275
+ }
276
+ if (dataToSet && dataToSet.length > 0) {
277
+ if (focusedIndex >= 1) {
278
+ _this.itemFocus(focusedIndex - 1, state);
279
+ }
280
+ _this.updateStateOnKeyboardNavigation(dataToSet, state);
281
+ }
282
+ }
283
+ else if (event.shiftKey && event.keyCode === kendo_react_common_1.Keys.down) {
284
+ // Shift + Down from the Keyboard specifications
285
+ var dataToSet = void 0;
286
+ var lastSelectedOrDeselectedIndex = _this.getLastSelectedOrDeselectedIndex(0, focusedIndex);
287
+ if (lastSelectedOrDeselectedIndex === null) {
288
+ dataToSet = focusedIndex !== data.length - 1 ? data.slice(focusedIndex, focusedIndex + 1) : [data[focusedIndex]];
289
+ }
290
+ else if (lastSelectedOrDeselectedIndex === focusedIndex) {
291
+ dataToSet = data.slice(focusedIndex, focusedIndex + 2);
292
+ }
293
+ else if (focusedIndex >= 0) {
294
+ // dataToSet = data.slice(focusedIndex, lastSelectedOrDeselectedIndex);
295
+ dataToSet = lastSelectedOrDeselectedIndex > focusedIndex
296
+ ? data.slice(focusedIndex + 1, lastSelectedOrDeselectedIndex + 1)
297
+ : data.slice(lastSelectedOrDeselectedIndex, focusedIndex + 2);
298
+ }
299
+ if (dataToSet && dataToSet.length >= 1) {
300
+ _this.itemFocus(focusedIndex + 1, state);
301
+ _this.updateStateOnKeyboardNavigation(dataToSet, state);
302
+ }
303
+ }
304
+ else if (event.altKey && keyCode === kendo_react_common_1.Keys.up) {
235
305
  togglePopup();
236
306
  }
237
307
  else if (keyCode === kendo_react_common_1.Keys.up || keyCode === kendo_react_common_1.Keys.down) {
@@ -854,10 +924,10 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
854
924
  newFocusedTag = tags[focusedIndex];
855
925
  }
856
926
  }
857
- else if (keyCode === kendo_react_common_1.Keys.home) {
927
+ else if (keyCode === kendo_react_common_1.Keys.home && !event.shiftKey) {
858
928
  newFocusedTag = tags[0];
859
929
  }
860
- else if (keyCode === kendo_react_common_1.Keys.end) {
930
+ else if (keyCode === kendo_react_common_1.Keys.end && !event.shiftKey) {
861
931
  newFocusedTag = tags[tags.length - 1];
862
932
  }
863
933
  else if (keyCode === kendo_react_common_1.Keys.delete) {
@@ -972,6 +1042,29 @@ var MultiSelectWithoutContext = /** @class */ (function (_super) {
972
1042
  ;
973
1043
  };
974
1044
  ;
1045
+ /**
1046
+ * Updates the state of the MultiSelect when the complex keyboard navigation that
1047
+ * includes key combinations with the Ctrl/Command, Shift, Home and End keys
1048
+ *
1049
+ * @param {Array<string | Object>} dataToSet Defines the array of new values that will be applied to the MultiSelect
1050
+ * @param {MultiSelectInternalState} state The current state of the MultiSelect
1051
+ */
1052
+ MultiSelectWithoutContext.prototype.updateStateOnKeyboardNavigation = function (dataToSet, state) {
1053
+ this.setState({ value: dataToSet });
1054
+ this.triggerOnChange(dataToSet, state);
1055
+ this.applyState(state);
1056
+ };
1057
+ /**
1058
+ * Returns the last element that was selected or deselected. Needed for the keyboard navigation specifications
1059
+ *
1060
+ * @param {number} correction A correction is needed depending on if UP or DOWN key is pressed
1061
+ */
1062
+ MultiSelectWithoutContext.prototype.getLastSelectedOrDeselectedIndex = function (correction, focusedIndex) {
1063
+ if (this._lastSelectedOrDeslectedItemIndex === null) {
1064
+ this._lastSelectedOrDeslectedItemIndex = focusedIndex;
1065
+ }
1066
+ return this._lastSelectedOrDeslectedItemIndex !== null ? this._lastSelectedOrDeslectedItemIndex + correction : null;
1067
+ };
975
1068
  MultiSelectWithoutContext.displayName = 'MultiSelect';
976
1069
  /** @hidden */
977
1070
  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({
@@ -8,7 +8,7 @@ exports.packageMetadata = {
8
8
  name: '@progress/kendo-react-dropdowns',
9
9
  productName: 'KendoReact',
10
10
  productCodes: ['KENDOUIREACT', 'KENDOUICOMPLETE'],
11
- publishDate: 1698856370,
11
+ publishDate: 1698920941,
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
  };