@progress/kendo-react-dropdowns 5.1.0-dev.202202230917 → 5.1.0-dev.202202240928

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.
@@ -107,6 +107,9 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
107
107
  _this.setState({
108
108
  group: group
109
109
  });
110
+ if (_this.props.onGroupScroll) {
111
+ _this.props.onGroupScroll.call(undefined, { group: group });
112
+ }
110
113
  }
111
114
  };
112
115
  _this.handleItemClick = function (index, event) {
@@ -379,9 +382,7 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
379
382
  _a['k-loading'] = loading,
380
383
  _a['k-required'] = this.required,
381
384
  _a['k-disabled'] = disabled,
382
- _a), className), ref: this.componentRef, style: !label
383
- ? style
384
- : __assign({}, style, { width: undefined }), dir: dir },
385
+ _a), className), ref: this.componentRef, style: !label ? style : __assign({}, style, { width: undefined }), dir: dir },
385
386
  this.renderSearchBar(inputText || '', id),
386
387
  renderClearButton && !loading && React.createElement(ClearButton, { onClick: this.clearButtonClick, key: "clearbutton" }),
387
388
  loading && React.createElement("span", { className: "k-icon k-i-loading", key: "loading" }),
@@ -509,7 +510,7 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
509
510
  ComboBoxWithoutContext.prototype.renderListContainer = function () {
510
511
  var _a;
511
512
  var base = this.base;
512
- var _b = this.props, dir = _b.dir, header = _b.header, footer = _b.footer, _c = _b.data, data = _c === void 0 ? [] : _c, groupField = _b.groupField, size = _b.size;
513
+ var _b = this.props, dir = _b.dir, header = _b.header, footer = _b.footer, _c = _b.data, data = _c === void 0 ? [] : _c, groupField = _b.groupField, size = _b.size, list = _b.list, virtual = _b.virtual;
513
514
  var opened = this.props.opened !== undefined ? this.props.opened : this.state.opened;
514
515
  var popupSettings = base.getPopupSettings();
515
516
  var popupWidth = popupSettings.width !== undefined ? popupSettings.width : base.popupWidth;
@@ -521,22 +522,27 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
521
522
  animate: popupSettings.animate,
522
523
  anchor: this.element,
523
524
  show: opened,
524
- popupClass: classNames(popupSettings.popupClass, 'k-list', (_a = {},
525
- _a["k-list-" + (sizeMap[size] || size)] = size,
526
- _a['k-virtual-list'] = this.base.vs.enabled,
527
- _a)),
525
+ popupClass: classNames(popupSettings.popupClass, 'k-reset'),
528
526
  className: popupSettings.className,
529
527
  appendTo: popupSettings.appendTo
530
528
  }, dir: dir !== undefined ? dir : this.base.dirCalculated, itemsCount: [data.length] },
531
- header && React.createElement("div", { className: "k-list-header" }, header),
532
- group && React.createElement("div", { className: "k-group-header" }, group),
533
- this.renderList(),
534
- footer && React.createElement("div", { className: "k-list-footer" }, footer)));
529
+ React.createElement("div", { className: classNames((_a = {},
530
+ _a['k-list'] = !list,
531
+ _a["k-list-" + (sizeMap[size] || size)] = !list && size,
532
+ _a['k-virtual-list'] = virtual,
533
+ _a['k-data-table'] = list,
534
+ _a["k-table-" + (sizeMap[size] || size)] = list && size,
535
+ _a)) },
536
+ header && React.createElement("div", { className: "k-table-header" }, header),
537
+ !list && group && React.createElement("div", { className: "k-list-group-sticky-header" }, group),
538
+ this.renderList(),
539
+ footer && React.createElement("div", { className: "k-list-footer" }, footer))));
535
540
  };
536
541
  ComboBoxWithoutContext.prototype.renderList = function () {
537
542
  var _this = this;
543
+ var _a;
538
544
  var base = this.base;
539
- var _a = this.props, textField = _a.textField, dataItemKey = _a.dataItemKey, listNoDataRender = _a.listNoDataRender, itemRender = _a.itemRender, _b = _a.data, data = _b === void 0 ? [] : _b, _c = _a.virtual, virtual = _c === void 0 ? { skip: 0 } : _c;
545
+ var _b = this.props, textField = _b.textField, dataItemKey = _b.dataItemKey, listNoDataRender = _b.listNoDataRender, itemRender = _b.itemRender, _c = _b.data, data = _c === void 0 ? [] : _c, _d = _b.virtual, virtual = _d === void 0 ? { skip: 0 } : _d;
540
546
  var popupSettings = base.getPopupSettings();
541
547
  var vs = base.vs;
542
548
  var skip = virtual.skip;
@@ -547,7 +553,10 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
547
553
  var selectedItemText = getItemValue(this.value, textField);
548
554
  var value = isPresent(text) && text !== selectedItemText ? null : this.value;
549
555
  var ListComponent = this.props.list || List;
550
- return (React.createElement(ListComponent, { id: base.listBoxId, show: opened, data: data, focusedIndex: focusedIndex, value: value, textField: textField, valueField: dataItemKey, groupField: this.props.groupField, optionsGuid: base.guid, listRef: function (list) { vs.list = _this.base.list = list; _this.itemHeight = 0; }, wrapperStyle: { maxHeight: popupSettings.height }, wrapperCssClass: "k-list-content", listStyle: vs.enabled ? { transform: translate } : undefined, key: "listkey", skip: skip, onClick: this.handleItemClick, itemRender: itemRender, noDataRender: listNoDataRender, onMouseDown: function (e) { return e.preventDefault(); }, onScroll: this.onScroll, wrapperRef: vs.scrollerRef, scroller: this.base.renderScrollElement() }));
556
+ return (React.createElement(ListComponent, { id: base.listBoxId, virtual: Boolean(virtual), show: opened, data: data, focusedIndex: focusedIndex, value: value, textField: textField, valueField: dataItemKey, groupField: this.props.groupField, optionsGuid: base.guid, listRef: function (list) { vs.list = _this.base.list = list; _this.itemHeight = 0; }, wrapperStyle: { maxHeight: popupSettings.height }, wrapperCssClass: classNames('k-list-content', (_a = {},
557
+ _a['k-list-scroller'] = !virtual,
558
+ _a['k-virtual-content'] = virtual,
559
+ _a)), listStyle: vs.enabled ? { transform: translate } : undefined, key: "listkey", skip: skip, onClick: this.handleItemClick, itemRender: itemRender, noDataRender: listNoDataRender, onMouseDown: function (e) { return e.preventDefault(); }, onScroll: this.onScroll, wrapperRef: vs.scrollerRef, scroller: this.base.renderScrollElement() }));
551
560
  };
