@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
@@ -26,6 +26,7 @@ var SearchBar_1 = require("./../common/SearchBar");
26
26
  var ListContainer_1 = require("./../common/ListContainer");
27
27
  var List_1 = require("./../common/List");
28
28
  var DropDownBase_1 = require("../common/DropDownBase");
29
+ var GroupStickyHeader_1 = require("../common/GroupStickyHeader");
29
30
  var ClearButton_1 = require("../common/ClearButton");
30
31
  var utils_1 = require("../common/utils");
31
32
  var kendo_vue_common_1 = require("@progress/kendo-vue-common");
@@ -103,6 +104,8 @@ var AutoCompleteVue2 = {
103
104
  }
104
105
  },
105
106
  itemRender: [String, Function, Object],
107
+ groupHeaderItemRender: [String, Function, Object],
108
+ groupStickyHeaderItemRender: [String, Function, Object],
106
109
  listNoDataRender: [String, Function, Object],
107
110
  focusedItemIndex: Function,
108
111
  header: [String, Function, Object],
@@ -133,6 +136,9 @@ var AutoCompleteVue2 = {
133
136
  validator: function validator(value) {
134
137
  return ['small', 'medium', 'large'].includes(value);
135
138
  }
139
+ },
140
+ groupField: {
141
+ type: String
136
142
  }
137
143
  },
138
144
  data: function data() {
@@ -148,7 +154,10 @@ var AutoCompleteVue2 = {
148
154
  last: ''
149
155
  },
150
156
  valueDuringOnChange: {},
151
- suggested: ''
157
+ suggested: '',
158
+ group: undefined,
159
+ isScrolling: false,
160
+ itemHeight: 0
152
161
  };
153
162
  },
154
163
  created: function created() {
@@ -196,8 +205,12 @@ var AutoCompleteVue2 = {
196
205
  }
197
206
  },
198
207
  updated: function updated() {
199
- var _a = this.$props.dataItems,
200
- dataItems = _a === void 0 ? [] : _a;
208
+ var _a;
209
+ var _b = this.$props,
210
+ _c = _b.groupField,
211
+ groupField = _c === void 0 ? '' : _c,
212
+ _d = _b.dataItems,
213
+ dataItems = _d === void 0 ? [] : _d;
201
214
  var focusedIndex = this.focusedIndex();
202
215
  var focusedItem = dataItems[focusedIndex];
203
216
  var dataChanged = this.prevData !== dataItems;
@@ -212,8 +225,22 @@ var AutoCompleteVue2 = {
212
225
  // @ts-ignore
213
226
  this.base.list = list.list;
214
227
  }
215
- if (dataItems.length && (opened && (focusedItemChanged || dataChanged) || opening)) {
216
- this.base.scrollToItem(focusedIndex);
228
+ if (groupField === '') {
229
+ if (opened && (focusedItemChanged || dataChanged) || opening) {
230
+ this.base.scrollToItem(focusedIndex);
231
+ }
232
+ } else if (!this.isScrolling) {
233
+ var focusedItemIndex = (_a = this.base.getGroupedDataModernMode(dataItems, groupField)) === null || _a === void 0 ? void 0 : _a.indexOf(focusedItem);
234
+ if (opening) {
235
+ // Resets the sticky header group value for scenarios with open/close of component's popup
236
+ if (dataItems && dataItems.length !== 0) {
237
+ this.base.resetGroupStickyHeader(dataItems[0][groupField], this);
238
+ }
239
+ this.base.scrollToItem(focusedItemIndex);
240
+ }
241
+ if (opened && prevOpened && focusedItemChanged) {
242
+ this.base.scrollToItem(focusedItemIndex);
243
+ }
217
244
  }
218
245
  this.setValidity();
219
246
  },
@@ -383,6 +410,10 @@ var AutoCompleteVue2 = {
383
410
  this.togglePopup(state);
384
411
  }
385
412
  state.data.focusedItem = undefined;
413
+ // Resets the value of the StickyHeader when filtering the data or just entering symbols in the input
414
+ if (this.prevData && this.prevData.length !== this.$props.dataItems) {
415
+ state.data.group = undefined;
416
+ }
386
417
  this.applyState(state);
387
418
  },
