@progress/kendo-vue-dropdowns 3.10.2 → 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 (83) hide show
  1. package/dist/cdn/js/kendo-vue-dropdowns.js +1 -1
  2. package/dist/es/AutoComplete/AutoComplete.js +115 -15
  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/DropDownTree/DropDownTree.d.ts +49 -1
  9. package/dist/es/DropDownTree/DropDownTree.js +863 -638
  10. package/dist/es/DropDownTree/DropDownTreeProps.d.ts +19 -8
  11. package/dist/es/MultiSelect/MultiSelect.js +122 -28
  12. package/dist/es/MultiSelect/MultiSelectProps.d.ts +12 -0
  13. package/dist/es/MultiSelectTree/MultiSelectTree.js +12 -12
  14. package/dist/es/common/DropDownBase.d.ts +2 -0
  15. package/dist/es/common/DropDownBase.js +20 -0
  16. package/dist/es/common/GroupStickyHeader.d.ts +29 -0
  17. package/dist/es/common/GroupStickyHeader.js +59 -0
  18. package/dist/es/common/List.d.ts +2 -0
  19. package/dist/es/common/List.js +53 -25
  20. package/dist/es/common/ListFilter.js +47 -25
  21. package/dist/es/common/ListGroupItem.d.ts +41 -0
  22. package/dist/es/common/ListGroupItem.js +71 -0
  23. package/dist/es/common/settings.d.ts +1 -0
  24. package/dist/es/main.d.ts +2 -1
  25. package/dist/es/main.js +2 -1
  26. package/dist/es/package-metadata.js +1 -1
  27. package/dist/esm/AutoComplete/AutoComplete.js +115 -15
  28. package/dist/esm/AutoComplete/AutoCompleteProps.d.ts +12 -0
  29. package/dist/esm/ComboBox/ComboBox.js +115 -16
  30. package/dist/esm/ComboBox/ComboBoxProps.d.ts +12 -0
  31. package/dist/esm/DropDownList/DropDownList.js +101 -14
  32. package/dist/esm/DropDownList/DropDownListProps.d.ts +12 -0
  33. package/dist/esm/DropDownTree/DropDownTree.d.ts +49 -1
  34. package/dist/esm/DropDownTree/DropDownTree.js +863 -638
  35. package/dist/esm/DropDownTree/DropDownTreeProps.d.ts +19 -8
  36. package/dist/esm/MultiSelect/MultiSelect.js +122 -28
  37. package/dist/esm/MultiSelect/MultiSelectProps.d.ts +12 -0
  38. package/dist/esm/MultiSelectTree/MultiSelectTree.js +12 -12
  39. package/dist/esm/common/DropDownBase.d.ts +2 -0
  40. package/dist/esm/common/DropDownBase.js +20 -0
  41. package/dist/esm/common/GroupStickyHeader.d.ts +29 -0
  42. package/dist/esm/common/GroupStickyHeader.js +59 -0
  43. package/dist/esm/common/List.d.ts +2 -0
  44. package/dist/esm/common/List.js +53 -25
  45. package/dist/esm/common/ListFilter.js +47 -25
  46. package/dist/esm/common/ListGroupItem.d.ts +41 -0
  47. package/dist/esm/common/ListGroupItem.js +71 -0
  48. package/dist/esm/common/settings.d.ts +1 -0
  49. package/dist/esm/main.d.ts +2 -1
  50. package/dist/esm/main.js +2 -1
  51. package/dist/esm/package-metadata.js +1 -1
  52. package/dist/npm/AutoComplete/AutoComplete.js +114 -14
  53. package/dist/npm/AutoComplete/AutoCompleteProps.d.ts +12 -0
  54. package/dist/npm/ComboBox/ComboBox.js +115 -16
  55. package/dist/npm/ComboBox/ComboBoxProps.d.ts +12 -0
  56. package/dist/npm/DropDownList/DropDownList.js +101 -14
  57. package/dist/npm/DropDownList/DropDownListProps.d.ts +12 -0
  58. package/dist/npm/DropDownTree/DropDownTree.d.ts +49 -1
  59. package/dist/npm/DropDownTree/DropDownTree.js +868 -639
  60. package/dist/npm/DropDownTree/DropDownTreeProps.d.ts +19 -8
  61. package/dist/npm/MultiSelect/MultiSelect.js +122 -28
  62. package/dist/npm/MultiSelect/MultiSelectProps.d.ts +12 -0
  63. package/dist/npm/MultiSelectTree/MultiSelectTree.js +12 -12
  64. package/dist/npm/common/DropDownBase.d.ts +2 -0
  65. package/dist/npm/common/DropDownBase.js +20 -0
  66. package/dist/npm/common/GroupStickyHeader.d.ts +29 -0
  67. package/dist/npm/common/GroupStickyHeader.js +66 -0
  68. package/dist/npm/common/List.d.ts +2 -0
  69. package/dist/npm/common/List.js +52 -24
  70. package/dist/npm/common/ListFilter.js +47 -25
  71. package/dist/npm/common/ListGroupItem.d.ts +41 -0
  72. package/dist/npm/common/ListGroupItem.js +78 -0
  73. package/dist/npm/common/settings.d.ts +1 -0
  74. package/dist/npm/main.d.ts +2 -1
  75. package/dist/npm/main.js +3 -1
  76. package/dist/npm/package-metadata.js +1 -1
  77. package/package.json +10 -8
  78. package/dist/es/DropDownTree/useDropdownWidth.d.ts +0 -4
  79. package/dist/es/DropDownTree/useDropdownWidth.js +0 -10
  80. package/dist/esm/DropDownTree/useDropdownWidth.d.ts +0 -4
  81. package/dist/esm/DropDownTree/useDropdownWidth.js +0 -10
  82. package/dist/npm/DropDownTree/useDropdownWidth.d.ts +0 -4
  83. package/dist/npm/DropDownTree/useDropdownWidth.js +0 -17
