@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.
- package/dist/cdn/js/kendo-vue-dropdowns.js +1 -1
- package/dist/es/AutoComplete/AutoComplete.js +108 -12
- package/dist/es/AutoComplete/AutoCompleteProps.d.ts +12 -0
- package/dist/es/ComboBox/ComboBox.js +115 -16
- package/dist/es/ComboBox/ComboBoxProps.d.ts +12 -0
- package/dist/es/DropDownList/DropDownList.js +101 -14
- package/dist/es/DropDownList/DropDownListProps.d.ts +12 -0
- package/dist/es/MultiSelect/MultiSelect.js +116 -26
- package/dist/es/MultiSelect/MultiSelectProps.d.ts +12 -0
- package/dist/es/common/DropDownBase.d.ts +2 -0
- package/dist/es/common/DropDownBase.js +20 -0
- package/dist/es/common/GroupStickyHeader.d.ts +29 -0
- package/dist/es/common/GroupStickyHeader.js +59 -0
- package/dist/es/common/List.d.ts +2 -0
- package/dist/es/common/List.js +53 -25
- package/dist/es/common/ListGroupItem.d.ts +41 -0
- package/dist/es/common/ListGroupItem.js +71 -0
- package/dist/es/common/settings.d.ts +1 -0
- package/dist/es/package-metadata.js +1 -1
- package/dist/esm/AutoComplete/AutoComplete.js +108 -12
- package/dist/esm/AutoComplete/AutoCompleteProps.d.ts +12 -0
- package/dist/esm/ComboBox/ComboBox.js +115 -16
- package/dist/esm/ComboBox/ComboBoxProps.d.ts +12 -0
- package/dist/esm/DropDownList/DropDownList.js +101 -14
- package/dist/esm/DropDownList/DropDownListProps.d.ts +12 -0
- package/dist/esm/MultiSelect/MultiSelect.js +116 -26
- package/dist/esm/MultiSelect/MultiSelectProps.d.ts +12 -0
- package/dist/esm/common/DropDownBase.d.ts +2 -0
- package/dist/esm/common/DropDownBase.js +20 -0
- package/dist/esm/common/GroupStickyHeader.d.ts +29 -0
- package/dist/esm/common/GroupStickyHeader.js +59 -0
- package/dist/esm/common/List.d.ts +2 -0
- package/dist/esm/common/List.js +53 -25
- package/dist/esm/common/ListGroupItem.d.ts +41 -0
- package/dist/esm/common/ListGroupItem.js +71 -0
- package/dist/esm/common/settings.d.ts +1 -0
- package/dist/esm/package-metadata.js +1 -1
- package/dist/npm/AutoComplete/AutoComplete.js +108 -12
- package/dist/npm/AutoComplete/AutoCompleteProps.d.ts +12 -0
- package/dist/npm/ComboBox/ComboBox.js +115 -16
- package/dist/npm/ComboBox/ComboBoxProps.d.ts +12 -0
- package/dist/npm/DropDownList/DropDownList.js +101 -14
- package/dist/npm/DropDownList/DropDownListProps.d.ts +12 -0
- package/dist/npm/MultiSelect/MultiSelect.js +116 -26
- package/dist/npm/MultiSelect/MultiSelectProps.d.ts +12 -0
- package/dist/npm/common/DropDownBase.d.ts +2 -0
- package/dist/npm/common/DropDownBase.js +20 -0
- package/dist/npm/common/GroupStickyHeader.d.ts +29 -0
- package/dist/npm/common/GroupStickyHeader.js +66 -0
- package/dist/npm/common/List.d.ts +2 -0
- package/dist/npm/common/List.js +52 -24
- package/dist/npm/common/ListGroupItem.d.ts +41 -0
- package/dist/npm/common/ListGroupItem.js +78 -0
- package/dist/npm/common/settings.d.ts +1 -0
- package/dist/npm/package-metadata.js +1 -1
- package/package.json +9 -9
|
@@ -25,6 +25,7 @@ import { ListFilter } from '../common/ListFilter';
|
|
|
25
25
|
import { ListDefaultItem } from '../common/ListDefaultItem';
|
|
26
26
|
import { List } from '../common/List';
|
|
27
27
|
import DropDownBase from '../common/DropDownBase';
|
|
28
|
+
import { GroupStickyHeader } from '../common/GroupStickyHeader';
|
|
28
29
|
import { selectButton, messages } from '../messages/main';
|
|
29
30
|
import { provideLocalizationService } from '@progress/kendo-vue-intl';
|
|
30
31
|
import { isPresent, getItemValue, sameCharsOnly, shuffleData, matchText, areSame, preventDefaultNonInputs, getFocusedItem } from '../common/utils';
|
|
@@ -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
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
|
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:
|
|
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
|
-
|
|
894
|
+
groupHeaderItemRender: groupHeaderItemRender,
|
|
895
|
+
noDataRender: listNoDataRender,
|
|
896
|
+
groupField: groupField
|
|
830
897
|
},
|
|
831
898
|
show: opened,
|
|
832
|
-
dataItems:
|
|
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":
|
|
918
|
+
"scroll": this.onScroll
|
|
852
919
|
},
|
|
853
920
|
itemRender: itemRender,
|
|
921
|
+
groupHeaderItemRender: groupHeaderItemRender,
|
|
854
922
|
noDataRender: listNoDataRender,
|
|
855
|
-
|
|
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),
|
|
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),
|
|
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
|
}
|
|
@@ -33,6 +33,7 @@ import { List } from '../common/List';
|
|
|
33
33
|
import { TagList } from './TagList';
|
|
34
34
|
import { SearchBar } from '../common/SearchBar';
|
|
35
35
|
import DropDownBase from '../common/DropDownBase';
|
|
36
|
+
import { GroupStickyHeader } from '../common/GroupStickyHeader';
|
|
36
37
|
import { ClearButton } from '../common/ClearButton';
|
|
37
38
|
import { ActiveDescendant } from './../common/settings';
|
|
38
39
|
import { itemIndexStartsWith, getItemValue, areSame, matchDataCollections, removeDataItems, isPresent, preventDefaultNonInputs } from '../common/utils';
|
|
@@ -139,6 +140,8 @@ var MultiSelectVue2 = {
|
|
|
139
140
|
}
|
|
140
141
|
},
|
|
141
142
|
itemRender: [String, Function, Object],
|
|
143
|
+
groupHeaderItemRender: [String, Function, Object],
|
|
144
|
+
groupStickyHeaderItemRender: [String, Function, Object],
|
|
142
145
|
listNoDataRender: [String, Function, Object],
|
|
143
146
|
focusedItemIndex: Function,
|
|
144
147
|
virtual: {
|
|
@@ -181,6 +184,9 @@ var MultiSelectVue2 = {
|
|
|
181
184
|
validator: function validator(value) {
|
|
182
185
|
return ['small', 'medium', 'large'].includes(value);
|
|
183
186
|
}
|
|
187
|
+
},
|
|
188
|
+
groupField: {
|
|
189
|
+
type: String
|
|
184
190
|
}
|
|
185
191
|
},
|
|
186
192
|
// @ts-ignore
|
|
@@ -232,7 +238,10 @@ var MultiSelectVue2 = {
|
|
|
232
238
|
last: ''
|
|
233
239
|
},
|
|
234
240
|
suggested: '',
|
|
235
|
-
activedescendant: ActiveDescendant.PopupList
|
|
241
|
+
activedescendant: ActiveDescendant.PopupList,
|
|
242
|
+
group: undefined,
|
|
243
|
+
isScrolling: false,
|
|
244
|
+
itemHeight: 0
|
|
236
245
|
};
|
|
237
246
|
},
|
|
238
247
|
watch: {
|
|
@@ -249,7 +258,13 @@ var MultiSelectVue2 = {
|
|
|
249
258
|
}
|
|
250
259
|
},
|
|
251
260
|
updated: function updated() {
|
|
252
|
-
var
|
|
261
|
+
var _a;
|
|
262
|
+
var _b = this.$props,
|
|
263
|
+
virtual = _b.virtual,
|
|
264
|
+
_c = _b.groupField,
|
|
265
|
+
groupField = _c === void 0 ? '' : _c,
|
|
266
|
+
_d = _b.dataItems,
|
|
267
|
+
dataItems = _d === void 0 ? [] : _d;
|
|
253
268
|
var skip = virtual ? virtual.skip : 0;
|
|
254
269
|
var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
|
|
255
270
|
var prevOpened = this.prevOpened !== undefined ? this.prevOpened : this.prevCurrentOpened;
|
|
@@ -270,29 +285,38 @@ var MultiSelectVue2 = {
|
|
|
270
285
|
if (scrollElement) {
|
|
271
286
|
this.base.vs.scrollElement = scrollElement;
|
|
272
287
|
}
|
|
273
|
-
if (list &&
|
|
288
|
+
if (list && dataItems.length) {
|
|
274
289
|
// @ts-ignore
|
|
275
290
|
this.base.vs.scrollerRef(list.$el);
|
|
276
291
|
}
|
|
277
292
|
if (!popupSettings.animate && closing) {
|
|
278
293
|
this.onPopupClosed();
|
|
279
294
|
}
|
|
280
|
-
if (
|
|
281
|
-
this.
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
295
|
+
if (!this.isScrolling) {
|
|
296
|
+
if (virtual && this.virtualTotalHasChanged) {
|
|
297
|
+
this.base.vs.calcScrollElementHeight();
|
|
298
|
+
this.base.vs.reset();
|
|
299
|
+
this.virtualTotalHasChanged = false;
|
|
300
|
+
} else {
|
|
301
|
+
var _e = this.getFocusedState(),
|
|
302
|
+
focusedItem = _e.focusedItem,
|
|
303
|
+
focusedIndex = _e.focusedIndex;
|
|
304
|
+
if (groupField !== '') {
|
|
305
|
+
focusedIndex = (_a = this.base.getGroupedDataModernMode(dataItems, groupField)) === null || _a === void 0 ? void 0 : _a.indexOf(focusedItem);
|
|
306
|
+
}
|
|
307
|
+
if (opening && virtual) {
|
|
308
|
+
this.base.scrollToVirtualItem(virtual, focusedIndex - skip);
|
|
309
|
+
this.prevCurrentOpened = true;
|
|
310
|
+
} else if (opening && !virtual) {
|
|
311
|
+
// Resets the sticky header group value for scenarios with open/close of component's popup
|
|
312
|
+
if (dataItems && dataItems.length !== 0) {
|
|
313
|
+
this.base.resetGroupStickyHeader(dataItems[0][groupField], this);
|
|
314
|
+
}
|
|
315
|
+
this.base.scrollToItem(focusedIndex);
|
|
316
|
+
this.prevCurrentOpened = true;
|
|
317
|
+
} else if (opened && prevOpened && focusedItem) {
|
|
318
|
+
this.base.scrollToItem(focusedIndex - skip);
|
|
319
|
+
}
|
|
296
320
|
}
|
|
297
321
|
}
|
|
298
322
|
this.scrollToFocused = false;
|
|
@@ -478,6 +502,10 @@ var MultiSelectVue2 = {
|
|
|
478
502
|
this.base.togglePopup(state);
|
|
479
503
|
}
|
|
480
504
|
this.base.filterChanged(value, state);
|
|
505
|
+
// Resets the value of the StickyHeader when filtering the data or just entering symbols in the input
|
|
506
|
+
if (this.$props.filterable) {
|
|
507
|
+
state.data.group = undefined;
|
|
508
|
+
}
|
|
481
509
|
this.applyState(state);
|
|
482
510
|
},
|
|
483
511
|
clearButtonClick: function clearButtonClick(event) {
|
|
@@ -505,6 +533,9 @@ var MultiSelectVue2 = {
|
|
|
505
533
|
},
|
|
506
534
|
onInputKeyDown: function onInputKeyDown(event) {
|
|
507
535
|
var _this = this;
|
|
536
|
+
if (this.isScrolling) {
|
|
537
|
+
this.isScrolling = false;
|
|
538
|
+
}
|
|
508
539
|
var keyCode = event.keyCode;
|
|
509
540
|
var text = this.$props.filter !== undefined ? this.$props.filter : this.currentText;
|
|
510
541
|
var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
|
|
@@ -794,6 +825,39 @@ var MultiSelectVue2 = {
|
|
|
794
825
|
},
|
|
795
826
|
repositionPopup: function repositionPopup() {
|
|
796
827
|
this.base.repositionPopup();
|
|
828
|
+
},
|
|
829
|
+
onScroll: function onScroll(event) {
|
|
830
|
+
this.isScrolling = true;
|
|
831
|
+
var _a = this.base,
|
|
832
|
+
vs = _a.vs,
|
|
833
|
+
list = _a.list;
|
|
834
|
+
vs.scrollHandler(event);
|
|
835
|
+
var state = this.base.initState();
|
|
836
|
+
var groupField = this.$props.groupField;
|
|
837
|
+
var _b = this.$props.dataItems,
|
|
838
|
+
dataItems = _b === void 0 ? [] : _b;
|
|
839
|
+
if (!groupField || !dataItems.length) {
|
|
840
|
+
return;
|
|
841
|
+
}
|
|
842
|
+
var itemHeight = this.itemHeight = this.itemHeight || (vs.enabled ? vs.itemHeight : list ? list.children[0].offsetHeight : 0);
|
|
843
|
+
var target = event.target;
|
|
844
|
+
var scrollTop = target.scrollTop - vs.skip * itemHeight;
|
|
845
|
+
if (groupField) {
|
|
846
|
+
dataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
|
|
847
|
+
}
|
|
848
|
+
var group = dataItems[0][groupField];
|
|
849
|
+
for (var i = 1; i < dataItems.length; i++) {
|
|
850
|
+
if (itemHeight * i > scrollTop) {
|
|
851
|
+
break;
|
|
852
|
+
}
|
|
853
|
+
if (dataItems[i] && dataItems[i][groupField]) {
|
|
854
|
+
group = dataItems[i][groupField];
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
if (group !== this.group) {
|
|
858
|
+
state.data.group = group;
|
|
859
|
+
this.applyState(state);
|
|
860
|
+
}
|
|
797
861
|
}
|
|
798
862
|
},
|
|
799
863
|
render: function render(createElement) {
|
|
@@ -899,14 +963,18 @@ var MultiSelectVue2 = {
|
|
|
899
963
|
};
|
|
900
964
|
var renderList = function renderList() {
|
|
901
965
|
var _this2 = this;
|
|
902
|
-
var
|
|
903
|
-
|
|
966
|
+
var groupField = this.$props.groupField;
|
|
967
|
+
var dataItems = this.$props.dataItems || [];
|
|
904
968
|
var itemRender = templateRendering.call(this, this.$props.itemRender, getListeners.call(this));
|
|
969
|
+
var groupHeaderItemRender = templateRendering.call(this, this.$props.groupHeaderItemRender, getListeners.call(this));
|
|
905
970
|
var listNoDataRender = templateRendering.call(this, this.$props.listNoDataRender, getListeners.call(this));
|
|
906
971
|
var skip = virtual ? virtual.skip : 0;
|
|
907
972
|
var opened = this.$props.opened !== undefined ? this.$props.opened : this.currentOpened;
|
|
908
973
|
var focusedIndex = this.getFocusedState().focusedIndex;
|
|
909
974
|
var translate = "translateY(".concat(vs.translate, "px)");
|
|
975
|
+
if (groupField) {
|
|
976
|
+
dataItems = this.base.getGroupedDataModernMode(dataItems, groupField);
|
|
977
|
+
}
|
|
910
978
|
return (
|
|
911
979
|
// @ts-ignore function children
|
|
912
980
|
h(List, {
|
|
@@ -929,7 +997,9 @@ var MultiSelectVue2 = {
|
|
|
929
997
|
} : undefined,
|
|
930
998
|
skip: skip,
|
|
931
999
|
itemRender: itemRender,
|
|
932
|
-
|
|
1000
|
+
groupHeaderItemRender: groupHeaderItemRender,
|
|
1001
|
+
noDataRender: listNoDataRender,
|
|
1002
|
+
groupField: groupField
|
|
933
1003
|
},
|
|
934
1004
|
show: opened,
|
|
935
1005
|
dataItems: dataItems.slice(),
|
|
@@ -951,11 +1021,13 @@ var MultiSelectVue2 = {
|
|
|
951
1021
|
onListclick: this.handleItemClick,
|
|
952
1022
|
on: this.v3 ? undefined : {
|
|
953
1023
|
"listclick": this.handleItemClick,
|
|
954
|
-
"scroll":
|
|
1024
|
+
"scroll": this.onScroll
|
|
955
1025
|
},
|
|
956
1026
|
itemRender: itemRender,
|
|
1027
|
+
groupHeaderItemRender: groupHeaderItemRender,
|
|
957
1028
|
noDataRender: listNoDataRender,
|
|
958
|
-
|
|
1029
|
+
groupField: groupField,
|
|
1030
|
+
onScroll: this.onScroll
|
|
959
1031
|
}, this.v3 ? function () {
|
|
960
1032
|
return [renderScrollElement.call(_this2)];
|
|
961
1033
|
} : [renderScrollElement.call(_this2)])
|
|
@@ -977,6 +1049,7 @@ var MultiSelectVue2 = {
|
|
|
977
1049
|
dataItems = _c === void 0 ? [] : _c;
|
|
978
1050
|
var headerTemplate = templateRendering.call(this, this.$props.header, getListeners.call(this));
|
|
979
1051
|
var footerTemplate = templateRendering.call(this, this.$props.footer, getListeners.call(this));
|
|
1052
|
+
var groupStickyHeaderTemplate = templateRendering.call(this, this.$props.groupStickyHeaderItemRender, getListeners.call(this));
|
|
980
1053
|
var header = getTemplate.call(this, {
|
|
981
1054
|
h: h,
|
|
982
1055
|
template: headerTemplate
|
|
@@ -1011,6 +1084,9 @@ var MultiSelectVue2 = {
|
|
|
1011
1084
|
float: 'right'
|
|
1012
1085
|
}
|
|
1013
1086
|
})])]);
|
|
1087
|
+
if (this.group === undefined && this.$props.groupField !== undefined) {
|
|
1088
|
+
this.group = getItemValue(dataItems[0], this.$props.groupField);
|
|
1089
|
+
}
|
|
1014
1090
|
return (
|
|
1015
1091
|
// @ts-ignore function children
|
|
1016
1092
|
h(ListContainer, {
|
|
@@ -1048,12 +1124,26 @@ var MultiSelectVue2 = {
|
|
|
1048
1124
|
}, this.v3 ? function () {
|
|
1049
1125
|
return [header && h("div", {
|
|
1050
1126
|
"class": "k-list-header"
|
|
1051
|
-
}, [header]), customItem,
|
|
1127
|
+
}, [header]), customItem, _this3.group && dataItems.length !== 0 && h(GroupStickyHeader, {
|
|
1128
|
+
group: _this3.group,
|
|
1129
|
+
attrs: _this3.v3 ? undefined : {
|
|
1130
|
+
group: _this3.group,
|
|
1131
|
+
render: groupStickyHeaderTemplate
|
|
1132
|
+
},
|
|
1133
|
+
render: groupStickyHeaderTemplate
|
|
1134
|
+
}), renderList.call(_this3), footer && h("div", {
|
|
1052
1135
|
"class": "k-list-footer"
|
|
1053
1136
|
}, [footer]), virtual && header];
|
|
1054
1137
|
} : [header && h("div", {
|
|
1055
1138
|
"class": "k-list-header"
|
|
1056
|
-
}, [header]), customItem,
|
|
1139
|
+
}, [header]), customItem, _this3.group && dataItems.length !== 0 && h(GroupStickyHeader, {
|
|
1140
|
+
group: _this3.group,
|
|
1141
|
+
attrs: _this3.v3 ? undefined : {
|
|
1142
|
+
group: _this3.group,
|
|
1143
|
+
render: groupStickyHeaderTemplate
|
|
1144
|
+
},
|
|
1145
|
+
render: groupStickyHeaderTemplate
|
|
1146
|
+
}), renderList.call(_this3), footer && h("div", {
|
|
1057
1147
|
"class": "k-list-footer"
|
|
1058
1148
|
}, [footer]), virtual && header])
|
|
1059
1149
|
);
|
|
@@ -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
|
}
|
|
@@ -113,6 +113,26 @@ var DropDownBase = /** @class */function () {
|
|
|
113
113
|
return vs.enabled = true;
|
|
114
114
|
}, 10);
|
|
115
115
|
};
|
|
116
|
+
this.getGroupedDataModernMode = function (data, groupField) {
|
|
117
|
+
var newData = [];
|
|
118
|
+
data.forEach(function (el, index) {
|
|
119
|
+
var _a;
|
|
120
|
+
if (data[index - 1] && el[groupField] !== data[index - 1][groupField]) {
|
|
121
|
+
newData.push((_a = {}, _a[groupField] = el[groupField], _a));
|
|
122
|
+
newData.push(data[index]);
|
|
123
|
+
} else {
|
|
124
|
+
newData.push(data[index]);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
return newData;
|
|
128
|
+
};
|
|
129
|
+
this.resetGroupStickyHeader = function (groupName, that) {
|
|
130
|
+
var state = _this.initState();
|
|
131
|
+
if (groupName !== that.group && that.state) {
|
|
132
|
+
that.state.data.group = groupName;
|
|
133
|
+
_this.applyState(state);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
116
136
|
validatePackage(packageMetadata);
|
|
117
137
|
this.listBoxId = guid();
|
|
118
138
|
this.guid = 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,59 @@
|
|
|
1
|
+
var __assign = this && this.__assign || function () {
|
|
2
|
+
__assign = Object.assign || function (t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) {
|
|
6
|
+
if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
// @ts-ignore
|
|
14
|
+
import * as Vue from 'vue';
|
|
15
|
+
var allVue = Vue;
|
|
16
|
+
var gh = allVue.h;
|
|
17
|
+
var isV3 = allVue.version && allVue.version[0] === '3';
|
|
18
|
+
var ref = allVue.ref;
|
|
19
|
+
import { getTemplate } from '@progress/kendo-vue-common';
|
|
20
|
+
/**
|
|
21
|
+
* @hidden
|
|
22
|
+
*/
|
|
23
|
+
var GroupStickyHeaderVue2 = {
|
|
24
|
+
name: 'KendoGroupStickyHeader',
|
|
25
|
+
props: {
|
|
26
|
+
group: String,
|
|
27
|
+
render: Object
|
|
28
|
+
},
|
|
29
|
+
// @ts-ignore
|
|
30
|
+
setup: !isV3 ? undefined : function () {
|
|
31
|
+
var v3 = !!isV3;
|
|
32
|
+
return {
|
|
33
|
+
v3: v3
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
// @ts-ignore
|
|
37
|
+
render: function render(createElement) {
|
|
38
|
+
var h = gh || createElement;
|
|
39
|
+
var _a = this.$props,
|
|
40
|
+
group = _a.group,
|
|
41
|
+
render = _a.render;
|
|
42
|
+
var defaulGroupStickyHeader = h("div", {
|
|
43
|
+
"class": "k-list-group-sticky-header"
|
|
44
|
+
}, [h("div", {
|
|
45
|
+
"class": "k-list-header-text"
|
|
46
|
+
}, [group])]);
|
|
47
|
+
return getTemplate.call(this, {
|
|
48
|
+
h: h,
|
|
49
|
+
template: render,
|
|
50
|
+
defaultRendering: defaulGroupStickyHeader,
|
|
51
|
+
additionalProps: __assign({}, this.$props)
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* @hidden
|
|
57
|
+
*/
|
|
58
|
+
var GroupStickyHeader = GroupStickyHeaderVue2;
|
|
59
|
+
export { GroupStickyHeader, GroupStickyHeaderVue2 };
|
package/dist/es/common/List.d.ts
CHANGED
|
@@ -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
|