552
561
  ComboBoxWithoutContext.prototype.renderSearchBar = function (text, id) {
553
562
  var _this = this;
@@ -209,6 +209,12 @@ export interface ComboBoxProps extends FormComponentProps {
209
209
  * Fires when the element which indicates no data in the popup is about to be rendered. Used to override the default appearance of the element.
210
210
  */
211
211
  listNoDataRender?: (element: React.ReactElement<HTMLDivElement>) => React.ReactNode;
212
+ /**
213
+ * @hidden
214
+ */
215
+ onGroupScroll?: (event: {
216
+ group?: string;
217
+ }) => void;
212
218
  /**
213
219
  * Sets the header component of the ComboBox ([see example]({% slug customrendering_combobox %}#toc-headers-and-footers)).
214
220
  */
@@ -139,6 +139,12 @@ export interface MultiColumnComboBoxProps extends ComboBoxProps {
139
139
  * Fires when both the virtual scrolling of the MultiColumnComboBox is enabled and the component requires data for another page.
140
140
  */
141
141
  onPageChange?: (event: ComboBoxPageChangeEvent) => void;
142
+ /**
143
+ * @hidden
144
+ */
145
+ onGroupScroll?: (event: {
146
+ group: string;
147
+ }) => void;
142
148
  /**
143
149
  * Fires when a MultiColumnComboBox list item is about to be rendered. Used to override the default appearance of the list items.
144
150
  */
@@ -21,9 +21,9 @@ var __rest = (this && this.__rest) || function (s, e) {
21
21
  import * as React from 'react';
22
22
  import * as PropTypes from 'prop-types';
23
23
  import { MultiColumnList } from './../common/MultiColumnList';
24
- import { classNames, getScrollbarWidth, setScrollbarWidth, kendoThemeMaps, getter, usePropsContext, createPropsContext } from '@progress/kendo-react-common';
24
+ import { classNames, getScrollbarWidth, setScrollbarWidth, getter, usePropsContext, createPropsContext } from '@progress/kendo-react-common';
25
25
  import { ComboBox, ComboBoxWithoutContext } from '../ComboBox/ComboBox';
26
- var sizeMap = kendoThemeMaps.sizeMap;
26
+ import { getItemValue } from '../common/utils';
27
27
  var columnWidth = function (width, defaultWidth) {
28
28
  if (width) {
29
29
  return typeof width === 'number' ? width + 'px' : width;
@@ -45,12 +45,11 @@ export var MultiColumnComboBoxPropsContext = createPropsContext();
45
45
  *
46
46
  */
47
47
  export var MultiColumnComboBox = React.forwardRef(function (directProps, ref) {
48
- var _a;
49
48
  var props = usePropsContext(MultiColumnComboBoxPropsContext, directProps);
50
49
  var target = React.useRef(null);
51
50
  var comboBoxRef = React.useRef(null);
52
51
  var scrollbarWidth = getScrollbarWidth();
53
- var _b = props.columns, columns = _b === void 0 ? defaultProps.columns : _b, _c = props.popupSettings, popupSettings = _c === void 0 ? defaultProps.popupSettings : _c, size = props.size, onOpen = props.onOpen, onClose = props.onClose, onFocus = props.onFocus, onBlur = props.onBlur, onChange = props.onChange, onFilterChange = props.onFilterChange, onPageChange = props.onPageChange, other = __rest(props, ["columns", "popupSettings", "size", "onOpen", "onClose", "onFocus", "onBlur", "onChange", "onFilterChange", "onPageChange"]);
52
+ var _a = props.columns, columns = _a === void 0 ? defaultProps.columns : _a, _b = props.popupSettings, popupSettings = _b === void 0 ? defaultProps.popupSettings : _b, size = props.size, onOpen = props.onOpen, onClose = props.onClose, onFocus = props.onFocus, onBlur = props.onBlur, onChange = props.onChange, onFilterChange = props.onFilterChange, onPageChange = props.onPageChange, other = __rest(props, ["columns", "popupSettings", "size", "onOpen", "onClose", "onFocus", "onBlur", "onChange", "onFilterChange", "onPageChange"]);
54
53
  React.useImperativeHandle(target, function () {
55
54
  return ({
56
55
  element: comboBoxRef.current && comboBoxRef.current.element,
@@ -65,12 +64,15 @@ export var MultiColumnComboBox = React.forwardRef(function (directProps, ref) {
65
64
  });
66
65
  });
67
66
  React.useImperativeHandle(ref, function () { return target.current; });
68
- var popupWidth = React.useMemo(function () {
69
- return "calc(" + columns.map(function (column) { return columnWidth(column.width, defaultProps.width); }).filter(Boolean).join(' + ') + " + " + scrollbarWidth + "px)";
70
- }, [columns, scrollbarWidth]);
71
- var header = React.useMemo(function () { return (React.createElement(React.Fragment, null,
72
- props.header,
73
- React.createElement("div", { className: "k-table-header" },
67
+ var initialGroupHeader = React.useMemo(function () {
68
+ if (initialGroupHeader === undefined && props.groupField !== undefined && props.data) {
69
+ return getItemValue(props.data[0], props.groupField);
70
+ }
71
+ }, [props.data, props.groupField]);
72
+ var _c = React.useState(initialGroupHeader), groupHeader = _c[0], setGroupHeader = _c[1];
73
+ var header = React.useMemo(function () {
74
+ return (React.createElement(React.Fragment, null,
75
+ props.header,
74
76
  React.createElement("div", { className: "k-table-header-wrap" },
75
77
  React.createElement("table", { className: "k-table", role: "presentation" },
76
78
  React.createElement("colgroup", null, columns.map(function (column, i) {
@@ -79,7 +81,14 @@ export var MultiColumnComboBox = React.forwardRef(function (directProps, ref) {
79
81
  React.createElement("thead", { className: 'k-table-thead' },
80
82
  React.createElement("tr", { className: 'k-table-row' }, columns.map(function (column, i) {
81
83
  return (React.createElement("th", { className: "k-table-th", key: column.uniqueKey ? column.uniqueKey : i }, column.header || '\u00A0'));
82
- })))))))); }, [props.header, columns]);
84
+ })),
85
+ groupHeader && React.createElement("tr", { className: 'k-table-group-row' },
86
+ React.createElement("th", { className: 'k-table-th', colSpan: columns.length }, groupHeader)))))));
87
+ }, [props.header, columns, groupHeader]);
88
+ var popupWidth = React.useMemo(function () {
89
+ // These additional 4px are coming from the child elements side borders (fixes horizontal scrollbar)
90
+ return "calc(" + columns.map(function (column) { return columnWidth(column.width, defaultProps.width); }).filter(Boolean).join(' + ') + " + " + scrollbarWidth + "px + 4px)";
91
+ }, [columns, scrollbarWidth]);
83
92
  var skip = props.virtual ? props.virtual.skip : 0;
84
93
  var itemRender = React.useCallback(function (li, liProps) {
85
94
  var children = columns.map(function (column, i) { return (React.createElement("span", { className: "k-table-td", style: { width: column.width ? column.width : defaultProps.width }, key: column.uniqueKey ? column.uniqueKey : i }, column.field ? getter(column.field)(liProps.dataItem) : '')); });
@@ -95,13 +104,14 @@ export var MultiColumnComboBox = React.forwardRef(function (directProps, ref) {
95
104
  }
96
105
  }
97
106
  if (group) {
98
- children.push(React.createElement("div", { key: "group", className: "k-cell k-group-cell" },
107
+ children.push(React.createElement("div", { key: "group", className: "k-table-td k-table-group-td" },
99
108
  React.createElement("span", null, group)));
100
109
  }
101
110
  var rendering = React.cloneElement(li, __assign({}, li.props, { className: classNames('k-table-row', {
102
111
  'k-table-alt-row': liProps.index % 2 !== 0,
103
112
  'k-focus': liProps.focused,
104
- 'k-selected': liProps.selected
113
+ 'k-selected': liProps.selected,
114
+ 'k-first': Boolean(group)
105
115
  }) }), children);
106
116
  return props.itemRender ? props.itemRender.call(undefined, rendering, liProps) : rendering;
107
117
  }, [columns, props.groupField, props.itemRender, props.data, skip]);
@@ -117,11 +127,12 @@ export var MultiColumnComboBox = React.forwardRef(function (directProps, ref) {
117
127
  var onChangeHandler = React.useCallback(function (event) { return handleEvent(onChange, event); }, [onChange]);
118
128
  var onFilterChangeHandler = React.useCallback(function (event) { return handleEvent(onFilterChange, event); }, [onFilterChange]);
119
129
  var onPageChangeHandler = React.useCallback(function (event) { return handleEvent(onPageChange, event); }, [onPageChange]);
130
+ var onGroupScroll = React.useCallback(function (event) {
131
+ setGroupHeader(event.group);
132
+ }, []);
120
133
  React.useEffect(function () { setScrollbarWidth(); });
121
134
  var List = React.useCallback(function (listProps) { return React.createElement(MultiColumnList, __assign({}, listProps)); }, []);
122
- return (React.createElement(ComboBox, __assign({}, other, { list: List, popupSettings: __assign({ width: popupWidth }, popupSettings, { popupClass: classNames('k-dropdowngrid-popup k-data-table', (_a = {},
123
- _a["k-table-" + (sizeMap[size] || size)] = size,
124
- _a)), className: popupSettings.className }), ref: comboBoxRef, header: header, itemRender: itemRender, size: props.size, rounded: props.rounded, fillMode: props.fillMode, onOpen: onOpenHandler, onClose: onCloseHandler, onFocus: onFocusHandler, onBlur: onBlurHandler, onChange: onChangeHandler, onFilterChange: onFilterChangeHandler, onPageChange: onPageChangeHandler })));
135
+ return (React.createElement(ComboBox, __assign({}, other, { list: List, popupSettings: __assign({ width: popupWidth }, popupSettings, { popupClass: 'k-dropdowngrid-popup k-reset', className: popupSettings.className }), ref: comboBoxRef, header: header, itemRender: itemRender, size: props.size, rounded: props.rounded, fillMode: props.fillMode, onOpen: onOpenHandler, onClose: onCloseHandler, onFocus: onFocusHandler, onBlur: onBlurHandler, onChange: onChangeHandler, onFilterChange: onFilterChangeHandler, onPageChange: onPageChangeHandler, onGroupScroll: onGroupScroll })));
125
136
  });
126
137
  var propTypes = __assign({}, ComboBoxWithoutContext.propTypes, { columns: PropTypes.any.isRequired });
127
138
  var defaultProps = {
@@ -6,6 +6,7 @@ import { LocalizationService } from '@progress/kendo-react-intl';
6
6
  */
7
7
  export interface ListProps {
8
8
  id?: string;
9
+ virtual?: boolean;
9
10
  show?: boolean;
10
11
  data: any[];
11
12
  value?: any;
@@ -26,7 +26,7 @@ var List = /** @class */ (function (_super) {
26
26
  }
27
27
  List.prototype.renderItems = function () {
28
28
  var _this = this;
29
- var _a = this.props, textField = _a.textField, valueField = _a.valueField, groupField = _a.groupField, optionsGuid = _a.optionsGuid, _b = _a.skip, skip = _b === void 0 ? 0 : _b, focusedIndex = _a.focusedIndex, _c = _a.highlightSelected, highlightSelected = _c === void 0 ? true : _c, value = _a.value, data = _a.data, itemRender = _a.itemRender;
29
+ var _a = this.props, textField = _a.textField, valueField = _a.valueField, groupField = _a.groupField, optionsGuid = _a.optionsGuid, _b = _a.skip, skip = _b === void 0 ? 0 : _b, virtual = _a.virtual, focusedIndex = _a.focusedIndex, _c = _a.highlightSelected, highlightSelected = _c === void 0 ? true : _c, value = _a.value, data = _a.data, itemRender = _a.itemRender;
30
30
  var isArray = Array.isArray(value);
31
31
  return data.map(function (item, index) {
32
32
  var realIndex = skip + index;
@@ -42,7 +42,7 @@ var List = /** @class */ (function (_super) {
42
42
  group = current;
43
43
  }
44
44
  }
45
- return (React.createElement(ListItem, { id: "option-" + optionsGuid + "-" + realIndex, dataItem: item, selected: selected, focused: focusedIndex === index, index: realIndex, key: realIndex, onClick: _this.props.onClick, textField: textField, group: group, render: itemRender }));
45
+ return (React.createElement(ListItem, { id: "option-" + optionsGuid + "-" + realIndex, virtual: virtual, dataItem: item, selected: selected, focused: focusedIndex === index, index: realIndex, key: realIndex, onClick: _this.props.onClick, textField: textField, group: group, render: itemRender }));
46
46
  });
47
47
  };
48
48
  List.prototype.renderNoValueElement = function (localizationService) {
@@ -58,7 +58,7 @@ var List = /** @class */ (function (_super) {
58
58
  var items = this.renderItems();
59
59
  return (items.length ? (React.createElement("div", { className: wrapperCssClass, style: wrapperStyle, ref: wrapperRef, onMouseDown: this.props.onMouseDown, onBlur: this.props.onBlur, onScroll: this.props.onScroll, unselectable: "on" },
60
60
  React.createElement("ul", { id: id, role: "listbox", "aria-hidden": !show ? true : undefined, className: listClassName, ref: listRef, style: listStyle }, items),
61
- this.props.scroller)) : this.renderNoValueElement(localizationService));
61
+ this.props.scroller && React.createElement("div", { className: "k-height-container" }, this.props.scroller))) : this.renderNoValueElement(localizationService));
62
62
  };
63
63
  return List;
64
64
  }(React.Component));
@@ -31,6 +31,10 @@ export interface ListItemProps {
31
31
  * Indicates the selected state of the list item element.
32
32
  */
33
33
  selected: boolean;
34
+ /**
35
+ * @hidden
36
+ */
37
+ virtual?: boolean;
34
38
  /**
35
39
  * Fires when the list item is about to be rendered. Used to override the default appearance of the list item.
36
40
  */
@@ -26,14 +26,14 @@ var ListItem = /** @class */ (function (_super) {
26
26
  return _this;
27
27
  }
28
28
  ListItem.prototype.render = function () {
29
- var _a = this.props, selected = _a.selected, group = _a.group, dataItem = _a.dataItem, renderer = _a.render;
29
+ var _a = this.props, selected = _a.selected, group = _a.group, dataItem = _a.dataItem, virtual = _a.virtual, renderer = _a.render;
30
30
  var item = (React.createElement("li", { id: this.props.id, role: "option", "aria-selected": selected, className: classNames('k-list-item', {
31
31
  'k-selected': selected,
32
32
  'k-focus': this.props.focused,
33
33
  'k-first': Boolean(group)
34
- }), onClick: this.handleClick, style: { position: 'unset' } },
34
+ }), onClick: this.handleClick, style: { position: virtual ? 'relative' : 'unset' } },
35
35
  React.createElement("span", { className: 'k-list-item-text' }, getItemValue(dataItem, this.props.textField).toString()),
36
- group !== undefined ? React.createElement("div", { className: "k-group" }, group) : null));
36
+ group !== undefined ? React.createElement("div", { className: "k-list-item-group-label" }, group) : null));
37
37
  return renderer !== undefined ? renderer.call(undefined, item, this.props) : item;
38
38
  };
39
39
  return ListItem;
@@ -15,5 +15,5 @@ import List from './List';
15
15
  * @hidden
16
16
  */
17
17
  export var MultiColumnList = function (props) {
18
- return (React.createElement(List, __assign({}, props, { wrapperCssClass: "k-table-scroller", listClassName: "k-table k-table-list", listStyle: __assign({}, props.listStyle) })));
18
+ return (React.createElement(List, __assign({}, props, { wrapperCssClass: "k-table-body k-table-scroller", listClassName: "k-table k-table-list", listStyle: __assign({}, props.listStyle) })));
19
19
  };
@@ -5,7 +5,7 @@ export var packageMetadata = {
5
5
  name: '@progress/kendo-react-dropdowns',
6
6
  productName: 'KendoReact',
7
7
  productCodes: ['KENDOUIREACT', 'KENDOUICOMPLETE'],
8
- publishDate: 1645606858,
8
+ publishDate: 1645693883,
9
9
  version: '',
10
10
  licensingDocsUrl: 'https://www.telerik.com/kendo-react-ui/my-license/?utm_medium=product&utm_source=kendoreact&utm_campaign=kendo-ui-react-purchase-license-keys-warning'
11
11
  };
@@ -109,6 +109,9 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
109
109
  _this.setState({
110
110
  group: group
111
111
  });
112
+ if (_this.props.onGroupScroll) {
113
+ _this.props.onGroupScroll.call(undefined, { group: group });
114
+ }
112
115
  }
113
116
  };
114
117
  _this.handleItemClick = function (index, event) {
@@ -381,9 +384,7 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
381
384
  _a['k-loading'] = loading,
382
385
  _a['k-required'] = this.required,
383
386
  _a['k-disabled'] = disabled,
384
- _a), className), ref: this.componentRef, style: !label
385
- ? style
386
- : __assign({}, style, { width: undefined }), dir: dir },
387
+ _a), className), ref: this.componentRef, style: !label ? style : __assign({}, style, { width: undefined }), dir: dir },
387
388
  this.renderSearchBar(inputText || '', id),
388
389
  renderClearButton && !loading && React.createElement(ClearButton_1.default, { onClick: this.clearButtonClick, key: "clearbutton" }),
389
390
  loading && React.createElement("span", { className: "k-icon k-i-loading", key: "loading" }),
@@ -511,7 +512,7 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
511
512
  ComboBoxWithoutContext.prototype.renderListContainer = function () {
512
513
  var _a;
513
514
  var base = this.base;
514
- var _b = this.props, dir = _b.dir, header = _b.header, footer = _b.footer, _c = _b.data, data = _c === void 0 ? [] : _c, groupField = _b.groupField, size = _b.size;
515
+ var _b = this.props, dir = _b.dir, header = _b.header, footer = _b.footer, _c = _b.data, data = _c === void 0 ? [] : _c, groupField = _b.groupField, size = _b.size, list = _b.list, virtual = _b.virtual;
515
516
  var opened = this.props.opened !== undefined ? this.props.opened : this.state.opened;
516
517
  var popupSettings = base.getPopupSettings();
517
518
  var popupWidth = popupSettings.width !== undefined ? popupSettings.width : base.popupWidth;
@@ -523,22 +524,27 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
523
524
  animate: popupSettings.animate,
524
525
  anchor: this.element,
525
526
  show: opened,
526
- popupClass: kendo_react_common_1.classNames(popupSettings.popupClass, 'k-list', (_a = {},
527
- _a["k-list-" + (sizeMap[size] || size)] = size,
528
- _a['k-virtual-list'] = this.base.vs.enabled,
529
- _a)),
527
+ popupClass: kendo_react_common_1.classNames(popupSettings.popupClass, 'k-reset'),
530
528
  className: popupSettings.className,
531
529
  appendTo: popupSettings.appendTo
532
530
  }, dir: dir !== undefined ? dir : this.base.dirCalculated, itemsCount: [data.length] },