@@ -18,6 +18,7 @@ var isV3 = allVue.version && allVue.version[0] === '3';
18
18
  var ref = allVue.ref;
19
19
  var inject = allVue.inject;
20
20
  import DropDownBase from '../common/DropDownBase.js';
21
+ import { GroupStickyHeader } from '../common/GroupStickyHeader.js';
21
22
  import { guid, classNames, Keys, templateRendering, getListeners, getTemplate, kendoThemeMaps, getRef, setRef, Icon } from '@progress/kendo-vue-common';
22
23
  import { Button as KButton } from '@progress/kendo-vue-buttons';
23
24
  var sizeMap = kendoThemeMaps.sizeMap,
@@ -119,6 +120,8 @@ var ComboBoxVue2 = {
119
120
  }
120
121
  },
121
122
  itemRender: [String, Function, Object],
123
+ groupHeaderItemRender: [String, Function, Object],
124
+ groupStickyHeaderItemRender: [String, Function, Object],
122
125
  listNoDataRender: [String, Function, Object],
123
126
  focusedItemIndex: Function,
124
127
  header: [String, Function, Object],
@@ -168,6 +171,9 @@ var ComboBoxVue2 = {
168
171
  validator: function validator(value) {
169
172
  return ['small', 'medium', 'large'].includes(value);
170
173
  }
174
+ },
175
+ groupField: {
176
+ type: String
171
177
  }
172
178
  },
173
179
  inject: {
@@ -189,7 +195,10 @@ var ComboBoxVue2 = {
189
195
  _skipFocusEvent: false,
190
196
  valueDuringOnChange: {},
191
197
  _navigated: false,
192
- suggested: ''
198
+ suggested: '',
199
+ group: undefined,
200
+ isScrolling: false,
201
+ itemHeight: 0
193
202
  };
194
203
  },
