@progress/kendo-vue-dropdowns 3.11.0-dev.202305230623 → 3.11.0-dev.202305230751

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 (56) hide show
  1. package/dist/cdn/js/kendo-vue-dropdowns.js +1 -1
  2. package/dist/es/AutoComplete/AutoComplete.js +108 -12
  3. package/dist/es/AutoComplete/AutoCompleteProps.d.ts +12 -0
  4. package/dist/es/ComboBox/ComboBox.js +115 -16
  5. package/dist/es/ComboBox/ComboBoxProps.d.ts +12 -0
  6. package/dist/es/DropDownList/DropDownList.js +101 -14
  7. package/dist/es/DropDownList/DropDownListProps.d.ts +12 -0
  8. package/dist/es/MultiSelect/MultiSelect.js +116 -26
  9. package/dist/es/MultiSelect/MultiSelectProps.d.ts +12 -0
  10. package/dist/es/common/DropDownBase.d.ts +2 -0
  11. package/dist/es/common/DropDownBase.js +20 -0
  12. package/dist/es/common/GroupStickyHeader.d.ts +29 -0
  13. package/dist/es/common/GroupStickyHeader.js +59 -0
  14. package/dist/es/common/List.d.ts +2 -0
  15. package/dist/es/common/List.js +53 -25
  16. package/dist/es/common/ListGroupItem.d.ts +41 -0
  17. package/dist/es/common/ListGroupItem.js +71 -0
  18. package/dist/es/common/settings.d.ts +1 -0
  19. package/dist/es/package-metadata.js +1 -1
  20. package/dist/esm/AutoComplete/AutoComplete.js +108 -12
  21. package/dist/esm/AutoComplete/AutoCompleteProps.d.ts +12 -0
  22. package/dist/esm/ComboBox/ComboBox.js +115 -16
  23. package/dist/esm/ComboBox/ComboBoxProps.d.ts +12 -0
  24. package/dist/esm/DropDownList/DropDownList.js +101 -14
  25. package/dist/esm/DropDownList/DropDownListProps.d.ts +12 -0
  26. package/dist/esm/MultiSelect/MultiSelect.js +116 -26
  27. package/dist/esm/MultiSelect/MultiSelectProps.d.ts +12 -0
  28. package/dist/esm/common/DropDownBase.d.ts +2 -0
  29. package/dist/esm/common/DropDownBase.js +20 -0
  30. package/dist/esm/common/GroupStickyHeader.d.ts +29 -0
  31. package/dist/esm/common/GroupStickyHeader.js +59 -0
  32. package/dist/esm/common/List.d.ts +2 -0
  33. package/dist/esm/common/List.js +53 -25
  34. package/dist/esm/common/ListGroupItem.d.ts +41 -0
  35. package/dist/esm/common/ListGroupItem.js +71 -0
  36. package/dist/esm/common/settings.d.ts +1 -0
  37. package/dist/esm/package-metadata.js +1 -1
  38. package/dist/npm/AutoComplete/AutoComplete.js +108 -12
  39. package/dist/npm/AutoComplete/AutoCompleteProps.d.ts +12 -0
  40. package/dist/npm/ComboBox/ComboBox.js +115 -16
  41. package/dist/npm/ComboBox/ComboBoxProps.d.ts +12 -0
  42. package/dist/npm/DropDownList/DropDownList.js +101 -14
  43. package/dist/npm/DropDownList/DropDownListProps.d.ts +12 -0
  44. package/dist/npm/MultiSelect/MultiSelect.js +116 -26
  45. package/dist/npm/MultiSelect/MultiSelectProps.d.ts +12 -0
  46. package/dist/npm/common/DropDownBase.d.ts +2 -0
  47. package/dist/npm/common/DropDownBase.js +20 -0
  48. package/dist/npm/common/GroupStickyHeader.d.ts +29 -0
  49. package/dist/npm/common/GroupStickyHeader.js +66 -0
  50. package/dist/npm/common/List.d.ts +2 -0
  51. package/dist/npm/common/List.js +52 -24
  52. package/dist/npm/common/ListGroupItem.d.ts +41 -0
  53. package/dist/npm/common/ListGroupItem.js +78 -0
  54. package/dist/npm/common/settings.d.ts +1 -0
  55. package/dist/npm/package-metadata.js +1 -1
  56. package/package.json +9 -9
@@ -31,6 +31,7 @@ var ListFilter_1 = require("../common/ListFilter");
31
31
  var ListDefaultItem_1 = require("../common/ListDefaultItem");
32
32
  var List_1 = require("../common/List");
33
33
  var DropDownBase_1 = require("../common/DropDownBase");
34
+ var GroupStickyHeader_1 = require("../common/GroupStickyHeader");
34
35
  var main_1 = require("../messages/main");