533
- header && React.createElement("div", { className: "k-list-header" }, header),
534
- group && React.createElement("div", { className: "k-group-header" }, group),
535
- this.renderList(),
536
- footer && React.createElement("div", { className: "k-list-footer" }, footer)));
531
+ React.createElement("div", { className: kendo_react_common_1.classNames((_a = {},
532
+ _a['k-list'] = !list,
533
+ _a["k-list-" + (sizeMap[size] || size)] = !list && size,
534
+ _a['k-virtual-list'] = virtual,
535
+ _a['k-data-table'] = list,
536
+ _a["k-table-" + (sizeMap[size] || size)] = list && size,
537
+ _a)) },
538
+ header && React.createElement("div", { className: "k-table-header" }, header),
539
+ !list && group && React.createElement("div", { className: "k-list-group-sticky-header" }, group),
540
+ this.renderList(),
541
+ footer && React.createElement("div", { className: "k-list-footer" }, footer))));
537
542
  };
538
543
  ComboBoxWithoutContext.prototype.renderList = function () {
539
544
  var _this = this;
545
+ var _a;
540
546
  var base = this.base;
541
- var _a = this.props, textField = _a.textField, dataItemKey = _a.dataItemKey, listNoDataRender = _a.listNoDataRender, itemRender = _a.itemRender, _b = _a.data, data = _b === void 0 ? [] : _b, _c = _a.virtual, virtual = _c === void 0 ? { skip: 0 } : _c;
547
+ var _b = this.props, textField = _b.textField, dataItemKey = _b.dataItemKey, listNoDataRender = _b.listNoDataRender, itemRender = _b.itemRender, _c = _b.data, data = _c === void 0 ? [] : _c, _d = _b.virtual, virtual = _d === void 0 ? { skip: 0 } : _d;
542
548
  var popupSettings = base.getPopupSettings();
543
549
  var vs = base.vs;
544
550
  var skip = virtual.skip;
@@ -549,7 +555,10 @@ var ComboBoxWithoutContext = /** @class */ (function (_super) {
549
555
  var selectedItemText = utils_1.getItemValue(this.value, textField);
550
556
  var value = utils_1.isPresent(text) && text !== selectedItemText ? null : this.value;
551
557
  var ListComponent = this.props.list || List_1.default;
552
- return (React.createElement(ListComponent, { id: base.listBoxId, show: opened, data: data, focusedIndex: focusedIndex, value: value, textField: textField, valueField: dataItemKey, groupField: this.props.groupField, optionsGuid: base.guid, listRef: function (list) { vs.list = _this.base.list = list; _this.itemHeight = 0; }, wrapperStyle: { maxHeight: popupSettings.height }, wrapperCssClass: "k-list-content", listStyle: vs.enabled ? { transform: translate } : undefined, key: "listkey", skip: skip, onClick: this.handleItemClick, itemRender: itemRender, noDataRender: listNoDataRender, onMouseDown: function (e) { return e.preventDefault(); }, onScroll: this.onScroll, wrapperRef: vs.scrollerRef, scroller: this.base.renderScrollElement() }));
558
+ return (React.createElement(ListComponent, { id: base.listBoxId, virtual: Boolean(virtual), show: opened, data: data, focusedIndex: focusedIndex, value: value, textField: textField, valueField: dataItemKey, groupField: this.props.groupField, optionsGuid: base.guid, listRef: function (list) { vs.list = _this.base.list = list; _this.itemHeight = 0; }, wrapperStyle: { maxHeight: popupSettings.height }, wrapperCssClass: kendo_react_common_1.classNames('k-list-content', (_a = {},
559
+ _a['k-list-scroller'] = !virtual,
560
+ _a['k-virtual-content'] = virtual,
561
+ _a)), listStyle: vs.enabled ? { transform: translate } : undefined, key: "listkey", skip: skip, onClick: this.handleItemClick, itemRender: itemRender, noDataRender: listNoDataRender, onMouseDown: function (e) { return e.preventDefault(); }, onScroll: this.onScroll, wrapperRef: vs.scrollerRef, scroller: this.base.renderScrollElement() }));
553
562
  };
554
563
  ComboBoxWithoutContext.prototype.renderSearchBar = function (text, id) {
555
564
  var _this = this;
@@ -209,6 +209,12 @@ export interface ComboBoxProps extends FormComponentProps {
209
209
  * Fires when the element which indicates no data in the popup is about to be rendered. Used to override the default appearance of the element.
210
210
  */
211
211
  listNoDataRender?: (element: React.ReactElement<HTMLDivElement>) => React.ReactNode;
212
+ /**
213
+ * @hidden
214
+ */
215
+ onGroupScroll?: (event: {
216
+ group?: string;
217
+ }) => void;
212
218
  /**
213
219
  * Sets the header component of the ComboBox ([see example]({% slug customrendering_combobox %}#toc-headers-and-footers)).
214
220
  */
@@ -139,6 +139,12 @@ export interface MultiColumnComboBoxProps extends ComboBoxProps {
139
139
  * Fires when both the virtual scrolling of the MultiColumnComboBox is enabled and the component requires data for another page.
140
140
  */
141
141
  onPageChange?: (event: ComboBoxPageChangeEvent) => void;
142
+ /**
143
+ * @hidden
144
+ */
145
+ onGroupScroll?: (event: {
146
+ group: string;
147
+ }) => void;
142
148
  /**
143
149
  * Fires when a MultiColumnComboBox list item is about to be rendered. Used to override the default appearance of the list items.
144
150
  */
@@ -25,7 +25,7 @@ var PropTypes = require("prop-types");
25
25
  var MultiColumnList_1 = require("./../common/MultiColumnList");
26
26
  var kendo_react_common_1 = require("@progress/kendo-react-common");
27
27
  var ComboBox_1 = require("../ComboBox/ComboBox");
28
- var sizeMap = kendo_react_common_1.kendoThemeMaps.sizeMap;
28
+ var utils_1 = require("../common/utils");
29
29
  var columnWidth = function (width, defaultWidth) {
30
30
  if (width) {
31
31
  return typeof width === 'number' ? width + 'px' : width;
@@ -47,12 +47,11 @@ exports.MultiColumnComboBoxPropsContext = kendo_react_common_1.createPropsContex
47
47
  *
48
48
  */
49
49
  exports.MultiColumnComboBox = React.forwardRef(function (directProps, ref) {
50
- var _a;
51
50
  var props = kendo_react_common_1.usePropsContext(exports.MultiColumnComboBoxPropsContext, directProps);
52
51
  var target = React.useRef(null);
53
52
  var comboBoxRef = React.useRef(null);
54
53
  var scrollbarWidth = kendo_react_common_1.getScrollbarWidth();
55
- var _b = props.columns, columns = _b === void 0 ? defaultProps.columns : _b, _c = props.popupSettings, popupSettings = _c === void 0 ? defaultProps.popupSettings : _c, size = props.size, onOpen = props.onOpen, onClose = props.onClose, onFocus = props.onFocus, onBlur = props.onBlur, onChange = props.onChange, onFilterChange = props.onFilterChange, onPageChange = props.onPageChange, other = __rest(props, ["columns", "popupSettings", "size", "onOpen", "onClose", "onFocus", "onBlur", "onChange", "onFilterChange", "onPageChange"]);
54
+ var _a = props.columns, columns = _a === void 0 ? defaultProps.columns : _a, _b = props.popupSettings, popupSettings = _b === void 0 ? defaultProps.popupSettings : _b, size = props.size, onOpen = props.onOpen, onClose = props.onClose, onFocus = props.onFocus, onBlur = props.onBlur, onChange = props.onChange, onFilterChange = props.onFilterChange, onPageChange = props.onPageChange, other = __rest(props, ["columns", "popupSettings", "size", "onOpen", "onClose", "onFocus", "onBlur", "onChange", "onFilterChange", "onPageChange"]);
56
55
  React.useImperativeHandle(target, function () {
57
56
  return ({
58
57
  element: comboBoxRef.current && comboBoxRef.current.element,
@@ -67,12 +66,15 @@ exports.MultiColumnComboBox = React.forwardRef(function (directProps, ref) {
67
66
  });
68
67
  });
69
68
  React.useImperativeHandle(ref, function () { return target.current; });
70
- var popupWidth = React.useMemo(function () {
71
- return "calc(" + columns.map(function (column) { return columnWidth(column.width, defaultProps.width); }).filter(Boolean).join(' + ') + " + " + scrollbarWidth + "px)";
72
- }, [columns, scrollbarWidth]);
73
- var header = React.useMemo(function () { return (React.createElement(React.Fragment, null,
74
- props.header,
75
- React.createElement("div", { className: "k-table-header" },
69
+ var initialGroupHeader = React.useMemo(function () {
70
+ if (initialGroupHeader === undefined && props.groupField !== undefined && props.data) {
71
+ return utils_1.getItemValue(props.data[0], props.groupField);
72
+ }
73
+ }, [props.data, props.groupField]);
74
+ var _c = React.useState(initialGroupHeader), groupHeader = _c[0], setGroupHeader = _c[1];
75
+ var header = React.useMemo(function () {
76
+ return (React.createElement(React.Fragment, null,
77
+ props.header,
76
78
  React.createElement("div", { className: "k-table-header-wrap" },
77
79
  React.createElement("table", { className: "k-table", role: "presentation" },
78
80
  React.createElement("colgroup", null, columns.map(function (column, i) {
@@ -81,7 +83,14 @@ exports.MultiColumnComboBox = React.forwardRef(function (directProps, ref) {
81
83
  React.createElement("thead", { className: 'k-table-thead' },
82
84
  React.createElement("tr", { className: 'k-table-row' }, columns.map(function (column, i) {
83
85
  return (React.createElement("th", { className: "k-table-th", key: column.uniqueKey ? column.uniqueKey : i }, column.header || '\u00A0'));
84
- })))))))); }, [props.header, columns]);
86
+ })),
87
+ groupHeader && React.createElement("tr", { className: 'k-table-group-row' },
88
+ React.createElement("th", { className: 'k-table-th', colSpan: columns.length }, groupHeader)))))));
89
+ }, [props.header, columns, groupHeader]);
90
+ var popupWidth = React.useMemo(function () {
91
+ // These additional 4px are coming from the child elements side borders (fixes horizontal scrollbar)
92
+ return "calc(" + columns.map(function (column) { return columnWidth(column.width, defaultProps.width); }).filter(Boolean).join(' + ') + " + " + scrollbarWidth + "px + 4px)";
93
+ }, [columns, scrollbarWidth]);
85
94
  var skip = props.virtual ? props.virtual.skip : 0;
86
95
  var itemRender = React.useCallback(function (li, liProps) {
87
96
  var children = columns.map(function (column, i) { return (React.createElement("span", { className: "k-table-td", style: { width: column.width ? column.width : defaultProps.width }, key: column.uniqueKey ? column.uniqueKey : i }, column.field ? kendo_react_common_1.getter(column.field)(liProps.dataItem) : '')); });
@@ -97,13 +106,14 @@ exports.MultiColumnComboBox = React.forwardRef(function (directProps, ref) {
97
106
  }
98
107
  }
99
108
  if (group) {
100
- children.push(React.createElement("div", { key: "group", className: "k-cell k-group-cell" },
109
+ children.push(React.createElement("div", { key: "group", className: "k-table-td k-table-group-td" },
101
110
  React.createElement("span", null, group)));
102
111
  }
103
112
  var rendering = React.cloneElement(li, __assign({}, li.props, { className: kendo_react_common_1.classNames('k-table-row', {
104
113
  'k-table-alt-row': liProps.index % 2 !== 0,
105
114
  'k-focus': liProps.focused,
106
- 'k-selected': liProps.selected
115
+ 'k-selected': liProps.selected,
116
+ 'k-first': Boolean(group)
107
117
  }) }), children);
108
118
  return props.itemRender ? props.itemRender.call(undefined, rendering, liProps) : rendering;
109
119
  }, [columns, props.groupField, props.itemRender, props.data, skip]);
@@ -119,11 +129,12 @@ exports.MultiColumnComboBox = React.forwardRef(function (directProps, ref) {
119
129
  var onChangeHandler = React.useCallback(function (event) { return handleEvent(onChange, event); }, [onChange]);
120
130
  var onFilterChangeHandler = React.useCallback(function (event) { return handleEvent(onFilterChange, event); }, [onFilterChange]);
121
131
  var onPageChangeHandler = React.useCallback(function (event) { return handleEvent(onPageChange, event); }, [onPageChange]);
132
+ var onGroupScroll = React.useCallback(function (event) {
133
+ setGroupHeader(event.group);
134
+ }, []);
122
135
  React.useEffect(function () { kendo_react_common_1.setScrollbarWidth(); });
123
136
  var List = React.useCallback(function (listProps) { return React.createElement(MultiColumnList_1.MultiColumnList, __assign({}, listProps)); }, []);
124
- return (React.createElement(ComboBox_1.ComboBox, __assign({}, other, { list: List, popupSettings: __assign({ width: popupWidth }, popupSettings, { popupClass: kendo_react_common_1.classNames('k-dropdowngrid-popup k-data-table', (_a = {},
125
- _a["k-table-" + (sizeMap[size] || size)] = size,
126
- _a)), className: popupSettings.className }), ref: comboBoxRef, header: header, itemRender: itemRender, size: props.size, rounded: props.rounded, fillMode: props.fillMode, onOpen: onOpenHandler, onClose: onCloseHandler, onFocus: onFocusHandler, onBlur: onBlurHandler, onChange: onChangeHandler, onFilterChange: onFilterChangeHandler, onPageChange: onPageChangeHandler })));
137
+ return (React.createElement(ComboBox_1.ComboBox, __assign({}, other, { list: List, popupSettings: __assign({ width: popupWidth }, popupSettings, { popupClass: 'k-dropdowngrid-popup k-reset', className: popupSettings.className }), ref: comboBoxRef, header: header, itemRender: itemRender, size: props.size, rounded: props.rounded, fillMode: props.fillMode, onOpen: onOpenHandler, onClose: onCloseHandler, onFocus: onFocusHandler, onBlur: onBlurHandler, onChange: onChangeHandler, onFilterChange: onFilterChangeHandler, onPageChange: onPageChangeHandler, onGroupScroll: onGroupScroll })));
127
138
  });
128
139
  var propTypes = __assign({}, ComboBox_1.ComboBoxWithoutContext.propTypes, { columns: PropTypes.any.isRequired });
129
140
  var defaultProps = {
@@ -6,6 +6,7 @@ import { LocalizationService } from '@progress/kendo-react-intl';
6
6
  */
7
7
  export interface ListProps {
8
8
  id?: string;
9
+ virtual?: boolean;
9
10
  show?: boolean;
10
11
  data: any[];
11
12
  value?: any;
@@ -28,7 +28,7 @@ var List = /** @class */ (function (_super) {
28
28
  }
29
29
  List.prototype.renderItems = function () {
30
30
  var _this = this;
31
- var _a = this.props, textField = _a.textField, valueField = _a.valueField, groupField = _a.groupField, optionsGuid = _a.optionsGuid, _b = _a.skip, skip = _b === void 0 ? 0 : _b, focusedIndex = _a.focusedIndex, _c = _a.highlightSelected, highlightSelected = _c === void 0 ? true : _c, value = _a.value, data = _a.data, itemRender = _a.itemRender;
31
+ var _a = this.props, textField = _a.textField, valueField = _a.valueField, groupField = _a.groupField, optionsGuid = _a.optionsGuid, _b = _a.skip, skip = _b === void 0 ? 0 : _b, virtual = _a.virtual, focusedIndex = _a.focusedIndex, _c = _a.highlightSelected, highlightSelected = _c === void 0 ? true : _c, value = _a.value, data = _a.data, itemRender = _a.itemRender;
32
32
  var isArray = Array.isArray(value);
33
33
  return data.map(function (item, index) {
34
34
  var realIndex = skip + index;
@@ -44,7 +44,7 @@ var List = /** @class */ (function (_super) {
44
44
  group = current;
45
45
  }
46
46
  }
47
- return (React.createElement(ListItem_1.default, { id: "option-" + optionsGuid + "-" + realIndex, dataItem: item, selected: selected, focused: focusedIndex === index, index: realIndex, key: realIndex, onClick: _this.props.onClick, textField: textField, group: group, render: itemRender }));
47
+ return (React.createElement(ListItem_1.default, { id: "option-" + optionsGuid + "-" + realIndex, virtual: virtual, dataItem: item, selected: selected, focused: focusedIndex === index, index: realIndex, key: realIndex, onClick: _this.props.onClick, textField: textField, group: group, render: itemRender }));
48
48
  });
49
49
  };
50
50
  List.prototype.renderNoValueElement = function (localizationService) {
@@ -60,7 +60,7 @@ var List = /** @class */ (function (_super) {
60
60
  var items = this.renderItems();
61
61
  return (items.length ? (React.createElement("div", { className: wrapperCssClass, style: wrapperStyle, ref: wrapperRef, onMouseDown: this.props.onMouseDown, onBlur: this.props.onBlur, onScroll: this.props.onScroll, unselectable: "on" },
62
62
  React.createElement("ul", { id: id, role: "listbox", "aria-hidden": !show ? true : undefined, className: listClassName, ref: listRef, style: listStyle }, items),
63
- this.props.scroller)) : this.renderNoValueElement(localizationService));
63
+ this.props.scroller && React.createElement("div", { className: "k-height-container" }, this.props.scroller))) : this.renderNoValueElement(localizationService));
64
64
  };
65
65
  return List;
66
66
  }(React.Component));
@@ -31,6 +31,10 @@ export interface ListItemProps {
31
31
  * Indicates the selected state of the list item element.
32
32
  */
33
33
  selected: boolean;
34
+ /**
35
+ * @hidden
36
+ */
37
+ virtual?: boolean;
34
38
  /**
35
39
  * Fires when the list item is about to be rendered. Used to override the default appearance of the list item.
36
40
  */
@@ -28,14 +28,14 @@ var ListItem = /** @class */ (function (_super) {
28
28
  return _this;
29
29
  }
30
30
  ListItem.prototype.render = function () {
31
- var _a = this.props, selected = _a.selected, group = _a.group, dataItem = _a.dataItem, renderer = _a.render;
31
+ var _a = this.props, selected = _a.selected, group = _a.group, dataItem = _a.dataItem, virtual = _a.virtual, renderer = _a.render;
32
32
  var item = (React.createElement("li", { id: this.props.id, role: "option", "aria-selected": selected, className: kendo_react_common_1.classNames('k-list-item', {
33
33
  'k-selected': selected,
34
34
  'k-focus': this.props.focused,
35
35
  'k-first': Boolean(group)
36
- }), onClick: this.handleClick, style: { position: 'unset' } },
36
+ }), onClick: this.handleClick, style: { position: virtual ? 'relative' : 'unset' } },
37
37
  React.createElement("span", { className: 'k-list-item-text' }, utils_1.getItemValue(dataItem, this.props.textField).toString()),
38
- group !== undefined ? React.createElement("div", { className: "k-group" }, group) : null));
38
+ group !== undefined ? React.createElement("div", { className: "k-list-item-group-label" }, group) : null));
39
39
  return renderer !== undefined ? renderer.call(undefined, item, this.props) : item;
40
40
  };
41
41
  return ListItem;
@@ -17,5 +17,5 @@ var List_1 = require("./List");
17
17
  * @hidden
18
18
  */
19
19
  exports.MultiColumnList = function (props) {
20
- return (React.createElement(List_1.default, __assign({}, props, { wrapperCssClass: "k-table-scroller", listClassName: "k-table k-table-list", listStyle: __assign({}, props.listStyle) })));
20
+ return (React.createElement(List_1.default, __assign({}, props, { wrapperCssClass: "k-table-body k-table-scroller", listClassName: "k-table k-table-list", listStyle: __assign({}, props.listStyle) })));
21
21
  };
@@ -7,7 +7,7 @@ exports.packageMetadata = {
7
7
  name: '@progress/kendo-react-dropdowns',
8
8
  productName: 'KendoReact',
9
9
  productCodes: ['KENDOUIREACT', 'KENDOUICOMPLETE'],
10
- publishDate: 1645606858,
10
+ publishDate: 1645693883,
11
11
  version: '',
12
12
  licensingDocsUrl: 'https://www.telerik.com/kendo-react-ui/my-license/?utm_medium=product&utm_source=kendoreact&utm_campaign=kendo-ui-react-purchase-license-keys-warning'
13
13
  };