195
204
  created: function created() {
@@ -228,11 +237,14 @@ var ComboBoxVue2 = {
228
237
  this.setValidity();
229
238
  },
230
239
  updated: function updated() {
231
- var _a = this.$props,
232
- _b = _a.dataItems,
233
- dataItems = _b === void 0 ? [] : _b,
234
- dataItemKey = _a.dataItemKey,
235
- virtual = _a.virtual;
240
+ var _a;
241
+ var _b = this.$props,
242
+ _c = _b.dataItems,
243
+ dataItems = _c === void 0 ? [] : _c,
244
+ dataItemKey = _b.dataItemKey,
245
+ virtual = _b.virtual,
246
+ groupField = _b.groupField,
247
+ textField = _b.textField;
236
248
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
237
249
  var prevOpened = this.prevOpened !== undefined ? this.prevOpened : this.prevCurrentOpened;
238
250
  var opening = !prevOpened && opened;
@@ -264,17 +276,37 @@ var ComboBoxVue2 = {
264
276
  var selectedItemIndex = dataItems.findIndex(function (i) {
265
277
  return areSame(i, selectedItem, dataItemKey);
266
278
  });
279
+ // Needed to calculate the proper item index when in grouping mode
280
+ if (groupField) {
281
+ selectedItemIndex = (_a = this.base.getGroupedDataModernMode(dataItems, groupField)) === null || _a === void 0 ? void 0 : _a.indexOf(selectedItem);
282
+ }
267
283
  var selectedItemChanged = !areSame(prevSelectedItem, selectedItem, dataItemKey);
268
284
  if (opening && virtual) {
269
285
  this.base.scrollToVirtualItem(virtual, selectedItemIndex);
270
286
  this.prevCurrentOpened = true;
271
287
  } else if (opening && !virtual) {
272
- this.base.scrollToItem(selectedItem ? selectedItemIndex : this.getFocusedIndex());
288
+ // Resets the sticky header group value for scenarios with open/close of component's popup
289
+ if (dataItems && dataItems.length !== 0) {
290
+ this.base.resetGroupStickyHeader(dataItems[0][groupField], this);
291
+ }
292
+ this.base.scrollToItem(selectedItemIndex);
273
293
  this.prevCurrentOpened = true;
274
294
  } else if (opened && prevOpened && selectedItem && selectedItemChanged) {
275
295
  this.base.scrollToItem(selectedItemIndex);
276
- } else if (opened && !selectedItem) {
277
- this.base.scrollToItem(this.getFocusedIndex());
296
+ } else if (opened && !selectedItem && !this.isScrolling) {
297
+ var groupHeadersBeforeFocus = 0;
298
+ // Handle the items' focusing when working with grouped data
299
+ if (groupField && this.getFocusedIndex() !== -1 && dataItems.length > 0) {
300
+ var focusedElemBeforeGrouping_1 = dataItems[this.getFocusedIndex()][textField];
301
+ var gropedDataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
302
+ var groupedDataIdex = gropedDataItems.findIndex(function (el) {
303
+ return el[textField] === focusedElemBeforeGrouping_1;
304
+ });
305
+ groupHeadersBeforeFocus = gropedDataItems.slice(0, groupedDataIdex).filter(function (el) {
306
+ return Object.keys(el).length === 1;
307
+ }).length;
308
+ }
309
+ this.base.scrollToItem(this.getFocusedIndex() + groupHeadersBeforeFocus);
278
310
  }
279
311
  }
280
312
  if (opening && this.input) {
@@ -536,6 +568,9 @@ var ComboBoxVue2 = {
536
568
  },
537
569
  onInputKeyDown: function onInputKeyDown(event) {
538
570
  var _this = this;
571
+ if (this.isScrolling) {
572
+ this.isScrolling = false;
573
+ }
539
574
  var keyCode = event.keyCode;
540
575
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
541
576
  var state = this.base.initState();
@@ -600,6 +635,10 @@ var ComboBoxVue2 = {
600
635
  this.base.togglePopup(state);
601
636
  }
602
637
  this.base.filterChanged(value, state);
638
+ // Resets the value of the StickyHeader when filtering the data or just entering symbols in the input
639
+ if (this.$props.filterable) {
640
+ state.data.group = undefined;
641
+ }
603
642
  this.applyState(state);
604
643
  },
605
644
  clearButtonClick: function clearButtonClick(event) {
@@ -673,6 +712,39 @@ var ComboBoxVue2 = {
673
712
  },
674
713
  repositionPopup: function repositionPopup() {
675
714
  this.base.repositionPopup();
715
+ },
716
+ onScroll: function onScroll(event) {
717
+ this.isScrolling = true;
718
+ var _a = this.base,
719
+ vs = _a.vs,
720
+ list = _a.list;
721
+ vs.scrollHandler(event);
722
+ var state = this.base.initState();
723
+ var groupField = this.$props.groupField;
724
+ var _b = this.$props.dataItems,
725
+ dataItems = _b === void 0 ? [] : _b;
726
+ if (!groupField || !dataItems.length) {
727
+ return;
728
+ }
729
+ var itemHeight = this.itemHeight = this.itemHeight || (vs.enabled ? vs.itemHeight : list ? list.children[0].offsetHeight : 0);
730
+ var target = event.target;
731
+ var scrollTop = target.scrollTop - vs.skip * itemHeight;
732
+ if (groupField) {
733
+ dataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
734
+ }
735
+ var group = dataItems[0][groupField];
736
+ for (var i = 1; i < dataItems.length; i++) {
737
+ if (itemHeight * i > scrollTop) {
738
+ break;
739
+ }
740
+ if (dataItems[i] && dataItems[i][groupField]) {
741
+ group = dataItems[i][groupField];
742
+ }
743
+ }
744
+ if (group !== this.group) {
745
+ state.data.group = group;
746
+ this.applyState(state);
747
+ }
676
748
  }
677
749
  },
678
750
  render: function render(createElement) {
@@ -719,9 +791,10 @@ var ComboBoxVue2 = {
719
791
  var _a;
720
792
  var _b = this.$props,
721
793
  dataItemKey = _b.dataItemKey,
722
- _c = _b.dataItems,
723
- dataItems = _c === void 0 ? [] : _c;
794
+ groupField = _b.groupField;
795
+ var dataItems = this.$props.dataItems || [];
724
796
  var itemRender = templateRendering.call(this, this.$props.itemRender, getListeners.call(this));
797
+ var groupHeaderItemRender = templateRendering.call(this, this.$props.groupHeaderItemRender, getListeners.call(this));
725
798
  var listNoDataRender = templateRendering.call(this, this.$props.listNoDataRender, getListeners.call(this));
726
799
  if (!virtual) {
727
800
  virtual = {
@@ -733,6 +806,9 @@ var ComboBoxVue2 = {
733
806
  var translate = "translateY(".concat(vs.translate, "px)");
734
807
  var focusedIndex = opened ? this.getFocusedIndex() : undefined;
735
808
  var value = isPresent(text) && text !== selectedItemText ? null : this.computedValue();
809
+ if (groupField) {
810
+ dataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
811
+ }
736
812
  return (
737
813
  // @ts-ignore function children
738
814
  h(List, {
@@ -755,7 +831,9 @@ var ComboBoxVue2 = {
755
831
  } : undefined,
756
832
  skip: skip,
757
833
  itemRender: itemRender,
758
- noDataRender: listNoDataRender
834
+ groupHeaderItemRender: groupHeaderItemRender,
835
+ noDataRender: listNoDataRender,
836
+ groupField: groupField
759
837
  },
760
838
  show: opened,
761
839
  dataItems: dataItems,
@@ -777,11 +855,13 @@ var ComboBoxVue2 = {
777
855
  onListclick: this.handleItemClick,
778
856
  on: this.v3 ? undefined : {
779
857
  "listclick": this.handleItemClick,
780
- "scroll": vs.scrollHandler
858
+ "scroll": this.onScroll
781
859
  },
782
860
  itemRender: itemRender,
861
+ groupHeaderItemRender: groupHeaderItemRender,
783
862
  noDataRender: listNoDataRender,
784
- onScroll: vs.scrollHandler
863
+ groupField: groupField,
864
+ onScroll: this.onScroll
785
865
  }, this.v3 ? function () {
786
866
  return [renderScrollElement.call(_this2)];
787
867
  } : [renderScrollElement.call(_this2)])
@@ -798,6 +878,7 @@ var ComboBoxVue2 = {
798
878
  var _a;
799
879
  var headerTemplate = templateRendering.call(this, this.$props.header, getListeners.call(this));
800
880
  var footerTemplate = templateRendering.call(this, this.$props.footer, getListeners.call(this));
881
+ var groupStickyHeaderTemplate = templateRendering.call(this, this.$props.groupStickyHeaderItemRender, getListeners.call(this));
801
882
  var header = getTemplate.call(this, {
802
883
  h: h,
803
884
  template: headerTemplate
@@ -808,6 +889,10 @@ var ComboBoxVue2 = {
808
889
  });
809
890
  var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
810
891
  var popupWidth = popupSettings.width !== undefined ? popupSettings.width : base.popupWidth;
892
+ var dataItems = this.$props.dataItems || [];
893
+ if (this.group === undefined && this.$props.groupField !== undefined) {
894
+ this.group = getItemValue(dataItems[0], this.$props.groupField);
895
+ }
811
896
  return (
812
897
  // @ts-ignore function children
813
898
  h(ListContainer, {
@@ -841,12 +926,26 @@ var ComboBoxVue2 = {
841
926
  }, this.v3 ? function () {
842
927
  return [header && h("div", {
843
928
  "class": "k-list-header"
844
- }, [header]), renderList.call(_this3), footer && h("div", {
929
+ }, [header]), _this3.group && dataItems.length !== 0 && h(GroupStickyHeader, {
930
+ group: _this3.group,
931
+ attrs: _this3.v3 ? undefined : {
932
+ group: _this3.group,
933
+ render: groupStickyHeaderTemplate
934
+ },
935
+ render: groupStickyHeaderTemplate
936
+ }), renderList.call(_this3), footer && h("div", {
845
937
  "class": "k-list-footer"
846
938
  }, [footer])];
847
939
  } : [header && h("div", {
848
940
  "class": "k-list-header"
849
- }, [header]), renderList.call(_this3), footer && h("div", {
941
+ }, [header]), _this3.group && dataItems.length !== 0 && h(GroupStickyHeader, {
942
+ group: _this3.group,
943
+ attrs: _this3.v3 ? undefined : {
944
+ group: _this3.group,
945
+ render: groupStickyHeaderTemplate
946
+ },
947
+ render: groupStickyHeaderTemplate
948
+ }), renderList.call(_this3), footer && h("div", {
850
949
  "class": "k-list-footer"
851
950
  }, [footer])])
852
951
  );
@@ -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
  }
@@ -25,6 +25,7 @@ import { ListFilter } from '../common/ListFilter.js';
25
25
  import { ListDefaultItem } from '../common/ListDefaultItem.js';
26
26
  import { List } from '../common/List.js';
27
27
  import DropDownBase from '../common/DropDownBase.js';
28
+ import { GroupStickyHeader } from '../common/GroupStickyHeader.js';
28
29
  import { selectButton, messages } from '../messages/main.js';
29
30
  import { provideLocalizationService } from '@progress/kendo-vue-intl';
30
31
  import { isPresent, getItemValue, sameCharsOnly, shuffleData, matchText, areSame, preventDefaultNonInputs, getFocusedItem } from '../common/utils.js';
@@ -127,6 +128,8 @@ var DropDownListVue2 = {
127
128
  }
128
129
  },
129
130
  itemRender: [String, Function, Object],
131
+ groupHeaderItemRender: [String, Function, Object],
132
+ groupStickyHeaderItemRender: [String, Function, Object],
130
133
  listNoDataRender: [String, Function, Object],
131
134
  focusedItemIndex: Function,
132
135
  header: [String, Function, Object],
@@ -163,6 +166,9 @@ var DropDownListVue2 = {
163
166
  validator: function validator(value) {
164
167
  return ['small', 'medium', 'large'].includes(value);
165
168
  }
169
+ },
170
+ groupField: {
171
+ type: String
166
172
  }
167
173
  },
168
174
  inject: {
@@ -183,7 +189,10 @@ var DropDownListVue2 = {
183
189
  },
184
190
  _skipFocusEvent: false,
185
191
  valueDuringOnChange: {},
186
- _navigated: false
192
+ _navigated: false,
193
+ group: undefined,
194
+ isScrolling: false,
195
+ itemHeight: 0
187
196
  };
188
197
  },
189
198
  watch: {
@@ -234,11 +243,14 @@ var DropDownListVue2 = {
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;
@@ -282,11 +294,19 @@ var DropDownListVue2 = {
282
294
  var selectedItemIndex = dataItems.findIndex(function (i) {
283
295
  return areSame(i, selectedItem_1, dataItemKey);
284
296
  });
297
+ // Needed to calculate the proper item index when in grouping mode
298
+ if (groupField) {
299
+ selectedItemIndex = (_a = this.base.getGroupedDataModernMode(dataItems, groupField)) === null || _a === void 0 ? void 0 : _a.indexOf(selectedItem_1);
300
+ }
285
301
  var selectedItemChanged = !areSame(prevSelectedItem, selectedItem_1, dataItemKey);
286
302
  if (opening && virtual) {
287
303
  this.base.scrollToVirtualItem(virtual, selectedItemIndex);
288
304
  this.prevCurrentOpened = true;
289
305
  } else if (opening && !virtual) {
306
+ // Resets the sticky header group value for scenarios with open/close of component's popup
307
+ if (dataItems && dataItems.length !== 0) {
308
+ this.base.resetGroupStickyHeader(dataItems[0][groupField], this);
309
+ }
290
310
  this.base.scrollToItem(selectedItemIndex);
291
311
  this.prevCurrentOpened = true;
292
312
  } else if (opened && prevOpened && selectedItem_1 && selectedItemChanged && !this._navigated) {
@@ -487,6 +507,9 @@ var DropDownListVue2 = {
487
507
  }
488
508
  },
489
509
  handleKeyDown: function handleKeyDown(event) {
510
+ if (this.isScrolling) {
511
+ this.isScrolling = false;
512
+ }
490
513
  var _a = this.$props,
491
514
  _b = _a.dataItems,
492
515
  dataItems = _b === void 0 ? [] : _b,
@@ -611,6 +634,8 @@ var DropDownListVue2 = {
611
634
  state.data.currentText = event.target.value;
612
635
  }
613
636
  this.base.filterChanged(event.target.value, state);
637
+ // Used to reset the value of the StickyHeader when filtering the data
638
+ state.data.group = undefined;
614
639
  this.applyState(state);
615
640
  },
616
641
  onPopupOpened: function onPopupOpened() {
@@ -682,6 +707,39 @@ var DropDownListVue2 = {
682
707
  },
683
708
  repositionPopup: function repositionPopup() {
684
709
  this.base.repositionPopup();
710
+ },
711
+ onScroll: function onScroll(event) {
712
+ this.isScrolling = true;
713
+ var _a = this.base,
714
+ vs = _a.vs,
715
+ list = _a.list;
716
+ vs.scrollHandler(event);
717
+ var state = this.base.initState();
718
+ var groupField = this.$props.groupField;
719
+ var _b = this.$props.dataItems,
720
+ dataItems = _b === void 0 ? [] : _b;
721
+ if (!groupField || !dataItems.length) {
722
+ return;
723
+ }
724
+ var itemHeight = this.itemHeight = this.itemHeight || (vs.enabled ? vs.itemHeight : list ? list.children[0].offsetHeight : 0);
725
+ var target = event.target;
726
+ var scrollTop = target.scrollTop - vs.skip * itemHeight;
727
+ if (groupField) {
728
+ dataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
729
+ }
730
+ var group = dataItems[0][groupField];
731
+ for (var i = 1; i < dataItems.length; i++) {
732
+ if (itemHeight * i > scrollTop) {
733
+ break;
734
+ }
735
+ if (dataItems[i] && dataItems[i][groupField]) {
736
+ group = dataItems[i][groupField];
737
+ }
738
+ }
739
+ if (group !== this.group) {
740
+ state.data.group = group;
741
+ this.applyState(state);
742
+ }
685
743
  }
686
744
  },
687
745
  render: function render(createElement) {
@@ -799,11 +857,18 @@ var DropDownListVue2 = {
799
857
  };
800
858
  var renderList = function renderList() {
801
859
  var _this2 = this;
802
- var textField = this.$props.textField;
860
+ var _a = this.$props,
861
+ textField = _a.textField,
862
+ groupField = _a.groupField;
863
+ var dataItemsToRender = this.$props.dataItems || [];
803
864
  var itemRender = templateRendering.call(this, this.$props.itemRender, getListeners.call(this));
865
+ var groupHeaderItemRender = templateRendering.call(this, this.$props.groupHeaderItemRender, getListeners.call(this));
804
866
  var listNoDataRender = templateRendering.call(this, this.$props.listNoDataRender, getListeners.call(this));
805
867
  var skip = virtual.skip;
806
868
  var translate = "translateY(".concat(vs.translate, "px)");
869
+ if (groupField) {
870
+ dataItemsToRender = this.base.getGroupedDataModernMode(dataItemsToRender, groupField);
871
+ }
807
872
  return (
808
873
  // @ts-ignore function children
809
874
  h(List, {
@@ -811,7 +876,7 @@ var DropDownListVue2 = {
811
876
  attrs: this.v3 ? undefined : {
812
877
  id: this.base.listBoxId,
813
878
  show: opened,
814
- dataItems: dataItems.slice(),
879
+ dataItems: dataItemsToRender.slice(),
815
880
  focusedIndex: this.focusedIndex(),
816
881
  value: this.computedValue(),
817
882
  textField: textField,
@@ -826,10 +891,12 @@ var DropDownListVue2 = {
826
891
  } : undefined,
827
892
  skip: skip,
828
893
  itemRender: itemRender,
829
- noDataRender: listNoDataRender
894
+ groupHeaderItemRender: groupHeaderItemRender,
895
+ noDataRender: listNoDataRender,
896
+ groupField: groupField
830
897
  },
831
898
  show: opened,
832
- dataItems: dataItems.slice(),
899
+ dataItems: dataItemsToRender.slice(),
833
900
  focusedIndex: this.focusedIndex(),
834
901
  value: this.computedValue(),
835
902
  textField: textField,
@@ -848,11 +915,13 @@ var DropDownListVue2 = {
848
915
  onListclick: this.handleItemClick,
849
916
  on: this.v3 ? undefined : {
850
917
  "listclick": this.handleItemClick,
851
- "scroll": vs.scrollHandler
918
+ "scroll": this.onScroll
852
919
  },
853
920
  itemRender: itemRender,
921
+ groupHeaderItemRender: groupHeaderItemRender,
854
922
  noDataRender: listNoDataRender,
855
- onScroll: vs.scrollHandler
923
+ groupField: groupField,
924
+ onScroll: this.onScroll
856
925
  }, this.v3 ? function () {
857
926
  return [renderScrollElement.call(_this2)];
858
927
  } : [renderScrollElement.call(_this2)])
@@ -893,6 +962,7 @@ var DropDownListVue2 = {
893
962
  var _a;
894
963
  var headerTemplate = templateRendering.call(this, this.$props.header, getListeners.call(this));
895
964
  var footerTemplate = templateRendering.call(this, this.$props.footer, getListeners.call(this));
965
+ var groupStickyHeaderTemplate = templateRendering.call(this, this.$props.groupStickyHeaderItemRender, getListeners.call(this));
896
966
  var header = getTemplate.call(this, {
897
967
  h: h,
898
968
  template: headerTemplate
@@ -902,6 +972,9 @@ var DropDownListVue2 = {
902
972
  template: footerTemplate
903
973
  });
904
974
  var popupWidth = popupSettings.width !== undefined ? popupSettings.width : base.popupWidth;
975
+ if (this.group === undefined && this.$props.groupField !== undefined) {
976
+ this.group = getItemValue(dataItems[0], this.$props.groupField);
977
+ }
905
978
  return (
906
979
  // @ts-ignore function children
907
980
  h(ListContainer, {
@@ -937,12 +1010,26 @@ var DropDownListVue2 = {
937
1010
  onClose: this.onPopupClosed,
938
1011
  onBlur: this.handleBlur
939
1012
  }, this.v3 ? function () {
940
- return [renderListFilter.call(_this3), renderDefaultItem.call(_this3), header && h("div", {
1013
+ return [renderListFilter.call(_this3), renderDefaultItem.call(_this3), _this3.group && dataItems.length !== 0 && h(GroupStickyHeader, {
1014
+ group: _this3.group,
1015
+ attrs: _this3.v3 ? undefined : {
1016
+ group: _this3.group,
1017
+ render: groupStickyHeaderTemplate
1018
+ },
1019
+ render: groupStickyHeaderTemplate
1020
+ }), header && h("div", {
941
1021
  "class": "k-list-header"
942
1022
  }, [header]), renderList.call(_this3), footer && h("div", {
943
1023
  "class": "k-list-footer"
944
1024
  }, [footer])];
945
- } : [renderListFilter.call(_this3), renderDefaultItem.call(_this3), header && h("div", {
1025
+ } : [renderListFilter.call(_this3), renderDefaultItem.call(_this3), _this3.group && dataItems.length !== 0 && h(GroupStickyHeader, {
1026
+ group: _this3.group,
1027
+ attrs: _this3.v3 ? undefined : {
1028
+ group: _this3.group,
1029
+ render: groupStickyHeaderTemplate
1030
+ },
1031
+ render: groupStickyHeaderTemplate
1032
+ }), header && h("div", {
946
1033
  "class": "k-list-header"
947
1034
  }, [header]), renderList.call(_this3), footer && h("div", {
948
1035
  "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
  }
@@ -1 +1,49 @@
1
-
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
+ import { DropDownTreeProps } from './DropDownTreeProps';
7
+ /**
8
+ * @hidden
9
+ */
10
+ export interface DropDownTreeState {
11
+ calculatedId: string;
12
+ anchor: string;
13
+ }
14
+ /**
15
+ * @hidden
16
+ */
17
+ export interface DropDownTreeComputed {
18
+ [key: string]: any;
19
+ isOpen: boolean;
20
+ computedValue: any;
21
+ hasValue: boolean;
22
+ currentValueText: string;
23
+ wrapperClass: object;
24
+ }
25
+ /**
26
+ * @hidden
27
+ */
28
+ export interface DropDownTreeMethods {
29
+ [key: string]: any;
30
+ }
31
+ /**
32
+ * @hidden
33
+ */
34
+ export interface DropDownTreeData {
35
+ }
36
+ /**
37
+ * @hidden
38
+ */
39
+ export interface DropDownTreeAll extends Vue2type, DropDownTreeMethods, DropDownTreeData, DropDownTreeComputed, DropDownTreeState {
40
+ }
41
+ /**
42
+ * @hidden
43
+ */
44
+ declare let DropDownTreeVue2: ComponentOptions<DropDownTreeAll, DefaultData<DropDownTreeData>, DefaultMethods<DropDownTreeAll>, DropDownTreeComputed, RecordPropsDefinition<DropDownTreeProps>>;
45
+ /**
46
+ * @hidden
47
+ */
48
+ declare const DropDownTree: DefineComponent<DropDownTreeProps, any, DropDownTreeData, DropDownTreeComputed, DropDownTreeMethods, {}, {}, {}, string, DropDownTreeProps, DropDownTreeProps, {}>;
49
+ export { DropDownTree, DropDownTreeVue2 };