35
36
  var kendo_vue_intl_1 = require("@progress/kendo-vue-intl");
36
37
  var utils_1 = require("../common/utils");
@@ -133,6 +134,8 @@ var DropDownListVue2 = {
133
134
  }
134
135
  },
135
136
  itemRender: [String, Function, Object],
137
+ groupHeaderItemRender: [String, Function, Object],
138
+ groupStickyHeaderItemRender: [String, Function, Object],
136
139
  listNoDataRender: [String, Function, Object],
137
140
  focusedItemIndex: Function,
138
141
  header: [String, Function, Object],
@@ -169,6 +172,9 @@ var DropDownListVue2 = {
169
172
  validator: function validator(value) {
170
173
  return ['small', 'medium', 'large'].includes(value);
171
174
  }
175
+ },
176
+ groupField: {
177
+ type: String
172
178
  }
173
179
  },
174
180
  inject: {
@@ -189,7 +195,10 @@ var DropDownListVue2 = {
189
195
  },
190
196
  _skipFocusEvent: false,
191
197
  valueDuringOnChange: {},
192
- _navigated: false
198
+ _navigated: false,
199
+ group: undefined,
200
+ isScrolling: false,
201
+ itemHeight: 0
193
202
  };
194
203
  },
195
204
  watch: {
@@ -240,11 +249,14 @@ var DropDownListVue2 = {
240
249
  this.setValidity();
241
250
  },
242
251
  updated: function updated() {
243
- var _a = this.$props,
244
- _b = _a.dataItems,
245
- dataItems = _b === void 0 ? [] : _b,
246
- dataItemKey = _a.dataItemKey,
247
- virtual = _a.virtual;
252
+ var _a;
253
+ var _b = this.$props,
254
+ _c = _b.dataItems,
255
+ dataItems = _c === void 0 ? [] : _c,
256
+ dataItemKey = _b.dataItemKey,
257
+ virtual = _b.virtual,
258
+ groupField = _b.groupField,
259
+ textField = _b.textField;
248
260
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
249
261
  var prevOpened = this.prevOpened !== undefined ? this.prevOpened : this.prevCurrentOpened;
250
262
  var opening = !prevOpened && opened;
@@ -288,11 +300,19 @@ var DropDownListVue2 = {
288
300
  var selectedItemIndex = dataItems.findIndex(function (i) {
289
301
  return (0, utils_1.areSame)(i, selectedItem_1, dataItemKey);
290
302
  });
303
+ // Needed to calculate the proper item index when in grouping mode
304
+ if (groupField) {
305
+ selectedItemIndex = (_a = this.base.getGroupedDataModernMode(dataItems, groupField)) === null || _a === void 0 ? void 0 : _a.indexOf(selectedItem_1);
306
+ }
291
307
  var selectedItemChanged = !(0, utils_1.areSame)(prevSelectedItem, selectedItem_1, dataItemKey);
292
308
  if (opening && virtual) {
293
309
  this.base.scrollToVirtualItem(virtual, selectedItemIndex);
294
310
  this.prevCurrentOpened = true;
295
311
  } else if (opening && !virtual) {
312
+ // Resets the sticky header group value for scenarios with open/close of component's popup
313
+ if (dataItems && dataItems.length !== 0) {
314
+ this.base.resetGroupStickyHeader(dataItems[0][groupField], this);
315
+ }
296
316
  this.base.scrollToItem(selectedItemIndex);
297
317
  this.prevCurrentOpened = true;
298
318
  } else if (opened && prevOpened && selectedItem_1 && selectedItemChanged && !this._navigated) {
@@ -493,6 +513,9 @@ var DropDownListVue2 = {
493
513
  }
494
514
  },
495
515
  handleKeyDown: function handleKeyDown(event) {
516
+ if (this.isScrolling) {
517
+ this.isScrolling = false;
518
+ }
496
519
  var _a = this.$props,
497
520
  _b = _a.dataItems,
498
521
  dataItems = _b === void 0 ? [] : _b,
@@ -617,6 +640,8 @@ var DropDownListVue2 = {
617
640
  state.data.currentText = event.target.value;
618
641
  }
619
642
  this.base.filterChanged(event.target.value, state);
643
+ // Used to reset the value of the StickyHeader when filtering the data
644
+ state.data.group = undefined;
620
645
  this.applyState(state);
621
646
  },
622
647
  onPopupOpened: function onPopupOpened() {
@@ -688,6 +713,39 @@ var DropDownListVue2 = {
688
713
  },
689
714
  repositionPopup: function repositionPopup() {
690
715
  this.base.repositionPopup();
716
+ },
717
+ onScroll: function onScroll(event) {
718
+ this.isScrolling = true;
719
+ var _a = this.base,
720
+ vs = _a.vs,
721
+ list = _a.list;
722
+ vs.scrollHandler(event);
723
+ var state = this.base.initState();
724
+ var groupField = this.$props.groupField;
725
+ var _b = this.$props.dataItems,
726
+ dataItems = _b === void 0 ? [] : _b;
727
+ if (!groupField || !dataItems.length) {
728
+ return;
729
+ }
730
+ var itemHeight = this.itemHeight = this.itemHeight || (vs.enabled ? vs.itemHeight : list ? list.children[0].offsetHeight : 0);
731
+ var target = event.target;
732
+ var scrollTop = target.scrollTop - vs.skip * itemHeight;
733
+ if (groupField) {
734
+ dataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
735
+ }
736
+ var group = dataItems[0][groupField];
737
+ for (var i = 1; i < dataItems.length; i++) {
738
+ if (itemHeight * i > scrollTop) {
739
+ break;
740
+ }
741
+ if (dataItems[i] && dataItems[i][groupField]) {
742
+ group = dataItems[i][groupField];
743
+ }
744
+ }
745
+ if (group !== this.group) {
746
+ state.data.group = group;
747
+ this.applyState(state);
748
+ }
691
749
  }
692
750
  },
693
751
  render: function render(createElement) {
@@ -805,11 +863,18 @@ var DropDownListVue2 = {
805
863
  };
806
864
  var renderList = function renderList() {
807
865
  var _this2 = this;
808
- var textField = this.$props.textField;
866
+ var _a = this.$props,
867
+ textField = _a.textField,
868
+ groupField = _a.groupField;
869
+ var dataItemsToRender = this.$props.dataItems || [];
809
870
  var itemRender = kendo_vue_common_1.templateRendering.call(this, this.$props.itemRender, kendo_vue_common_1.getListeners.call(this));
871
+ var groupHeaderItemRender = kendo_vue_common_1.templateRendering.call(this, this.$props.groupHeaderItemRender, kendo_vue_common_1.getListeners.call(this));
810
872
  var listNoDataRender = kendo_vue_common_1.templateRendering.call(this, this.$props.listNoDataRender, kendo_vue_common_1.getListeners.call(this));
811
873
  var skip = virtual.skip;
812
874
  var translate = "translateY(".concat(vs.translate, "px)");
875
+ if (groupField) {
876
+ dataItemsToRender = this.base.getGroupedDataModernMode(dataItemsToRender, groupField);
877
+ }
813
878
  return (
814
879
  // @ts-ignore function children
815
880
  h(List_1.List, {
@@ -817,7 +882,7 @@ var DropDownListVue2 = {
817
882
  attrs: this.v3 ? undefined : {
818
883
  id: this.base.listBoxId,
819
884
  show: opened,
820
- dataItems: dataItems.slice(),
885
+ dataItems: dataItemsToRender.slice(),
821
886
  focusedIndex: this.focusedIndex(),
822
887
  value: this.computedValue(),
823
888
  textField: textField,
@@ -832,10 +897,12 @@ var DropDownListVue2 = {
832
897
  } : undefined,
833
898
  skip: skip,
834
899
  itemRender: itemRender,
835
- noDataRender: listNoDataRender
900
+ groupHeaderItemRender: groupHeaderItemRender,
901
+ noDataRender: listNoDataRender,
902
+ groupField: groupField
836
903
  },
837
904
  show: opened,
838
- dataItems: dataItems.slice(),
905
+ dataItems: dataItemsToRender.slice(),
839
906
  focusedIndex: this.focusedIndex(),
840
907
  value: this.computedValue(),
841
908
  textField: textField,
@@ -854,11 +921,13 @@ var DropDownListVue2 = {
854
921
  onListclick: this.handleItemClick,
855
922
  on: this.v3 ? undefined : {
856
923
  "listclick": this.handleItemClick,
857
- "scroll": vs.scrollHandler
924
+ "scroll": this.onScroll
858
925
  },
859
926
  itemRender: itemRender,
927
+ groupHeaderItemRender: groupHeaderItemRender,
860
928
  noDataRender: listNoDataRender,
861
- onScroll: vs.scrollHandler
929
+ groupField: groupField,
930
+ onScroll: this.onScroll
862
931
  }, this.v3 ? function () {
863
932
  return [renderScrollElement.call(_this2)];
864
933
  } : [renderScrollElement.call(_this2)])
@@ -899,6 +968,7 @@ var DropDownListVue2 = {
899
968
  var _a;
900
969
  var headerTemplate = kendo_vue_common_1.templateRendering.call(this, this.$props.header, kendo_vue_common_1.getListeners.call(this));
901
970
  var footerTemplate = kendo_vue_common_1.templateRendering.call(this, this.$props.footer, kendo_vue_common_1.getListeners.call(this));
971
+ var groupStickyHeaderTemplate = kendo_vue_common_1.templateRendering.call(this, this.$props.groupStickyHeaderItemRender, kendo_vue_common_1.getListeners.call(this));
902
972
  var header = kendo_vue_common_1.getTemplate.call(this, {
903
973
  h: h,
904
974
  template: headerTemplate
@@ -908,6 +978,9 @@ var DropDownListVue2 = {
908
978
  template: footerTemplate
909
979
  });
910
980
  var popupWidth = popupSettings.width !== undefined ? popupSettings.width : base.popupWidth;
981
+ if (this.group === undefined && this.$props.groupField !== undefined) {
982
+ this.group = (0, utils_1.getItemValue)(dataItems[0], this.$props.groupField);
983
+ }
911
984
  return (
912
985
  // @ts-ignore function children
913
986
  h(ListContainer_1.ListContainer, {
@@ -943,12 +1016,26 @@ var DropDownListVue2 = {
943
1016
  onClose: this.onPopupClosed,
944
1017
  onBlur: this.handleBlur
945
1018
  }, this.v3 ? function () {
946
- return [renderListFilter.call(_this3), renderDefaultItem.call(_this3), header && h("div", {
1019
+ return [renderListFilter.call(_this3), renderDefaultItem.call(_this3), _this3.group && dataItems.length !== 0 && h(GroupStickyHeader_1.GroupStickyHeader, {
1020
+ group: _this3.group,
1021
+ attrs: _this3.v3 ? undefined : {
1022
+ group: _this3.group,
1023
+ render: groupStickyHeaderTemplate
1024
+ },
1025
+ render: groupStickyHeaderTemplate
1026
+ }), header && h("div", {
947
1027
  "class": "k-list-header"
948
1028
  }, [header]), renderList.call(_this3), footer && h("div", {
949
1029
  "class": "k-list-footer"
950
1030
  }, [footer])];
951
- } : [renderListFilter.call(_this3), renderDefaultItem.call(_this3), header && h("div", {
1031
+ } : [renderListFilter.call(_this3), renderDefaultItem.call(_this3), _this3.group && dataItems.length !== 0 && h(GroupStickyHeader_1.GroupStickyHeader, {
1032
+ group: _this3.group,
1033
+ attrs: _this3.v3 ? undefined : {
1034
+ group: _this3.group,
1035
+ render: groupStickyHeaderTemplate
1036
+ },
1037
+ render: groupStickyHeaderTemplate
1038
+ }), header && h("div", {
952
1039
  "class": "k-list-header"
953
1040
  }, [header]), renderList.call(_this3), footer && h("div", {
954
1041
  "class": "k-list-footer"
@@ -284,4 +284,16 @@ export interface DropDownListProps extends FormComponentProps {
284
284
  * @default `solid`
285
285
  */
286
286
  fillMode?: null | 'solid' | 'outline' | 'flat' | string;
287
+ /**
288
+ * Sets the data item field that represents the start of a group. Applicable to objects data.
289
+ */
290
+ groupField?: string;
291
+ /**
292
+ * Fires when a DropDownList group header item is about to be rendered. Used to override the default appearance of the group's headers.
293
+ */
294
+ groupHeaderItemRender?: any;
295
+ /**
296
+ * Fires when a DropDownList sticky group header item is about to be rendered. Used to override the default appearance of the sticky group header of the component.
297
+ */
298
+ groupStickyHeaderItemRender?: any;
287
299
  }
@@ -39,6 +39,7 @@ var List_1 = require("../common/List");
39
39
  var TagList_1 = require("./TagList");
40
40
  var SearchBar_1 = require("../common/SearchBar");
41
41
  var DropDownBase_1 = require("../common/DropDownBase");
42
+ var GroupStickyHeader_1 = require("../common/GroupStickyHeader");
42
43
  var ClearButton_1 = require("../common/ClearButton");
43
44
  var settings_1 = require("./../common/settings");
44
45
  var utils_1 = require("../common/utils");
@@ -145,6 +146,8 @@ var MultiSelectVue2 = {
145
146
  }
146
147
  },
147
148
  itemRender: [String, Function, Object],
149
+ groupHeaderItemRender: [String, Function, Object],
150
+ groupStickyHeaderItemRender: [String, Function, Object],
148
151
  listNoDataRender: [String, Function, Object],
149
152
  focusedItemIndex: Function,
150
153
  virtual: {
@@ -187,6 +190,9 @@ var MultiSelectVue2 = {
187
190
  validator: function validator(value) {
188
191
  return ['small', 'medium', 'large'].includes(value);
189
192
  }
193
+ },
194
+ groupField: {
195
+ type: String
190
196
  }
191
197
  },
192
198
  // @ts-ignore
@@ -238,7 +244,10 @@ var MultiSelectVue2 = {
238
244
  last: ''
239
245
  },
240
246
  suggested: '',
241
- activedescendant: settings_1.ActiveDescendant.PopupList
247
+ activedescendant: settings_1.ActiveDescendant.PopupList,
248
+ group: undefined,
249
+ isScrolling: false,
250
+ itemHeight: 0
242
251
  };
243
252
  },
244
253
  watch: {
@@ -255,7 +264,13 @@ var MultiSelectVue2 = {
255
264
  }
256
265
  },
257
266
  updated: function updated() {
258
- var virtual = this.$props.virtual;
267
+ var _a;
268
+ var _b = this.$props,
269
+ virtual = _b.virtual,
270
+ _c = _b.groupField,
271
+ groupField = _c === void 0 ? '' : _c,
272
+ _d = _b.dataItems,
273
+ dataItems = _d === void 0 ? [] : _d;
259
274
  var skip = virtual ? virtual.skip : 0;
260
275
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
261
276
  var prevOpened = this.prevOpened !== undefined ? this.prevOpened : this.prevCurrentOpened;
@@ -276,29 +291,38 @@ var MultiSelectVue2 = {
276
291
  if (scrollElement) {
277
292
  this.base.vs.scrollElement = scrollElement;
278
293
  }
279
- if (list && this.dataItems.length) {
294
+ if (list && dataItems.length) {
280
295
  // @ts-ignore
281
296
  this.base.vs.scrollerRef(list.$el);
282
297
  }
283
298
  if (!popupSettings.animate && closing) {
284
299
  this.onPopupClosed();
285
300
  }
286
- if (virtual && this.virtualTotalHasChanged) {
287
- this.base.vs.calcScrollElementHeight();
288
- this.base.vs.reset();
289
- this.virtualTotalHasChanged = false;
290
- } else {
291
- var _a = this.getFocusedState(),
292
- focusedItem = _a.focusedItem,
293
- focusedIndex = _a.focusedIndex;
294
- if (opening && virtual) {
295
- this.base.scrollToVirtualItem(virtual, focusedIndex - skip);
296
- this.prevCurrentOpened = true;
297
- } else if (opening && !virtual) {
298
- this.base.scrollToItem(focusedIndex);
299
- this.prevCurrentOpened = true;
300
- } else if (opened && prevOpened && focusedItem && this.scrollToFocused) {
301
- this.base.scrollToItem(focusedIndex - skip);
301
+ if (!this.isScrolling) {
302
+ if (virtual && this.virtualTotalHasChanged) {
303
+ this.base.vs.calcScrollElementHeight();
304
+ this.base.vs.reset();
305
+ this.virtualTotalHasChanged = false;
306
+ } else {
307
+ var _e = this.getFocusedState(),
308
+ focusedItem = _e.focusedItem,
309
+ focusedIndex = _e.focusedIndex;
310
+ if (groupField !== '') {
311
+ focusedIndex = (_a = this.base.getGroupedDataModernMode(dataItems, groupField)) === null || _a === void 0 ? void 0 : _a.indexOf(focusedItem);
312
+ }
313
+ if (opening && virtual) {
314
+ this.base.scrollToVirtualItem(virtual, focusedIndex - skip);
315
+ this.prevCurrentOpened = true;
316
+ } else if (opening && !virtual) {
317
+ // Resets the sticky header group value for scenarios with open/close of component's popup
318
+ if (dataItems && dataItems.length !== 0) {
319
+ this.base.resetGroupStickyHeader(dataItems[0][groupField], this);
320
+ }
321
+ this.base.scrollToItem(focusedIndex);
322
+ this.prevCurrentOpened = true;
323
+ } else if (opened && prevOpened && focusedItem) {
324
+ this.base.scrollToItem(focusedIndex - skip);
325
+ }
302
326
  }
303
327
  }
304
328
  this.scrollToFocused = false;
@@ -484,6 +508,10 @@ var MultiSelectVue2 = {
484
508
  this.base.togglePopup(state);
485
509
  }
486
510
  this.base.filterChanged(value, state);
511
+ // Resets the value of the StickyHeader when filtering the data or just entering symbols in the input
512
+ if (this.$props.filterable) {
513
+ state.data.group = undefined;
514
+ }
487
515
  this.applyState(state);
488
516
  },
489
517
  clearButtonClick: function clearButtonClick(event) {
@@ -511,6 +539,9 @@ var MultiSelectVue2 = {
511
539
  },
512
540
  onInputKeyDown: function onInputKeyDown(event) {
513
541
  var _this = this;
542
+ if (this.isScrolling) {
543
+ this.isScrolling = false;
544
+ }
514
545
  var keyCode = event.keyCode;
515
546
  var text = this.$props.filter !== undefined ? this.$props.filter : this.currentText;
516
547
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
@@ -800,6 +831,39 @@ var MultiSelectVue2 = {
800
831
  },
801
832
  repositionPopup: function repositionPopup() {
802
833
  this.base.repositionPopup();
834
+ },
835
+ onScroll: function onScroll(event) {
836
+ this.isScrolling = true;
837
+ var _a = this.base,
838
+ vs = _a.vs,
839
+ list = _a.list;
840
+ vs.scrollHandler(event);
841
+ var state = this.base.initState();
842
+ var groupField = this.$props.groupField;
843
+ var _b = this.$props.dataItems,
844
+ dataItems = _b === void 0 ? [] : _b;
845
+ if (!groupField || !dataItems.length) {
846
+ return;
847
+ }
848
+ var itemHeight = this.itemHeight = this.itemHeight || (vs.enabled ? vs.itemHeight : list ? list.children[0].offsetHeight : 0);
849
+ var target = event.target;
850
+ var scrollTop = target.scrollTop - vs.skip * itemHeight;
851
+ if (groupField) {
852
+ dataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
853
+ }
854
+ var group = dataItems[0][groupField];
855
+ for (var i = 1; i < dataItems.length; i++) {
856
+ if (itemHeight * i > scrollTop) {
857
+ break;
858
+ }
859
+ if (dataItems[i] && dataItems[i][groupField]) {
860
+ group = dataItems[i][groupField];
861
+ }
862
+ }
863
+ if (group !== this.group) {
864
+ state.data.group = group;
865
+ this.applyState(state);
866
+ }
803
867
  }
804
868
  },
805
869
  render: function render(createElement) {
@@ -905,14 +969,18 @@ var MultiSelectVue2 = {
905
969
  };
906
970
  var renderList = function renderList() {
907
971
  var _this2 = this;
908
- var _a = this.$props.dataItems,
909
- dataItems = _a === void 0 ? [] : _a;
972
+ var groupField = this.$props.groupField;
973
+ var dataItems = this.$props.dataItems || [];
910
974
  var itemRender = kendo_vue_common_1.templateRendering.call(this, this.$props.itemRender, kendo_vue_common_1.getListeners.call(this));
975
+ var groupHeaderItemRender = kendo_vue_common_1.templateRendering.call(this, this.$props.groupHeaderItemRender, kendo_vue_common_1.getListeners.call(this));
911
976
  var listNoDataRender = kendo_vue_common_1.templateRendering.call(this, this.$props.listNoDataRender, kendo_vue_common_1.getListeners.call(this));
912
977
  var skip = virtual ? virtual.skip : 0;
913
978
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
914
979
  var focusedIndex = this.getFocusedState().focusedIndex;
915
980
  var translate = "translateY(".concat(vs.translate, "px)");
981
+ if (groupField) {
982
+ dataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
983
+ }
916
984
  return (
917
985
  // @ts-ignore function children
918
986
  h(List_1.List, {
@@ -935,7 +1003,9 @@ var MultiSelectVue2 = {
935
1003
  } : undefined,
936
1004
  skip: skip,
937
1005
  itemRender: itemRender,
938
- noDataRender: listNoDataRender
1006
+ groupHeaderItemRender: groupHeaderItemRender,
1007
+ noDataRender: listNoDataRender,
1008
+ groupField: groupField
939
1009
  },
940
1010
  show: opened,
941
1011
  dataItems: dataItems.slice(),
@@ -957,11 +1027,13 @@ var MultiSelectVue2 = {
957
1027
  onListclick: this.handleItemClick,
958
1028
  on: this.v3 ? undefined : {
959
1029
  "listclick": this.handleItemClick,
960
- "scroll": vs.scrollHandler
1030
+ "scroll": this.onScroll
961
1031
  },
962
1032
  itemRender: itemRender,
1033
+ groupHeaderItemRender: groupHeaderItemRender,
963
1034
  noDataRender: listNoDataRender,
964
- onScroll: vs.scrollHandler
1035
+ groupField: groupField,
1036
+ onScroll: this.onScroll
965
1037
  }, this.v3 ? function () {
966
1038
  return [renderScrollElement.call(_this2)];
967
1039
  } : [renderScrollElement.call(_this2)])
@@ -983,6 +1055,7 @@ var MultiSelectVue2 = {
983
1055
  dataItems = _c === void 0 ? [] : _c;
984
1056
  var headerTemplate = kendo_vue_common_1.templateRendering.call(this, this.$props.header, kendo_vue_common_1.getListeners.call(this));
985
1057
  var footerTemplate = kendo_vue_common_1.templateRendering.call(this, this.$props.footer, kendo_vue_common_1.getListeners.call(this));
1058
+ var groupStickyHeaderTemplate = kendo_vue_common_1.templateRendering.call(this, this.$props.groupStickyHeaderItemRender, kendo_vue_common_1.getListeners.call(this));
986
1059
  var header = kendo_vue_common_1.getTemplate.call(this, {
987
1060
  h: h,
988
1061
  template: headerTemplate
@@ -1017,6 +1090,9 @@ var MultiSelectVue2 = {
1017
1090
  float: 'right'
1018
1091
  }
1019
1092
  })])]);
1093
+ if (this.group === undefined && this.$props.groupField !== undefined) {
1094
+ this.group = (0, utils_1.getItemValue)(dataItems[0], this.$props.groupField);
1095
+ }
1020
1096
  return (
1021
1097
  // @ts-ignore function children
1022
1098
  h(ListContainer_1.ListContainer, {
@@ -1054,12 +1130,26 @@ var MultiSelectVue2 = {
1054
1130
  }, this.v3 ? function () {
1055
1131
  return [header && h("div", {
1056
1132
  "class": "k-list-header"
1057
- }, [header]), customItem, renderList.call(_this3), footer && h("div", {
1133
+ }, [header]), customItem, _this3.group && dataItems.length !== 0 && h(GroupStickyHeader_1.GroupStickyHeader, {
1134
+ group: _this3.group,
1135
+ attrs: _this3.v3 ? undefined : {
1136
+ group: _this3.group,
1137
+ render: groupStickyHeaderTemplate
1138
+ },
1139
+ render: groupStickyHeaderTemplate
1140
+ }), renderList.call(_this3), footer && h("div", {
1058
1141
  "class": "k-list-footer"
1059
1142
  }, [footer]), virtual && header];
1060
1143
  } : [header && h("div", {
1061
1144
  "class": "k-list-header"
1062
- }, [header]), customItem, renderList.call(_this3), footer && h("div", {
1145
+ }, [header]), customItem, _this3.group && dataItems.length !== 0 && h(GroupStickyHeader_1.GroupStickyHeader, {
1146
+ group: _this3.group,
1147
+ attrs: _this3.v3 ? undefined : {
1148
+ group: _this3.group,
1149
+ render: groupStickyHeaderTemplate
1150
+ },
1151
+ render: groupStickyHeaderTemplate
1152
+ }), renderList.call(_this3), footer && h("div", {
1063
1153
  "class": "k-list-footer"
1064
1154
  }, [footer]), virtual && header])
1065
1155
  );
@@ -263,4 +263,16 @@ export interface MultiSelectProps extends FormComponentProps {
263
263
  * @default `solid`
264
264
  */
265
265
  fillMode?: null | 'solid' | 'outline' | 'flat' | string;
266
+ /**
267
+ * Sets the data item field that represents the start of a group. Applicable to objects data.
268
+ */
269
+ groupField?: string;
270
+ /**
271
+ * Fires when a MultiSelect group header item is about to be rendered. Used to override the default appearance of the group's headers.
272
+ */
273
+ groupHeaderItemRender?: any;
274
+ /**
275
+ * Fires when a MultiSelect sticky group header item is about to be rendered. Used to override the default appearance of the sticky group header of the component.
276
+ */
277
+ groupStickyHeaderItemRender?: any;
266
278
  }
@@ -82,4 +82,6 @@ export default class DropDownBase {
82
82
  triggerOnPageChange(state: InternalState, skip: number, take: number): void;
83
83
  triggerPageChangeCornerItems(item: any, state: InternalState): void;
84
84
  scrollToVirtualItem: (virtual: VirtualizationSettings, selectedItemIndex: number) => void;
85
+ getGroupedDataModernMode: (data: any[], groupField: string) => any[];
86
+ resetGroupStickyHeader: (groupName: string, that: any) => void;
85
87
  }
@@ -118,6 +118,26 @@ var DropDownBase = /** @class */function () {
118
118
  return vs.enabled = true;
119
119
  }, 10);
120
120
  };
121
+ this.getGroupedDataModernMode = function (data, groupField) {
122
+ var newData = [];
123
+ data.forEach(function (el, index) {
124
+ var _a;
125
+ if (data[index - 1] && el[groupField] !== data[index - 1][groupField]) {
126
+ newData.push((_a = {}, _a[groupField] = el[groupField], _a));
127
+ newData.push(data[index]);
128
+ } else {
129
+ newData.push(data[index]);
130
+ }
131
+ });
132
+ return newData;
133
+ };
134
+ this.resetGroupStickyHeader = function (groupName, that) {
135
+ var state = _this.initState();
136
+ if (groupName !== that.group && that.state) {
137
+ that.state.data.group = groupName;
138
+ _this.applyState(state);
139
+ }
140
+ };
121
141
  (0, kendo_vue_common_1.validatePackage)(package_metadata_1.packageMetadata);
122
142
  this.listBoxId = (0, kendo_vue_common_1.guid)();
123
143
  this.guid = (0, kendo_vue_common_1.guid)();
@@ -0,0 +1,29 @@
1
+ import { DefineComponent, RecordPropsDefinition, ComponentOptions, Vue2type } from '../additionalTypes';
2
+ declare type DefaultData<V> = object | ((this: V) => {});
3
+ declare type DefaultMethods<V> = {
4
+ [key: string]: (this: V, ...args: any[]) => any;
5
+ };
6
+ /**
7
+ * Represents the props of the GroupStickyHeader component.
8
+ */
9
+ export interface GroupStickyHeaderProps {
10
+ /**
11
+ * The group that will be rendered.
12
+ */
13
+ group?: string;
14
+ /**
15
+ * Fires when a sticky group header item is about to be rendered. Used to override the default appearance of the sticky group header of the component.
16
+ */
17
+ render?: any;
18
+ }
19
+ export interface GroupStickyHeaderAll extends Vue2type {
20
+ }
21
+ /**
22
+ * @hidden
23
+ */
24
+ declare let GroupStickyHeaderVue2: ComponentOptions<Vue2type, DefaultData<{}>, DefaultMethods<{}>, {}, RecordPropsDefinition<GroupStickyHeaderProps>>;
25
+ /**
26
+ * @hidden
27
+ */
28
+ declare const GroupStickyHeader: DefineComponent<GroupStickyHeaderProps, any, {}, {}, {}, {}, {}, {}, string, GroupStickyHeaderProps, GroupStickyHeaderProps, {}>;
29
+ export { GroupStickyHeader, GroupStickyHeaderVue2 };
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ var __assign = undefined && undefined.__assign || function () {
4
+ __assign = Object.assign || function (t) {
5
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
6
+ s = arguments[i];
7
+ for (var p in s) {
8
+ if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
9
+ }
10
+ }
11
+ return t;
12
+ };
13
+ return __assign.apply(this, arguments);
14
+ };
15
+ Object.defineProperty(exports, "__esModule", {
16
+ value: true
17
+ });
18
+ exports.GroupStickyHeaderVue2 = exports.GroupStickyHeader = void 0;
19
+ // @ts-ignore
20
+ var Vue = require("vue");
21
+ var allVue = Vue;
22
+ var gh = allVue.h;
23
+ var isV3 = allVue.version && allVue.version[0] === '3';
24
+ var ref = allVue.ref;
25
+ var kendo_vue_common_1 = require("@progress/kendo-vue-common");
26
+ /**
27
+ * @hidden
28
+ */
29
+ var GroupStickyHeaderVue2 = {
30
+ name: 'KendoGroupStickyHeader',
31
+ props: {
32
+ group: String,
33
+ render: Object
34
+ },
35
+ // @ts-ignore
36
+ setup: !isV3 ? undefined : function () {
37
+ var v3 = !!isV3;
38
+ return {
39
+ v3: v3
40
+ };
41
+ },
42
+ // @ts-ignore
43
+ render: function render(createElement) {
44
+ var h = gh || createElement;
45
+ var _a = this.$props,
46
+ group = _a.group,
47
+ render = _a.render;
48
+ var defaulGroupStickyHeader = h("div", {
49
+ "class": "k-list-group-sticky-header"
50
+ }, [h("div", {
51
+ "class": "k-list-header-text"
52
+ }, [group])]);
53
+ return kendo_vue_common_1.getTemplate.call(this, {
54
+ h: h,
55
+ template: render,
56
+ defaultRendering: defaulGroupStickyHeader,
57
+ additionalProps: __assign({}, this.$props)
58
+ });
59
+ }
60
+ };
61
+ exports.GroupStickyHeaderVue2 = GroupStickyHeaderVue2;
62
+ /**
63
+ * @hidden
64
+ */
65
+ var GroupStickyHeader = GroupStickyHeaderVue2;
66
+ exports.GroupStickyHeader = GroupStickyHeader;
@@ -23,8 +23,10 @@ export interface ListProps {
23
23
  highlightSelected?: boolean;
24
24
  onClick?: (index: number, event: any) => void;
25
25
  itemRender?: any;
26
+ groupHeaderItemRender?: any;
26
27
  noDataRender?: any;
27
28
  scroller?: boolean;
29
+ groupField: string;
28
30
  }
29
31
  /**
30
32
  * @hidden