388
419
  clearButtonClick: function clearButtonClick(event) {
@@ -402,6 +433,9 @@ var AutoCompleteVue2 = {
402
433
  this.applyState(state);
403
434
  },
404
435
  onInputKeyDown: function onInputKeyDown(event) {
436
+ if (this.isScrolling) {
437
+ this.isScrolling = false;
438
+ }
405
439
  var keyCode = event.keyCode;
406
440
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
407
441
  var state = this.base.initState();
@@ -487,6 +521,39 @@ var AutoCompleteVue2 = {
487
521
  },
488
522
  repositionPopup: function repositionPopup() {
489
523
  this.base.repositionPopup();
524
+ },
525
+ onScroll: function onScroll(event) {
526
+ this.isScrolling = true;
527
+ var state = this.base.initState();
528
+ var list = this.base.list;
529
+ var groupField = this.$props.groupField;
530
+ var _a = this.$props.dataItems,
531
+ dataItems = _a === void 0 ? [] : _a;
532
+ if (!groupField || !dataItems.length) {
533
+ return;
534
+ }
535
+ var itemHeight = this.itemHeight || (list.children ? list.children[0].offsetHeight : 0);
536
+ var target = event.target;
537
+ var scrollTop = target.scrollTop;
538
+ if (groupField) {
539
+ dataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
540
+ }
541
+ var group = dataItems[0][groupField];
542
+ if (itemHeight === 0) {
543
+ itemHeight = 28;
544
+ }
545
+ for (var i = 1; i < dataItems.length; i++) {
546
+ if (itemHeight * i > scrollTop) {
547
+ break;
548
+ }
549
+ if (dataItems[i] && dataItems[i][groupField]) {
550
+ group = dataItems[i][groupField];
551
+ }
552
+ }
553
+ if (group !== this.group) {
554
+ state.data.group = group;
555
+ this.applyState(state);
556
+ }
490
557
  }
491
558
  },
492
559
  render: function render(createElement) {
@@ -578,11 +645,15 @@ var AutoCompleteVue2 = {
578
645
  var renderList = function renderList() {
579
646
  var _a = this.$props,
580
647
  textField = _a.textField,
581
- _b = _a.dataItems,
582
- dataItems = _b === void 0 ? [] : _b;
648
+ groupField = _a.groupField;
649
+ var dataItems = this.$props.dataItems || [];
583
650
  var itemRender = kendo_vue_common_1.templateRendering.call(this, this.$props.itemRender, kendo_vue_common_1.getListeners.call(this));
651
+ var groupHeaderItemRender = kendo_vue_common_1.templateRendering.call(this, this.$props.groupHeaderItemRender, kendo_vue_common_1.getListeners.call(this));
584
652
  var listNoDataRender = kendo_vue_common_1.templateRendering.call(this, this.$props.listNoDataRender, kendo_vue_common_1.getListeners.call(this));
585
653
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
654
+ if (groupField) {
655
+ dataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
656
+ }
586
657
  return (
587
658
  // @ts-ignore
588
659
  h(List_1.List, {
@@ -602,7 +673,9 @@ var AutoCompleteVue2 = {
602
673
  },
603
674
  wrapperCssClass: "k-list-content",
604
675
  itemRender: itemRender,
605
- noDataRender: listNoDataRender
676
+ groupHeaderItemRender: groupHeaderItemRender,
677
+ noDataRender: listNoDataRender,
678
+ groupField: groupField
606
679
  },
607
680
  show: opened,
608
681
  dataItems: dataItems.slice(),
@@ -619,10 +692,14 @@ var AutoCompleteVue2 = {
619
692
  wrapperCssClass: "k-list-content",
620
693
  onListclick: this.handleItemClick,
621
694
  on: this.v3 ? undefined : {
622
- "listclick": this.handleItemClick
695
+ "listclick": this.handleItemClick,
696
+ "scroll": this.onScroll
623
697
  },
624
698
  itemRender: itemRender,
625
- noDataRender: listNoDataRender
699
+ groupHeaderItemRender: groupHeaderItemRender,
700
+ noDataRender: listNoDataRender,
701
+ groupField: groupField,
702
+ onScroll: this.onScroll
626
703
  })
627
704
  );
628
705
  };
@@ -631,6 +708,7 @@ var AutoCompleteVue2 = {
631
708
  var _a;
632
709
  var headerTemplate = kendo_vue_common_1.templateRendering.call(this, this.$props.header, kendo_vue_common_1.getListeners.call(this));
633
710
  var footerTemplate = kendo_vue_common_1.templateRendering.call(this, this.$props.footer, kendo_vue_common_1.getListeners.call(this));
711
+ var groupStickyHeaderTemplate = kendo_vue_common_1.templateRendering.call(this, this.$props.groupStickyHeaderItemRender, kendo_vue_common_1.getListeners.call(this));
634
712
  var header = kendo_vue_common_1.getTemplate.call(this, {
635
713
  h: h,
636
714
  template: headerTemplate
@@ -641,6 +719,10 @@ var AutoCompleteVue2 = {
641
719
  });
642
720
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
643
721
  var popupWidth = popupSettings.width !== undefined ? popupSettings.width : base.popupWidth;
722
+ var dataItems = this.$props.dataItems || [];
723
+ if (this.group === undefined && this.$props.groupField !== undefined) {
724
+ this.group = (0, utils_1.getItemValue)(dataItems[0], this.$props.groupField);
725
+ }
644
726
  return (
645
727
  // @ts-ignore function children
646
728
  h(ListContainer_1.ListContainer, {
@@ -674,12 +756,26 @@ var AutoCompleteVue2 = {
674
756
  }, this.v3 ? function () {
675
757
  return [header && h("div", {
676
758
  "class": "k-list-header"
677
- }, [header]), renderList.call(_this2), footer && h("div", {
759
+ }, [header]), _this2.group && dataItems.length !== 0 && h(GroupStickyHeader_1.GroupStickyHeader, {
760
+ group: _this2.group,
761
+ attrs: _this2.v3 ? undefined : {
762
+ group: _this2.group,
763
+ render: groupStickyHeaderTemplate
764
+ },
765
+ render: groupStickyHeaderTemplate
766
+ }), renderList.call(_this2), footer && h("div", {
678
767
  "class": "k-list-footer"
679
768
  }, [footer])];
680
769
  } : [header && h("div", {
681
770
  "class": "k-list-header"
682
- }, [header]), renderList.call(_this2), footer && h("div", {
771
+ }, [header]), _this2.group && dataItems.length !== 0 && h(GroupStickyHeader_1.GroupStickyHeader, {
772
+ group: _this2.group,
773
+ attrs: _this2.v3 ? undefined : {
774
+ group: _this2.group,
775
+ render: groupStickyHeaderTemplate
776
+ },
777
+ render: groupStickyHeaderTemplate
778
+ }), renderList.call(_this2), footer && h("div", {
683
779
  "class": "k-list-footer"
684
780
  }, [footer])])
685
781
  );
@@ -215,4 +215,16 @@ export interface AutoCompleteProps extends FormComponentProps {
215
215
  * @default `solid`
216
216
  */
217
217
  fillMode?: null | 'solid' | 'outline' | 'flat' | string;
218
+ /**
219
+ * Sets the data item field that represents the start of a group. Applicable to objects data.
220
+ */
221
+ groupField?: string;
222
+ /**
223
+ * Fires when a AutoComplete group header item is about to be rendered. Used to override the default appearance of the group's headers.
224
+ */
225
+ groupHeaderItemRender?: any;
226
+ /**
227
+ * Fires when a AutoComplete sticky group header item is about to be rendered. Used to override the default appearance of the sticky group header of the component.
228
+ */
229
+ groupStickyHeaderItemRender?: any;
218
230
  }
@@ -24,6 +24,7 @@ var isV3 = allVue.version && allVue.version[0] === '3';
24
24
  var ref = allVue.ref;
25
25
  var inject = allVue.inject;
26
26
  var DropDownBase_1 = require("../common/DropDownBase");
27
+ var GroupStickyHeader_1 = require("../common/GroupStickyHeader");
27
28
  var kendo_vue_common_1 = require("@progress/kendo-vue-common");
28
29
  var kendo_vue_buttons_1 = require("@progress/kendo-vue-buttons");
29
30
  var sizeMap = kendo_vue_common_1.kendoThemeMaps.sizeMap,
@@ -125,6 +126,8 @@ var ComboBoxVue2 = {
125
126
  }
126
127
  },
127
128
  itemRender: [String, Function, Object],
129
+ groupHeaderItemRender: [String, Function, Object],
130
+ groupStickyHeaderItemRender: [String, Function, Object],
128
131
  listNoDataRender: [String, Function, Object],
129
132
  focusedItemIndex: Function,
130
133
  header: [String, Function, Object],
@@ -174,6 +177,9 @@ var ComboBoxVue2 = {
174
177
  validator: function validator(value) {
175
178
  return ['small', 'medium', 'large'].includes(value);
176
179
  }
180
+ },
181
+ groupField: {
182
+ type: String
177
183
  }
178
184
  },
179
185
  inject: {
@@ -195,7 +201,10 @@ var ComboBoxVue2 = {
195
201
  _skipFocusEvent: false,
196
202
  valueDuringOnChange: {},
197
203
  _navigated: false,
198
- suggested: ''
204
+ suggested: '',
205
+ group: undefined,
206
+ isScrolling: false,
207
+ itemHeight: 0
199
208
  };
200
209
  },
201
210
  created: function created() {
@@ -234,11 +243,14 @@ var ComboBoxVue2 = {
234
243
  this.setValidity();
235
244
  },
236
245
  updated: function updated() {
237
- var _a = this.$props,
238
- _b = _a.dataItems,
239
- dataItems = _b === void 0 ? [] : _b,
240
- dataItemKey = _a.dataItemKey,
241
- virtual = _a.virtual;
246
+ var _a;
247
+ var _b = this.$props,
248
+ _c = _b.dataItems,
249
+ dataItems = _c === void 0 ? [] : _c,
250
+ dataItemKey = _b.dataItemKey,
251
+ virtual = _b.virtual,
252
+ groupField = _b.groupField,
253
+ textField = _b.textField;
242
254
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
243
255
  var prevOpened = this.prevOpened !== undefined ? this.prevOpened : this.prevCurrentOpened;
244
256
  var opening = !prevOpened && opened;
@@ -270,17 +282,37 @@ var ComboBoxVue2 = {
270
282
  var selectedItemIndex = dataItems.findIndex(function (i) {
271
283
  return (0, utils_1.areSame)(i, selectedItem, dataItemKey);
272
284
  });
285
+ // Needed to calculate the proper item index when in grouping mode
286
+ if (groupField) {
287
+ selectedItemIndex = (_a = this.base.getGroupedDataModernMode(dataItems, groupField)) === null || _a === void 0 ? void 0 : _a.indexOf(selectedItem);
288
+ }
273
289
  var selectedItemChanged = !(0, utils_1.areSame)(prevSelectedItem, selectedItem, dataItemKey);
274
290
  if (opening && virtual) {
275
291
  this.base.scrollToVirtualItem(virtual, selectedItemIndex);
276
292
  this.prevCurrentOpened = true;
277
293
  } else if (opening && !virtual) {
278
- this.base.scrollToItem(selectedItem ? selectedItemIndex : this.getFocusedIndex());
294
+ // Resets the sticky header group value for scenarios with open/close of component's popup
295
+ if (dataItems && dataItems.length !== 0) {
296
+ this.base.resetGroupStickyHeader(dataItems[0][groupField], this);
297
+ }
298
+ this.base.scrollToItem(selectedItemIndex);
279
299
  this.prevCurrentOpened = true;
280
300
  } else if (opened && prevOpened && selectedItem && selectedItemChanged) {
281
301
  this.base.scrollToItem(selectedItemIndex);
282
- } else if (opened && !selectedItem) {
283
- this.base.scrollToItem(this.getFocusedIndex());
302
+ } else if (opened && !selectedItem && !this.isScrolling) {
303
+ var groupHeadersBeforeFocus = 0;
304
+ // Handle the items' focusing when working with grouped data
305
+ if (groupField && this.getFocusedIndex() !== -1 && dataItems.length > 0) {
306
+ var focusedElemBeforeGrouping_1 = dataItems[this.getFocusedIndex()][textField];
307
+ var gropedDataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
308
+ var groupedDataIdex = gropedDataItems.findIndex(function (el) {
309
+ return el[textField] === focusedElemBeforeGrouping_1;
310
+ });
311
+ groupHeadersBeforeFocus = gropedDataItems.slice(0, groupedDataIdex).filter(function (el) {
312
+ return Object.keys(el).length === 1;
313
+ }).length;
314
+ }
315
+ this.base.scrollToItem(this.getFocusedIndex() + groupHeadersBeforeFocus);
284
316
  }
285
317
  }
286
318
  if (opening && this.input) {
@@ -542,6 +574,9 @@ var ComboBoxVue2 = {
542
574
  },
543
575
  onInputKeyDown: function onInputKeyDown(event) {
544
576
  var _this = this;
577
+ if (this.isScrolling) {
578
+ this.isScrolling = false;
579
+ }
545
580
  var keyCode = event.keyCode;
546
581
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
547
582
  var state = this.base.initState();
@@ -606,6 +641,10 @@ var ComboBoxVue2 = {
606
641
  this.base.togglePopup(state);
607
642
  }
608
643
  this.base.filterChanged(value, state);
644
+ // Resets the value of the StickyHeader when filtering the data or just entering symbols in the input
645
+ if (this.$props.filterable) {
646
+ state.data.group = undefined;
647
+ }
609
648
  this.applyState(state);
610
649
  },
611
650
  clearButtonClick: function clearButtonClick(event) {
@@ -679,6 +718,39 @@ var ComboBoxVue2 = {
679
718
  },
680
719
  repositionPopup: function repositionPopup() {
681
720
  this.base.repositionPopup();
721
+ },
722
+ onScroll: function onScroll(event) {
723
+ this.isScrolling = true;
724
+ var _a = this.base,
725
+ vs = _a.vs,
726
+ list = _a.list;
727
+ vs.scrollHandler(event);
728
+ var state = this.base.initState();
729
+ var groupField = this.$props.groupField;
730
+ var _b = this.$props.dataItems,
731
+ dataItems = _b === void 0 ? [] : _b;
732
+ if (!groupField || !dataItems.length) {
733
+ return;
734
+ }
735
+ var itemHeight = this.itemHeight = this.itemHeight || (vs.enabled ? vs.itemHeight : list ? list.children[0].offsetHeight : 0);
736
+ var target = event.target;
737
+ var scrollTop = target.scrollTop - vs.skip * itemHeight;
738
+ if (groupField) {
739
+ dataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
740
+ }
741
+ var group = dataItems[0][groupField];
742
+ for (var i = 1; i < dataItems.length; i++) {
743
+ if (itemHeight * i > scrollTop) {
744
+ break;
745
+ }
746
+ if (dataItems[i] && dataItems[i][groupField]) {
747
+ group = dataItems[i][groupField];
748
+ }
749
+ }
750
+ if (group !== this.group) {
751
+ state.data.group = group;
752
+ this.applyState(state);
753
+ }
682
754
  }
683
755
  },
684
756
  render: function render(createElement) {
@@ -725,9 +797,10 @@ var ComboBoxVue2 = {
725
797
  var _a;
726
798
  var _b = this.$props,
727
799
  dataItemKey = _b.dataItemKey,
728
- _c = _b.dataItems,
729
- dataItems = _c === void 0 ? [] : _c;
800
+ groupField = _b.groupField;
801
+ var dataItems = this.$props.dataItems || [];
730
802
  var itemRender = kendo_vue_common_1.templateRendering.call(this, this.$props.itemRender, kendo_vue_common_1.getListeners.call(this));
803
+ var groupHeaderItemRender = kendo_vue_common_1.templateRendering.call(this, this.$props.groupHeaderItemRender, kendo_vue_common_1.getListeners.call(this));
731
804
  var listNoDataRender = kendo_vue_common_1.templateRendering.call(this, this.$props.listNoDataRender, kendo_vue_common_1.getListeners.call(this));
732
805
  if (!virtual) {
733
806
  virtual = {
@@ -739,6 +812,9 @@ var ComboBoxVue2 = {
739
812
  var translate = "translateY(".concat(vs.translate, "px)");
740
813
  var focusedIndex = opened ? this.getFocusedIndex() : undefined;
741
814
  var value = (0, utils_1.isPresent)(text) && text !== selectedItemText ? null : this.computedValue();
815
+ if (groupField) {
816
+ dataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
817
+ }
742
818
  return (
743
819
  // @ts-ignore function children
744
820
  h(List_1.List, {
@@ -761,7 +837,9 @@ var ComboBoxVue2 = {
761
837
  } : undefined,
762
838
  skip: skip,
763
839
  itemRender: itemRender,
764
- noDataRender: listNoDataRender
840
+ groupHeaderItemRender: groupHeaderItemRender,
841
+ noDataRender: listNoDataRender,
842
+ groupField: groupField
765
843
  },
766
844
  show: opened,
767
845
  dataItems: dataItems,
@@ -783,11 +861,13 @@ var ComboBoxVue2 = {
783
861
  onListclick: this.handleItemClick,
784
862
  on: this.v3 ? undefined : {
785
863
  "listclick": this.handleItemClick,
786
- "scroll": vs.scrollHandler
864
+ "scroll": this.onScroll
787
865
  },
788
866
  itemRender: itemRender,
867
+ groupHeaderItemRender: groupHeaderItemRender,
789
868
  noDataRender: listNoDataRender,
790
- onScroll: vs.scrollHandler
869
+ groupField: groupField,
870
+ onScroll: this.onScroll
791
871
  }, this.v3 ? function () {
792
872
  return [renderScrollElement.call(_this2)];
793
873
  } : [renderScrollElement.call(_this2)])
@@ -804,6 +884,7 @@ var ComboBoxVue2 = {
804
884
  var _a;
805
885
  var headerTemplate = kendo_vue_common_1.templateRendering.call(this, this.$props.header, kendo_vue_common_1.getListeners.call(this));
806
886
  var footerTemplate = kendo_vue_common_1.templateRendering.call(this, this.$props.footer, kendo_vue_common_1.getListeners.call(this));
887
+ var groupStickyHeaderTemplate = kendo_vue_common_1.templateRendering.call(this, this.$props.groupStickyHeaderItemRender, kendo_vue_common_1.getListeners.call(this));
807
888
  var header = kendo_vue_common_1.getTemplate.call(this, {
808
889
  h: h,
809
890
  template: headerTemplate
@@ -814,6 +895,10 @@ var ComboBoxVue2 = {
814
895
  });
815
896
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
816
897
  var popupWidth = popupSettings.width !== undefined ? popupSettings.width : base.popupWidth;
898
+ var dataItems = this.$props.dataItems || [];
899
+ if (this.group === undefined && this.$props.groupField !== undefined) {
900
+ this.group = (0, utils_1.getItemValue)(dataItems[0], this.$props.groupField);
901
+ }
817
902
  return (
818
903
  // @ts-ignore function children
819
904
  h(ListContainer_1.ListContainer, {
@@ -847,12 +932,26 @@ var ComboBoxVue2 = {
847
932
  }, this.v3 ? function () {
848
933
  return [header && h("div", {
849
934
  "class": "k-list-header"
850
- }, [header]), renderList.call(_this3), footer && h("div", {
935
+ }, [header]), _this3.group && dataItems.length !== 0 && h(GroupStickyHeader_1.GroupStickyHeader, {
936
+ group: _this3.group,
937
+ attrs: _this3.v3 ? undefined : {
938
+ group: _this3.group,
939
+ render: groupStickyHeaderTemplate
940
+ },
941
+ render: groupStickyHeaderTemplate
942
+ }), renderList.call(_this3), footer && h("div", {
851
943
  "class": "k-list-footer"
852
944
  }, [footer])];
853
945
  } : [header && h("div", {
854
946
  "class": "k-list-header"
855
- }, [header]), renderList.call(_this3), footer && h("div", {
947
+ }, [header]), _this3.group && dataItems.length !== 0 && h(GroupStickyHeader_1.GroupStickyHeader, {
948
+ group: _this3.group,
949
+ attrs: _this3.v3 ? undefined : {
950
+ group: _this3.group,
951
+ render: groupStickyHeaderTemplate
952
+ },
953
+ render: groupStickyHeaderTemplate
954
+ }), renderList.call(_this3), footer && h("div", {
856
955
  "class": "k-list-footer"
857
956
  }, [footer])])
858
957
  );
@@ -250,4 +250,16 @@ export interface ComboBoxProps extends FormComponentProps {
250
250
  * @default `solid`
251
251
  */
252
252
  fillMode?: null | 'solid' | 'outline' | 'flat' | string;
253
+ /**
254
+ * Sets the data item field that represents the start of a group. Applicable to objects data.
255
+ */
256
+ groupField?: string;
257
+ /**
258
+ * Fires when a ComboBox group header item is about to be rendered. Used to override the default appearance of the group's headers.
259
+ */
260
+ groupHeaderItemRender?: any;
261
+ /**
262
+ * Fires when a ComboBox sticky group header item is about to be rendered. Used to override the default appearance of the sticky group header of the component.
263
+ */
264
+ groupStickyHeaderItemRender?: any;
253
265
  }