@progress/kendo-react-data-tools 4.11.0 → 4.12.0-dev.202111220849
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-react-data-tools.js +1 -1
- package/dist/es/columnmenu/ColumnMenu.d.ts +3 -3
- package/dist/es/columnmenu/ColumnMenu.js +67 -42
- package/dist/es/header/HeaderRow.d.ts +2 -1
- package/dist/es/header/HeaderRow.js +8 -1
- package/dist/es/package-metadata.js +1 -1
- package/dist/npm/columnmenu/ColumnMenu.d.ts +3 -3
- package/dist/npm/columnmenu/ColumnMenu.js +67 -42
- package/dist/npm/header/HeaderRow.d.ts +2 -1
- package/dist/npm/header/HeaderRow.js +8 -1
- package/dist/npm/package-metadata.js +1 -1
- package/dist/systemjs/kendo-react-data-tools.js +1 -1
- package/package.json +10 -10
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
140
|
+
React.createElement(ColumnMenuFilterForm, { show: filterExpand, onSubmit: onFilterSubmit, onReset: onFilterReset },
|
|
128
141
|
FirstFilterComponent &&
|
|
129
|
-
React.createElement(FirstFilterComponent, { filter:
|
|
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:
|
|
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
|
|
149
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
|
162
|
-
|
|
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
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
|
175
|
-
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
|
188
|
-
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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<
|
|
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, {
|
|
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:
|
|
8
|
+
publishDate: 1637569911,
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
142
|
+
React.createElement(ColumnMenuFilterForm_1.ColumnMenuFilterForm, { show: filterExpand, onSubmit: onFilterSubmit, onReset: onFilterReset },
|
|
130
143
|
FirstFilterComponent &&
|
|
131
|
-
React.createElement(FirstFilterComponent, { filter:
|
|
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:
|
|
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
|
|
151
|
-
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
|
164
|
-
|
|
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
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
|
177
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
|
190
|
-
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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<
|
|
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, {
|
|
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:
|
|
10
|
+
publishDate: 1637569911,
|
|
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
|
};
|