@progress/kendo-react-data-tools 4.11.0-dev.202111172052 → 4.12.0

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.
@@ -19,11 +19,11 @@ export interface ColumnMenuProps {
19
19
  /**
20
20
  * Fires when the ColumnMenu filter is changed.
21
21
  */
22
- onFilterChange?: (event: React.SyntheticEvent<any>, filter: CompositeFilterDescriptor, field: string) => void;
22
+ onFilterChange?: (event: React.SyntheticEvent<any>, filter: CompositeFilterDescriptor[], field: string) => void;
23
23
  /**
24
24
  * The field to which the ColumnMenu is bound.
25
25
  */
26
- field: string;
26
+ field?: string;
27
27
  /**
28
28
  * If set to `true`, a button for sorting in `asc` direction will be rendered.
29
29
  */
@@ -52,7 +52,7 @@ export interface ColumnMenuProps {
52
52
  * `props` contains the column's field and the closeMenu function which closes the ColumnMenu.
53
53
  */
54
54
  itemsRender?: (defaultRendering: (React.ReactElement<HTMLDivElement> | null)[], props: {
55
- field: string;
55
+ field?: string;
56
56
  closeMenu: () => void;
57
57
  }) => React.ReactNode;
58
58
  /**
@@ -9,6 +9,15 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
18
+ t[p[i]] = s[p[i]];
19
+ return t;
20
+ };
12
21
  import * as React from 'react';
13
22
  import { Popup } from '@progress/kendo-react-popup';
14
23
  import { useLocalization } from '@progress/kendo-react-intl';
@@ -20,13 +29,14 @@ import { ColumnMenuFilterForm } from './ColumnMenuFilterForm';
20
29
  import { messages, columnMenuFilterTitle, columnMenuSortAscending, columnMenuSortDescending } from '../messages';
21
30
  import { validatePackage } from '@progress/kendo-react-common';
22
31
  import { packageMetadata } from '../package-metadata';
23
- var ColumnMenu = function (props) {
32
+ /** @hidden */
33
+ var ColumnMenuWrapper = function (props) {
24
34
  validatePackage(packageMetadata);
25
35
  var emptySort = React.useRef([]);
26
36
  var field = props.field, filter = props.filter, _a = props.sort, sort = _a === void 0 ? emptySort.current : _a, onSortChange = props.onSortChange, onFilterChange = props.onFilterChange, initialFilter = props.initialFilter, _b = props.sortAsc, sortAsc = _b === void 0 ? false : _b, _c = props.sortDesc, sortDesc = _c === void 0 ? false : _c, _d = props.filterContent, filterContent = _d === void 0 ? [] : _d, _e = props.expandFilters, expandFilters = _e === void 0 ? false : _e;
27
37
  var _f = React.useState(false), show = _f[0], setShow = _f[1];
28
38
  var _g = React.useState(expandFilters), filterExpand = _g[0], setFilterExpand = _g[1];
29
- var _h = React.useState(initialFilter(field)), currentFilter = _h[0], setCurrentFilter = _h[1];
39
+ var _h = React.useState(field && initialFilter ? initialFilter(field) : null), currentFilter = _h[0], setCurrentFilter = _h[1];
30
40
  var anchor = React.useRef(null);
31
41
  var popupRef = React.useRef(null);
32
42
  var blurTimeout = React.useRef(null);
@@ -43,10 +53,12 @@ var ColumnMenu = function (props) {
43
53
  var onFocus = React.useCallback(function () { return clearTimeout(blurTimeout.current); }, []);
44
54
  var onColumnMenuButtonClick = React.useCallback(function () {
45
55
  setShow(!show);
46
- setFilterExpand(!show ? expandFilters : false);
47
- setCurrentFilter(show ?
48
- currentFilter :
49
- (menuFilter() || initialFilter(field)));
56
+ if (field && initialFilter) {
57
+ setFilterExpand(!show ? expandFilters : false);
58
+ setCurrentFilter(show ?
59
+ currentFilter :
60
+ (menuFilter() || initialFilter(field)));
61
+ }
50
62
  }, [menuFilter, field, show, currentFilter, initialFilter, expandFilters]);
51
63
  React.useEffect(function () {
52
64
  if (show && popupRef.current) {
@@ -80,7 +92,7 @@ var ColumnMenu = function (props) {
80
92
  stateFilter.filters.splice(index, 1, nextFilter);
81
93
  setCurrentFilter(stateFilter);
82
94
  }, [currentFilter]);
83
- var onSubmit = React.useCallback(function (event) {
95
+ var onFilterSubmit = React.useCallback(function (event) {
84
96
  event.preventDefault();
85
97
  var newFilter = (filter || []).slice();
86
98
  var prev = menuFilter();
@@ -96,14 +108,16 @@ var ColumnMenu = function (props) {
96
108
  onFilterChange.call(undefined, event, newFilter, field);
97
109
  }
98
110
  }, [filter, currentFilter, field, onFilterChange, closeMenu, menuFilter]);
99
- var onReset = React.useCallback(function (event) {
111
+ var onFilterReset = React.useCallback(function (event) {
100
112
  var newFilter = (filter || []).slice();
101
113
  var prev = menuFilter();
102
114
  var index = prev ? newFilter.indexOf(prev) : -1;
103
115
  if (index >= 0) {
104
116
  newFilter.splice(index, 1);
105
117
  }
106
- setCurrentFilter(initialFilter(field));
118
+ if (initialFilter) {
119
+ setCurrentFilter(initialFilter(field));
120
+ }
107
121
  closeMenu();
108
122
  if (onFilterChange) {
109
123
  onFilterChange.call(undefined, event, newFilter, field);
@@ -111,10 +125,8 @@ var ColumnMenu = function (props) {
111
125
  }, [filter, field, onFilterChange, initialFilter, closeMenu, menuFilter]);
112
126
  var sortAscChange = React.useCallback(function (e) { return changeSort(e, 'asc'); }, [changeSort]);
113
127
  var sortDescChange = React.useCallback(function (e) { return changeSort(e, 'desc'); }, [changeSort]);
114
- var onLogicChange = React.useCallback(function (event) { return setCurrentFilter(__assign({}, currentFilter, { logic: event.value.logic })); }, [currentFilter]);
128
+ var onLogicChange = React.useCallback(function (event) { return currentFilter && setCurrentFilter(__assign({}, currentFilter, { logic: event.value.logic })); }, [currentFilter]);
115
129
  var currentSort = sort.find(function (d) { return d.field === field; }) || { dir: '' };
116
- var firstFilter = currentFilter.filters[0];
117
- var secondFilter = currentFilter.filters[1];
118
130
  var FirstFilterComponent = filterContent[0], FilterLogicComponent = filterContent[1], SecondFilterComponent = filterContent[2];
119
131
  var localization = useLocalization();
120
132
  var sorting = (sortAsc || sortDesc) ? (React.createElement("div", { className: "k-columnmenu-item-wrapper", key: "sorting" },
@@ -122,15 +134,16 @@ var ColumnMenu = function (props) {
122
134
  (React.createElement(ColumnMenuItem, { title: localization.toLanguageString(columnMenuSortAscending, messages[columnMenuSortAscending]), iconClass: "k-i-sort-asc-sm", selected: currentSort.dir === 'asc', onClick: sortAscChange })),
123
135
  sortDesc &&
124
136
  (React.createElement(ColumnMenuItem, { title: localization.toLanguageString(columnMenuSortDescending, messages[columnMenuSortDescending]), iconClass: "k-i-sort-desc-sm", selected: currentSort.dir === 'desc', onClick: sortDescChange })))) : null;
125
- var filtering = filterContent.length > 0 ? (React.createElement("div", { className: "k-columnmenu-item-wrapper", key: "filtering" },
137
+ // filter content empty when no field is supplied
138
+ var filtering = currentFilter && filterContent.length > 0 ? (React.createElement("div", { className: "k-columnmenu-item-wrapper", key: "filtering" },
126
139
  React.createElement(ColumnMenuItem, { iconClass: "k-i-filter", title: localization.toLanguageString(columnMenuFilterTitle, messages[columnMenuFilterTitle]), onClick: filterItemClick }),
127
- React.createElement(ColumnMenuFilterForm, { show: filterExpand, onSubmit: onSubmit, onReset: onReset },
140
+ React.createElement(ColumnMenuFilterForm, { show: filterExpand, onSubmit: onFilterSubmit, onReset: onFilterReset },
128
141
  FirstFilterComponent &&
129
- React.createElement(FirstFilterComponent, { filter: firstFilter, onFilterChange: filterChange }),
142
+ React.createElement(FirstFilterComponent, { filter: currentFilter.filters[0], onFilterChange: filterChange }),
130
143
  FilterLogicComponent &&
131
144
  React.createElement(FilterLogicComponent, { value: currentFilter.logic, onChange: onLogicChange }),
132
145
  SecondFilterComponent &&
133
- React.createElement(SecondFilterComponent, { filter: secondFilter, onFilterChange: filterChange })))) : null;
146
+ React.createElement(SecondFilterComponent, { filter: currentFilter.filters[1], onFilterChange: filterChange })))) : null;
134
147
  var menuItems = [sorting, filtering];
135
148
  var button = (React.createElement("span", { ref: anchor, onClick: onColumnMenuButtonClick, className: 'k-grid-column-menu k-grid-filter' + (Boolean(menuFilter()) ? ' k-state-active' : ''), key: "button" },
136
149
  React.createElement("span", { className: "k-icon k-i-more-vertical" })));
@@ -145,49 +158,61 @@ var ColumnMenu = function (props) {
145
158
  * The `ColumnMenuTextColumn` component. Use it for `string` type columns.
146
159
  */
147
160
  export var ColumnMenuTextColumn = function (props) {
148
- var initialFilter = React.useCallback(function (field) {
149
- return ({ logic: 'and', filters: [{ operator: 'contains', field: field, value: '' }, { operator: 'contains', field: field, value: '' }] });
161
+ var field = props.field, others = __rest(props, ["field"]);
162
+ var initialFilter = React.useCallback(function (currentField) {
163
+ return ({ logic: 'and', filters: [{ operator: 'contains', field: currentField, value: '' }, { operator: 'contains', field: currentField, value: '' }] });
150
164
  }, []);
151
- return (React.createElement(ColumnMenu, __assign({ sortAsc: true, sortDesc: true, filterContent: [
152
- ColumnMenuTextFilter,
153
- ColumnMenuFilterLogic,
154
- ColumnMenuTextFilter
155
- ], initialFilter: initialFilter }, props)));
165
+ var hasField = Boolean(props.field);
166
+ var filterContent = hasField ? [
167
+ ColumnMenuTextFilter,
168
+ ColumnMenuFilterLogic,
169
+ ColumnMenuTextFilter
170
+ ] : [];
171
+ return (React.createElement(ColumnMenuWrapper, __assign({ sortAsc: true && hasField, sortDesc: true && hasField, filterContent: filterContent, initialFilter: hasField ? initialFilter : undefined, field: field }, others)));
156
172
  };
157
173
  /**
158
174
  * The `ColumnMenuNumericColumn` component. Use it for `number` type columns.
159
175
  */
160
176
  export var ColumnMenuNumericColumn = function (props) {
161
- var initialFilter = React.useCallback(function (field) {
162
- return ({ logic: 'or', filters: [{ operator: 'eq', field: field, value: null }, { operator: 'eq', field: field, value: null }] });
177
+ var field = props.field, others = __rest(props, ["field"]);
178
+ var initialFilter = React.useCallback(function (currentField) {
179
+ return ({ logic: 'or', filters: [{ operator: 'eq', field: currentField, value: null }, { operator: 'eq', field: currentField, value: null }] });
163
180
  }, []);
164
- return (React.createElement(ColumnMenu, __assign({ sortAsc: true, sortDesc: true, filterContent: [
165
- ColumnMenuNumericFilter,
166
- ColumnMenuFilterLogic,
167
- ColumnMenuNumericFilter
168
- ], initialFilter: initialFilter }, props)));
181
+ var hasField = Boolean(props.field);
182
+ var filterContent = hasField ? [
183
+ ColumnMenuNumericFilter,
184
+ ColumnMenuFilterLogic,
185
+ ColumnMenuNumericFilter
186
+ ] : [];
187
+ return (React.createElement(ColumnMenuWrapper, __assign({ sortAsc: true && hasField, sortDesc: true && hasField, filterContent: filterContent, initialFilter: hasField ? initialFilter : undefined, field: field }, others)));
169
188
  };
170
189
  /**
171
190
  * The `ColumnMenuDateColumn` component. Use it for `Date` type columns.
172
191
  */
173
192
  export var ColumnMenuDateColumn = function (props) {
174
- var initialFilter = React.useCallback(function (field) {
175
- return ({ logic: 'or', filters: [{ operator: 'eq', field: field, value: null }, { operator: 'eq', field: field, value: null }] });
193
+ var field = props.field, others = __rest(props, ["field"]);
194
+ var initialFilter = React.useCallback(function (currentField) {
195
+ return ({ logic: 'or', filters: [{ operator: 'eq', field: currentField, value: null }, { operator: 'eq', field: currentField, value: null }] });
176
196
  }, []);
177
- return (React.createElement(ColumnMenu, __assign({ sortAsc: true, sortDesc: true, filterContent: [
178
- ColumnMenuDateFilter,
179
- ColumnMenuFilterLogic,
180
- ColumnMenuDateFilter
181
- ], initialFilter: initialFilter }, props)));
197
+ var hasField = Boolean(props.field);
198
+ var filterContent = hasField ? [
199
+ ColumnMenuDateFilter,
200
+ ColumnMenuFilterLogic,
201
+ ColumnMenuDateFilter
202
+ ] : [];
203
+ return (React.createElement(ColumnMenuWrapper, __assign({ sortAsc: true && hasField, sortDesc: true && hasField, filterContent: filterContent, initialFilter: hasField ? initialFilter : undefined, field: field }, others)));
182
204
  };
183
205
  /**
184
206
  * The `ColumnMenuBooleanColumn` component. Use it for `boolean` type columns.
185
207
  */
186
208
  export var ColumnMenuBooleanColumn = function (props) {
187
- var initialFilter = React.useCallback(function (field) {
188
- return ({ logic: 'and', filters: [{ operator: 'eq', field: field, value: false }] });
209
+ var field = props.field, others = __rest(props, ["field"]);
210
+ var initialFilter = React.useCallback(function (currentField) {
211
+ return ({ logic: 'and', filters: [{ operator: 'eq', field: currentField, value: false }] });
189
212
  }, []);
190
- return (React.createElement(ColumnMenu, __assign({ sortAsc: true, sortDesc: true, filterContent: [
191
- ColumnMenuBooleanFilter
192
- ], initialFilter: initialFilter }, props)));
213
+ var hasField = Boolean(props.field);
214
+ var filterContent = hasField ? [
215
+ ColumnMenuBooleanFilter
216
+ ] : [];
217
+ return (React.createElement(ColumnMenuWrapper, __assign({ sortAsc: true && hasField, sortDesc: true && hasField, filterContent: filterContent, initialFilter: hasField ? initialFilter : undefined, field: field }, others)));
193
218
  };
@@ -5,6 +5,7 @@ import { HeaderCellProps } from './HeaderCell';
5
5
  import { SortSettings } from './SortSettings';
6
6
  import { ColumnResize } from '../drag/ColumnResize';
7
7
  import { ColumnDraggableProps } from '../drag/ColumnDraggable';
8
+ import { ColumnMenuProps } from '../columnmenu';
8
9
  /**
9
10
  * @hidden
10
11
  */
@@ -17,7 +18,7 @@ export interface HeaderRowProps extends ColumnDraggableProps {
17
18
  selectionChange: (e: any) => void;
18
19
  cellRender?: (defaultRendering: React.ReactNode | null, props: HeaderCellProps) => React.ReactNode;
19
20
  columnResize?: ColumnResize;
20
- columnMenu?: React.ComponentType<any>;
21
+ columnMenu?: React.ComponentType<ColumnMenuProps>;
21
22
  columnMenuFilter?: CompositeFilterDescriptor[];
22
23
  columnMenuFilterChange?: (e: React.SyntheticEvent<any>, filter: CompositeFilterDescriptor[], field?: string) => void;
23
24
  }
@@ -115,11 +115,18 @@ var HeaderRow = /** @class */ (function (_super) {
115
115
  } : {
116
116
  role: 'presentation'
117
117
  };
118
+ var columnMenuProps = {
119
+ sort: _this.props.sort,
120
+ onSortChange: _this.props.sortChange,
121
+ filter: _this.props.columnMenuFilter,
122
+ onFilterChange: _this.props.columnMenuFilterChange,
123
+ field: column.field
124
+ };
118
125
  return (React.createElement(HeaderThElement, __assign({ key: index, colSpan: column.colSpan, rowSpan: column.rowSpan, className: className, style: style, columnId: column.id, navigatable: column.navigatable, onKeyDown: sortable && (function (e) { return _this.cellKeyDown(e, column); }) || undefined }, ariaAttrs),
119
126
  column.headerCell && React.createElement(column.headerCell, __assign({}, headerCellProps)),
120
127
  !column.headerCell && (React.createElement("span", { className: 'k-cell-inner' },
121
128
  React.createElement(HeaderCell, __assign({}, headerCellProps)),
122
- ColumnMenu && (React.createElement(ColumnMenu, { sort: _this.props.sort, onSortChange: _this.props.sortChange, filter: _this.props.columnMenuFilter, onFilterChange: _this.props.columnMenuFilterChange, field: column.field })))),
129
+ ColumnMenu && (React.createElement(ColumnMenu, __assign({}, columnMenuProps))))),
123
130
  columnResize && resizable &&
124
131
  React.createElement(ColumnResizer, { key: "ColumnResizer", resize: function (e, element, end) { return columnResize.dragHandler(e, column, element, end); } })));
125
132
  }); };
@@ -5,7 +5,7 @@ export var packageMetadata = {
5
5
  name: '@progress/kendo-react-data-tools',
6
6
  productName: 'KendoReact',
7
7
  productCodes: ['KENDOUIREACT', 'KENDOUICOMPLETE'],
8
- publishDate: 1637181394,
8
+ publishDate: 1637584493,
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
  };
@@ -19,11 +19,11 @@ export interface ColumnMenuProps {
19
19
  /**
20
20
  * Fires when the ColumnMenu filter is changed.
21
21
  */
22
- onFilterChange?: (event: React.SyntheticEvent<any>, filter: CompositeFilterDescriptor, field: string) => void;
22
+ onFilterChange?: (event: React.SyntheticEvent<any>, filter: CompositeFilterDescriptor[], field: string) => void;
23
23
  /**
24
24
  * The field to which the ColumnMenu is bound.
25
25
  */
26
- field: string;
26
+ field?: string;
27
27
  /**
28
28
  * If set to `true`, a button for sorting in `asc` direction will be rendered.
29
29
  */
@@ -52,7 +52,7 @@ export interface ColumnMenuProps {
52
52
  * `props` contains the column's field and the closeMenu function which closes the ColumnMenu.
53
53
  */
54
54
  itemsRender?: (defaultRendering: (React.ReactElement<HTMLDivElement> | null)[], props: {
55
- field: string;
55
+ field?: string;
56
56
  closeMenu: () => void;
57
57
  }) => React.ReactNode;
58
58
  /**
@@ -10,6 +10,15 @@ var __assign = (this && this.__assign) || function () {
10
10
  };
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
+ var __rest = (this && this.__rest) || function (s, e) {
14
+ var t = {};
15
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
+ t[p] = s[p];
17
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
19
+ t[p[i]] = s[p[i]];
20
+ return t;
21
+ };
13
22
  Object.defineProperty(exports, "__esModule", { value: true });
14
23
  var React = require("react");
15
24
  var kendo_react_popup_1 = require("@progress/kendo-react-popup");
@@ -22,13 +31,14 @@ var ColumnMenuFilterForm_1 = require("./ColumnMenuFilterForm");
22
31
  var messages_1 = require("../messages");
23
32
  var kendo_react_common_1 = require("@progress/kendo-react-common");
24
33
  var package_metadata_1 = require("../package-metadata");
25
- var ColumnMenu = function (props) {
34
+ /** @hidden */
35
+ var ColumnMenuWrapper = function (props) {
26
36
  kendo_react_common_1.validatePackage(package_metadata_1.packageMetadata);
27
37
  var emptySort = React.useRef([]);
28
38
  var field = props.field, filter = props.filter, _a = props.sort, sort = _a === void 0 ? emptySort.current : _a, onSortChange = props.onSortChange, onFilterChange = props.onFilterChange, initialFilter = props.initialFilter, _b = props.sortAsc, sortAsc = _b === void 0 ? false : _b, _c = props.sortDesc, sortDesc = _c === void 0 ? false : _c, _d = props.filterContent, filterContent = _d === void 0 ? [] : _d, _e = props.expandFilters, expandFilters = _e === void 0 ? false : _e;
29
39
  var _f = React.useState(false), show = _f[0], setShow = _f[1];
30
40
  var _g = React.useState(expandFilters), filterExpand = _g[0], setFilterExpand = _g[1];
31
- var _h = React.useState(initialFilter(field)), currentFilter = _h[0], setCurrentFilter = _h[1];
41
+ var _h = React.useState(field && initialFilter ? initialFilter(field) : null), currentFilter = _h[0], setCurrentFilter = _h[1];
32
42
  var anchor = React.useRef(null);
33
43
  var popupRef = React.useRef(null);
34
44
  var blurTimeout = React.useRef(null);
@@ -45,10 +55,12 @@ var ColumnMenu = function (props) {
45
55
  var onFocus = React.useCallback(function () { return clearTimeout(blurTimeout.current); }, []);
46
56
  var onColumnMenuButtonClick = React.useCallback(function () {
47
57
  setShow(!show);
48
- setFilterExpand(!show ? expandFilters : false);
49
- setCurrentFilter(show ?
50
- currentFilter :
51
- (menuFilter() || initialFilter(field)));
58
+ if (field && initialFilter) {
59
+ setFilterExpand(!show ? expandFilters : false);
60
+ setCurrentFilter(show ?
61
+ currentFilter :
62
+ (menuFilter() || initialFilter(field)));
63
+ }
52
64
  }, [menuFilter, field, show, currentFilter, initialFilter, expandFilters]);
53
65
  React.useEffect(function () {
54
66
  if (show && popupRef.current) {
@@ -82,7 +94,7 @@ var ColumnMenu = function (props) {
82
94
  stateFilter.filters.splice(index, 1, nextFilter);
83
95
  setCurrentFilter(stateFilter);
84
96
  }, [currentFilter]);
85
- var onSubmit = React.useCallback(function (event) {
97
+ var onFilterSubmit = React.useCallback(function (event) {
86
98
  event.preventDefault();
87
99
  var newFilter = (filter || []).slice();
88
100
  var prev = menuFilter();
@@ -98,14 +110,16 @@ var ColumnMenu = function (props) {
98
110
  onFilterChange.call(undefined, event, newFilter, field);
99
111
  }
100
112
  }, [filter, currentFilter, field, onFilterChange, closeMenu, menuFilter]);
101
- var onReset = React.useCallback(function (event) {
113
+ var onFilterReset = React.useCallback(function (event) {
102
114
  var newFilter = (filter || []).slice();
103
115
  var prev = menuFilter();
104
116
  var index = prev ? newFilter.indexOf(prev) : -1;
105
117
  if (index >= 0) {
106
118
  newFilter.splice(index, 1);
107
119
  }
108
- setCurrentFilter(initialFilter(field));
120
+ if (initialFilter) {
121
+ setCurrentFilter(initialFilter(field));
122
+ }
109
123
  closeMenu();
110
124
  if (onFilterChange) {
111
125
  onFilterChange.call(undefined, event, newFilter, field);
@@ -113,10 +127,8 @@ var ColumnMenu = function (props) {
113
127
  }, [filter, field, onFilterChange, initialFilter, closeMenu, menuFilter]);
114
128
  var sortAscChange = React.useCallback(function (e) { return changeSort(e, 'asc'); }, [changeSort]);
115
129
  var sortDescChange = React.useCallback(function (e) { return changeSort(e, 'desc'); }, [changeSort]);
116
- var onLogicChange = React.useCallback(function (event) { return setCurrentFilter(__assign({}, currentFilter, { logic: event.value.logic })); }, [currentFilter]);
130
+ var onLogicChange = React.useCallback(function (event) { return currentFilter && setCurrentFilter(__assign({}, currentFilter, { logic: event.value.logic })); }, [currentFilter]);
117
131
  var currentSort = sort.find(function (d) { return d.field === field; }) || { dir: '' };
118
- var firstFilter = currentFilter.filters[0];
119
- var secondFilter = currentFilter.filters[1];
120
132
  var FirstFilterComponent = filterContent[0], FilterLogicComponent = filterContent[1], SecondFilterComponent = filterContent[2];
121
133
  var localization = kendo_react_intl_1.useLocalization();
122
134
  var sorting = (sortAsc || sortDesc) ? (React.createElement("div", { className: "k-columnmenu-item-wrapper", key: "sorting" },
@@ -124,15 +136,16 @@ var ColumnMenu = function (props) {
124
136
  (React.createElement(ColumnMenuItem_1.ColumnMenuItem, { title: localization.toLanguageString(messages_1.columnMenuSortAscending, messages_1.messages[messages_1.columnMenuSortAscending]), iconClass: "k-i-sort-asc-sm", selected: currentSort.dir === 'asc', onClick: sortAscChange })),
125
137
  sortDesc &&
126
138
  (React.createElement(ColumnMenuItem_1.ColumnMenuItem, { title: localization.toLanguageString(messages_1.columnMenuSortDescending, messages_1.messages[messages_1.columnMenuSortDescending]), iconClass: "k-i-sort-desc-sm", selected: currentSort.dir === 'desc', onClick: sortDescChange })))) : null;
127
- var filtering = filterContent.length > 0 ? (React.createElement("div", { className: "k-columnmenu-item-wrapper", key: "filtering" },
139
+ // filter content empty when no field is supplied
140
+ var filtering = currentFilter && filterContent.length > 0 ? (React.createElement("div", { className: "k-columnmenu-item-wrapper", key: "filtering" },
128
141
  React.createElement(ColumnMenuItem_1.ColumnMenuItem, { iconClass: "k-i-filter", title: localization.toLanguageString(messages_1.columnMenuFilterTitle, messages_1.messages[messages_1.columnMenuFilterTitle]), onClick: filterItemClick }),
129
- React.createElement(ColumnMenuFilterForm_1.ColumnMenuFilterForm, { show: filterExpand, onSubmit: onSubmit, onReset: onReset },
142
+ React.createElement(ColumnMenuFilterForm_1.ColumnMenuFilterForm, { show: filterExpand, onSubmit: onFilterSubmit, onReset: onFilterReset },
130
143
  FirstFilterComponent &&
131
- React.createElement(FirstFilterComponent, { filter: firstFilter, onFilterChange: filterChange }),
144
+ React.createElement(FirstFilterComponent, { filter: currentFilter.filters[0], onFilterChange: filterChange }),
132
145
  FilterLogicComponent &&
133
146
  React.createElement(FilterLogicComponent, { value: currentFilter.logic, onChange: onLogicChange }),
134
147
  SecondFilterComponent &&
135
- React.createElement(SecondFilterComponent, { filter: secondFilter, onFilterChange: filterChange })))) : null;
148
+ React.createElement(SecondFilterComponent, { filter: currentFilter.filters[1], onFilterChange: filterChange })))) : null;
136
149
  var menuItems = [sorting, filtering];
137
150
  var button = (React.createElement("span", { ref: anchor, onClick: onColumnMenuButtonClick, className: 'k-grid-column-menu k-grid-filter' + (Boolean(menuFilter()) ? ' k-state-active' : ''), key: "button" },
138
151
  React.createElement("span", { className: "k-icon k-i-more-vertical" })));
@@ -147,49 +160,61 @@ var ColumnMenu = function (props) {
147
160
  * The `ColumnMenuTextColumn` component. Use it for `string` type columns.
148
161
  */
149
162
  exports.ColumnMenuTextColumn = function (props) {
150
- var initialFilter = React.useCallback(function (field) {
151
- return ({ logic: 'and', filters: [{ operator: 'contains', field: field, value: '' }, { operator: 'contains', field: field, value: '' }] });
163
+ var field = props.field, others = __rest(props, ["field"]);
164
+ var initialFilter = React.useCallback(function (currentField) {
165
+ return ({ logic: 'and', filters: [{ operator: 'contains', field: currentField, value: '' }, { operator: 'contains', field: currentField, value: '' }] });
152
166
  }, []);
153
- return (React.createElement(ColumnMenu, __assign({ sortAsc: true, sortDesc: true, filterContent: [
154
- ColumnMenuFilters_1.ColumnMenuTextFilter,
155
- ColumnMenuFilterLogic_1.ColumnMenuFilterLogic,
156
- ColumnMenuFilters_1.ColumnMenuTextFilter
157
- ], initialFilter: initialFilter }, props)));
167
+ var hasField = Boolean(props.field);
168
+ var filterContent = hasField ? [
169
+ ColumnMenuFilters_1.ColumnMenuTextFilter,
170
+ ColumnMenuFilterLogic_1.ColumnMenuFilterLogic,
171
+ ColumnMenuFilters_1.ColumnMenuTextFilter
172
+ ] : [];
173
+ return (React.createElement(ColumnMenuWrapper, __assign({ sortAsc: true && hasField, sortDesc: true && hasField, filterContent: filterContent, initialFilter: hasField ? initialFilter : undefined, field: field }, others)));
158
174
  };
159
175
  /**
160
176
  * The `ColumnMenuNumericColumn` component. Use it for `number` type columns.
161
177
  */
162
178
  exports.ColumnMenuNumericColumn = function (props) {
163
- var initialFilter = React.useCallback(function (field) {
164
- return ({ logic: 'or', filters: [{ operator: 'eq', field: field, value: null }, { operator: 'eq', field: field, value: null }] });
179
+ var field = props.field, others = __rest(props, ["field"]);
180
+ var initialFilter = React.useCallback(function (currentField) {
181
+ return ({ logic: 'or', filters: [{ operator: 'eq', field: currentField, value: null }, { operator: 'eq', field: currentField, value: null }] });
165
182
  }, []);
166
- return (React.createElement(ColumnMenu, __assign({ sortAsc: true, sortDesc: true, filterContent: [
167
- ColumnMenuFilters_1.ColumnMenuNumericFilter,
168
- ColumnMenuFilterLogic_1.ColumnMenuFilterLogic,
169
- ColumnMenuFilters_1.ColumnMenuNumericFilter
170
- ], initialFilter: initialFilter }, props)));
183
+ var hasField = Boolean(props.field);
184
+ var filterContent = hasField ? [
185
+ ColumnMenuFilters_1.ColumnMenuNumericFilter,
186
+ ColumnMenuFilterLogic_1.ColumnMenuFilterLogic,
187
+ ColumnMenuFilters_1.ColumnMenuNumericFilter
188
+ ] : [];
189
+ return (React.createElement(ColumnMenuWrapper, __assign({ sortAsc: true && hasField, sortDesc: true && hasField, filterContent: filterContent, initialFilter: hasField ? initialFilter : undefined, field: field }, others)));
171
190
  };
172
191
  /**
173
192
  * The `ColumnMenuDateColumn` component. Use it for `Date` type columns.
174
193
  */
175
194
  exports.ColumnMenuDateColumn = function (props) {
176
- var initialFilter = React.useCallback(function (field) {
177
- return ({ logic: 'or', filters: [{ operator: 'eq', field: field, value: null }, { operator: 'eq', field: field, value: null }] });
195
+ var field = props.field, others = __rest(props, ["field"]);
196
+ var initialFilter = React.useCallback(function (currentField) {
197
+ return ({ logic: 'or', filters: [{ operator: 'eq', field: currentField, value: null }, { operator: 'eq', field: currentField, value: null }] });
178
198
  }, []);
179
- return (React.createElement(ColumnMenu, __assign({ sortAsc: true, sortDesc: true, filterContent: [
180
- ColumnMenuFilters_1.ColumnMenuDateFilter,
181
- ColumnMenuFilterLogic_1.ColumnMenuFilterLogic,
182
- ColumnMenuFilters_1.ColumnMenuDateFilter
183
- ], initialFilter: initialFilter }, props)));
199
+ var hasField = Boolean(props.field);
200
+ var filterContent = hasField ? [
201
+ ColumnMenuFilters_1.ColumnMenuDateFilter,
202
+ ColumnMenuFilterLogic_1.ColumnMenuFilterLogic,
203
+ ColumnMenuFilters_1.ColumnMenuDateFilter
204
+ ] : [];
205
+ return (React.createElement(ColumnMenuWrapper, __assign({ sortAsc: true && hasField, sortDesc: true && hasField, filterContent: filterContent, initialFilter: hasField ? initialFilter : undefined, field: field }, others)));
184
206
  };
185
207
  /**
186
208
  * The `ColumnMenuBooleanColumn` component. Use it for `boolean` type columns.
187
209
  */
188
210
  exports.ColumnMenuBooleanColumn = function (props) {
189
- var initialFilter = React.useCallback(function (field) {
190
- return ({ logic: 'and', filters: [{ operator: 'eq', field: field, value: false }] });
211
+ var field = props.field, others = __rest(props, ["field"]);
212
+ var initialFilter = React.useCallback(function (currentField) {
213
+ return ({ logic: 'and', filters: [{ operator: 'eq', field: currentField, value: false }] });
191
214
  }, []);
192
- return (React.createElement(ColumnMenu, __assign({ sortAsc: true, sortDesc: true, filterContent: [
193
- ColumnMenuFilters_1.ColumnMenuBooleanFilter
194
- ], initialFilter: initialFilter }, props)));
215
+ var hasField = Boolean(props.field);
216
+ var filterContent = hasField ? [
217
+ ColumnMenuFilters_1.ColumnMenuBooleanFilter
218
+ ] : [];
219
+ return (React.createElement(ColumnMenuWrapper, __assign({ sortAsc: true && hasField, sortDesc: true && hasField, filterContent: filterContent, initialFilter: hasField ? initialFilter : undefined, field: field }, others)));
195
220
  };
@@ -5,6 +5,7 @@ import { HeaderCellProps } from './HeaderCell';
5
5
  import { SortSettings } from './SortSettings';
6
6
  import { ColumnResize } from '../drag/ColumnResize';
7
7
  import { ColumnDraggableProps } from '../drag/ColumnDraggable';
8
+ import { ColumnMenuProps } from '../columnmenu';
8
9
  /**
9
10
  * @hidden
10
11
  */
@@ -17,7 +18,7 @@ export interface HeaderRowProps extends ColumnDraggableProps {
17
18
  selectionChange: (e: any) => void;
18
19
  cellRender?: (defaultRendering: React.ReactNode | null, props: HeaderCellProps) => React.ReactNode;
19
20
  columnResize?: ColumnResize;
20
- columnMenu?: React.ComponentType<any>;
21
+ columnMenu?: React.ComponentType<ColumnMenuProps>;
21
22
  columnMenuFilter?: CompositeFilterDescriptor[];
22
23
  columnMenuFilterChange?: (e: React.SyntheticEvent<any>, filter: CompositeFilterDescriptor[], field?: string) => void;
23
24
  }
@@ -117,11 +117,18 @@ var HeaderRow = /** @class */ (function (_super) {
117
117
  } : {
118
118
  role: 'presentation'
119
119
  };
120
+ var columnMenuProps = {
121
+ sort: _this.props.sort,
122
+ onSortChange: _this.props.sortChange,
123
+ filter: _this.props.columnMenuFilter,
124
+ onFilterChange: _this.props.columnMenuFilterChange,
125
+ field: column.field
126
+ };
120
127
  return (React.createElement(HeaderThElement_1.HeaderThElement, __assign({ key: index, colSpan: column.colSpan, rowSpan: column.rowSpan, className: className, style: style, columnId: column.id, navigatable: column.navigatable, onKeyDown: sortable && (function (e) { return _this.cellKeyDown(e, column); }) || undefined }, ariaAttrs),
121
128
  column.headerCell && React.createElement(column.headerCell, __assign({}, headerCellProps)),
122
129
  !column.headerCell && (React.createElement("span", { className: 'k-cell-inner' },
123
130
  React.createElement(HeaderCell_1.HeaderCell, __assign({}, headerCellProps)),
124
- ColumnMenu && (React.createElement(ColumnMenu, { sort: _this.props.sort, onSortChange: _this.props.sortChange, filter: _this.props.columnMenuFilter, onFilterChange: _this.props.columnMenuFilterChange, field: column.field })))),
131
+ ColumnMenu && (React.createElement(ColumnMenu, __assign({}, columnMenuProps))))),
125
132
  columnResize && resizable &&
126
133
  React.createElement(ColumnResizer_1.ColumnResizer, { key: "ColumnResizer", resize: function (e, element, end) { return columnResize.dragHandler(e, column, element, end); } })));
127
134
  }); };
@@ -7,7 +7,7 @@ exports.packageMetadata = {
7
7
  name: '@progress/kendo-react-data-tools',
8
8
  productName: 'KendoReact',
9
9
  productCodes: ['KENDOUIREACT', 'KENDOUICOMPLETE'],
10
- publishDate: 1637181394,
10
+ publishDate: 1637584493,
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
  };