@itwin/itwinui-react 1.27.0 → 1.28.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.
- package/CHANGELOG.md +12 -0
- package/cjs/core/ButtonGroup/ButtonGroup.js +2 -4
- package/cjs/core/Buttons/SplitButton/SplitButton.js +5 -3
- package/cjs/core/Table/Table.d.ts +5 -0
- package/cjs/core/Table/Table.js +13 -5
- package/cjs/core/Table/TableRowMemoized.js +1 -1
- package/cjs/core/Table/filters/BaseFilter.js +3 -1
- package/cjs/core/Table/filters/FilterToggle.js +4 -3
- package/cjs/core/Table/hooks/useResizeColumns.js +2 -0
- package/esm/core/ButtonGroup/ButtonGroup.js +2 -4
- package/esm/core/Buttons/SplitButton/SplitButton.js +5 -3
- package/esm/core/Table/Table.d.ts +5 -0
- package/esm/core/Table/Table.js +13 -5
- package/esm/core/Table/TableRowMemoized.js +1 -1
- package/esm/core/Table/filters/BaseFilter.js +3 -1
- package/esm/core/Table/filters/FilterToggle.js +4 -3
- package/esm/core/Table/hooks/useResizeColumns.js +2 -0
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.28.0](https://www.github.com/iTwin/iTwinUI-react/compare/v1.27.0...v1.28.0) (2021-12-21)
|
|
4
|
+
|
|
5
|
+
### What's new
|
|
6
|
+
|
|
7
|
+
* **ButtonGroup:** Add support for input+button combo ([#492](https://www.github.com/iTwin/iTwinUI-react/issues/492), [#481](https://github.com/iTwin/iTwinUI-react/pull/481)) ([b8b15fd](https://www.github.com/iTwin/iTwinUI-react/commit/b8b15fd4a6f67fac03063a6fdeec1ea6216899c4))
|
|
8
|
+
* **Table:** Added zebra stripes to rows ([#478](https://www.github.com/iTwin/iTwinUI-react/issues/478)) ([76d3eda](https://www.github.com/iTwin/iTwinUI-react/commit/76d3eda5d14aab2b02187c58fab70e93878c73cc))
|
|
9
|
+
* **Table:** Proper support for horizontal scroll ([#495](https://www.github.com/iTwin/iTwinUI-react/issues/495)) ([079c2c0](https://www.github.com/iTwin/iTwinUI-react/commit/079c2c020be46f14ff41d407e81eee1487adfcab))
|
|
10
|
+
|
|
11
|
+
### Fixes
|
|
12
|
+
|
|
13
|
+
* **Table:** Prevents from triggering sort when filtering ([#487](https://www.github.com/iTwin/iTwinUI-react/issues/487)) ([d1e6165](https://www.github.com/iTwin/iTwinUI-react/commit/d1e61655bddffc37fa3f91b95766145f18392844))
|
|
14
|
+
|
|
3
15
|
## [1.27.0](https://www.github.com/iTwin/iTwinUI-react/compare/v1.26.1...v1.27.0) (2021-12-14)
|
|
4
16
|
|
|
5
17
|
### What's new
|
|
@@ -64,14 +64,12 @@ require("@itwin/itwinui-css/css/button.css");
|
|
|
64
64
|
*/
|
|
65
65
|
exports.ButtonGroup = react_1.default.forwardRef(function (props, ref) {
|
|
66
66
|
var children = props.children, className = props.className, style = props.style, overflowButton = props.overflowButton, rest = __rest(props, ["children", "className", "style", "overflowButton"]);
|
|
67
|
-
var items = react_1.default.useMemo(function () { return react_1.default.Children.
|
|
68
|
-
children,
|
|
69
|
-
]);
|
|
67
|
+
var items = react_1.default.useMemo(function () { var _a; return (_a = react_1.default.Children.map(children, function (child) { return react_1.default.createElement("div", null, child); })) !== null && _a !== void 0 ? _a : []; }, [children]);
|
|
70
68
|
(0, utils_1.useTheme)();
|
|
71
69
|
var _a = (0, utils_1.useOverflow)(items, !overflowButton), overflowRef = _a[0], visibleCount = _a[1];
|
|
72
70
|
var refs = (0, utils_1.useMergedRefs)(overflowRef, ref);
|
|
73
71
|
return (react_1.default.createElement("div", __assign({ className: (0, classnames_1.default)('iui-button-group', className), style: __assign(__assign({}, (!!overflowButton && { width: '100%' })), style), ref: refs }, rest), !!overflowButton && visibleCount < items.length ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
74
72
|
items.slice(0, visibleCount - 1),
|
|
75
|
-
overflowButton(visibleCount))) : (
|
|
73
|
+
overflowButton(visibleCount))) : (items)));
|
|
76
74
|
});
|
|
77
75
|
exports.default = exports.ButtonGroup;
|
|
@@ -63,9 +63,11 @@ var SplitButton = function (props) {
|
|
|
63
63
|
return (react_1.default.createElement("span", { className: (0, classnames_1.default)(className, 'iui-button-split-menu', {
|
|
64
64
|
'iui-disabled': props.disabled,
|
|
65
65
|
}), style: style, title: title, ref: ref },
|
|
66
|
-
react_1.default.createElement(
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
react_1.default.createElement("div", null,
|
|
67
|
+
react_1.default.createElement(Button_1.Button, __assign({ styleType: styleType, size: size, onClick: onClick }, rest), children)),
|
|
68
|
+
react_1.default.createElement("div", null,
|
|
69
|
+
react_1.default.createElement(DropdownMenu_1.DropdownMenu, { placement: menuPlacement, menuItems: menuItems, style: { minWidth: menuWidth }, onShow: react_1.default.useCallback(function () { return setIsMenuOpen(true); }, []), onHide: react_1.default.useCallback(function () { return setIsMenuOpen(false); }, []) },
|
|
70
|
+
react_1.default.createElement(IconButton_1.IconButton, { styleType: styleType, size: size, disabled: props.disabled }, isMenuOpen ? react_1.default.createElement(CaretUpSmall_1.default, null) : react_1.default.createElement(CaretDownSmall_1.default, null))))));
|
|
69
71
|
};
|
|
70
72
|
exports.SplitButton = SplitButton;
|
|
71
73
|
exports.default = exports.SplitButton;
|
|
@@ -155,6 +155,11 @@ export declare type TableProps<T extends Record<string, unknown> = Record<string
|
|
|
155
155
|
* @default false
|
|
156
156
|
*/
|
|
157
157
|
isResizable?: boolean;
|
|
158
|
+
/**
|
|
159
|
+
* Style of the table.
|
|
160
|
+
* @default 'default'
|
|
161
|
+
*/
|
|
162
|
+
styleType?: 'default' | 'zebra-rows';
|
|
158
163
|
} & Omit<CommonProps, 'title'>;
|
|
159
164
|
/**
|
|
160
165
|
* Table based on [react-table](https://react-table.tanstack.com/docs/api/overview).
|
package/cjs/core/Table/Table.js
CHANGED
|
@@ -93,9 +93,9 @@ var tableResizeEndAction = 'tableResizeEnd';
|
|
|
93
93
|
*/
|
|
94
94
|
var Table = function (props) {
|
|
95
95
|
var _a;
|
|
96
|
-
var data = props.data, columns = props.columns, _b = props.isLoading, isLoading = _b === void 0 ? false : _b, emptyTableContent = props.emptyTableContent, className = props.className, style = props.style, id = props.id, _c = props.isSelectable, isSelectable = _c === void 0 ? false : _c, onSelect = props.onSelect, onRowClick = props.onRowClick, _d = props.isSortable, isSortable = _d === void 0 ? false : _d, onSort = props.onSort, stateReducer = props.stateReducer, onBottomReached = props.onBottomReached, onRowInViewport = props.onRowInViewport, _e = props.intersectionMargin, intersectionMargin = _e === void 0 ? 300 : _e, subComponent = props.subComponent, onExpand = props.onExpand, onFilter = props.onFilter, emptyFilteredTableContent = props.emptyFilteredTableContent, filterFunctions = props.filterTypes, expanderCell = props.expanderCell, isRowDisabled = props.isRowDisabled, rowProps = props.rowProps, _f = props.density, density = _f === void 0 ? 'default' : _f, _g = props.selectSubRows, selectSubRows = _g === void 0 ? true : _g, getSubRows = props.getSubRows, _h = props.selectRowOnClick, selectRowOnClick = _h === void 0 ? true : _h, paginatorRenderer = props.paginatorRenderer, _j = props.pageSize, pageSize = _j === void 0 ? 25 : _j, _k = props.isResizable, isResizable = _k === void 0 ? false : _k, rest = __rest(props, ["data", "columns", "isLoading", "emptyTableContent", "className", "style", "id", "isSelectable", "onSelect", "onRowClick", "isSortable", "onSort", "stateReducer", "onBottomReached", "onRowInViewport", "intersectionMargin", "subComponent", "onExpand", "onFilter", "emptyFilteredTableContent", "filterTypes", "expanderCell", "isRowDisabled", "rowProps", "density", "selectSubRows", "getSubRows", "selectRowOnClick", "paginatorRenderer", "pageSize", "isResizable"]);
|
|
96
|
+
var data = props.data, columns = props.columns, _b = props.isLoading, isLoading = _b === void 0 ? false : _b, emptyTableContent = props.emptyTableContent, className = props.className, style = props.style, id = props.id, _c = props.isSelectable, isSelectable = _c === void 0 ? false : _c, onSelect = props.onSelect, onRowClick = props.onRowClick, _d = props.isSortable, isSortable = _d === void 0 ? false : _d, onSort = props.onSort, stateReducer = props.stateReducer, onBottomReached = props.onBottomReached, onRowInViewport = props.onRowInViewport, _e = props.intersectionMargin, intersectionMargin = _e === void 0 ? 300 : _e, subComponent = props.subComponent, onExpand = props.onExpand, onFilter = props.onFilter, emptyFilteredTableContent = props.emptyFilteredTableContent, filterFunctions = props.filterTypes, expanderCell = props.expanderCell, isRowDisabled = props.isRowDisabled, rowProps = props.rowProps, _f = props.density, density = _f === void 0 ? 'default' : _f, _g = props.selectSubRows, selectSubRows = _g === void 0 ? true : _g, getSubRows = props.getSubRows, _h = props.selectRowOnClick, selectRowOnClick = _h === void 0 ? true : _h, paginatorRenderer = props.paginatorRenderer, _j = props.pageSize, pageSize = _j === void 0 ? 25 : _j, _k = props.isResizable, isResizable = _k === void 0 ? false : _k, _l = props.styleType, styleType = _l === void 0 ? 'default' : _l, rest = __rest(props, ["data", "columns", "isLoading", "emptyTableContent", "className", "style", "id", "isSelectable", "onSelect", "onRowClick", "isSortable", "onSort", "stateReducer", "onBottomReached", "onRowInViewport", "intersectionMargin", "subComponent", "onExpand", "onFilter", "emptyFilteredTableContent", "filterTypes", "expanderCell", "isRowDisabled", "rowProps", "density", "selectSubRows", "getSubRows", "selectRowOnClick", "paginatorRenderer", "pageSize", "isResizable", "styleType"]);
|
|
97
97
|
(0, utils_1.useTheme)();
|
|
98
|
-
var
|
|
98
|
+
var _m = react_1.default.useState(), ownerDocument = _m[0], setOwnerDocument = _m[1];
|
|
99
99
|
var defaultColumn = react_1.default.useMemo(function () { return ({
|
|
100
100
|
maxWidth: 0,
|
|
101
101
|
minWidth: 0,
|
|
@@ -231,6 +231,8 @@ var Table = function (props) {
|
|
|
231
231
|
dispatch({ type: tableResizeEndAction, columnWidths: newColumnWidths_1 });
|
|
232
232
|
}
|
|
233
233
|
});
|
|
234
|
+
var headerRef = react_1.default.useRef(null);
|
|
235
|
+
var bodyRef = react_1.default.useRef(null);
|
|
234
236
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
235
237
|
react_1.default.createElement("div", __assign({ ref: function (element) {
|
|
236
238
|
setOwnerDocument(element === null || element === void 0 ? void 0 : element.ownerDocument);
|
|
@@ -241,7 +243,7 @@ var Table = function (props) {
|
|
|
241
243
|
className: (0, classnames_1.default)('iui-table', (_a = {}, _a["iui-" + density] = density !== 'default', _a), className),
|
|
242
244
|
style: style,
|
|
243
245
|
}), ariaDataAttributes),
|
|
244
|
-
react_1.default.createElement("div", { className: 'iui-table-header' }, headerGroups.slice(1).map(function (headerGroup) {
|
|
246
|
+
react_1.default.createElement("div", { className: 'iui-table-header', ref: headerRef }, headerGroups.slice(1).map(function (headerGroup) {
|
|
245
247
|
var headerGroupProps = headerGroup.getHeaderGroupProps({
|
|
246
248
|
className: 'iui-row',
|
|
247
249
|
});
|
|
@@ -264,8 +266,14 @@ var Table = function (props) {
|
|
|
264
266
|
})));
|
|
265
267
|
})),
|
|
266
268
|
react_1.default.createElement("div", __assign({}, getTableBodyProps({
|
|
267
|
-
className: 'iui-table-body',
|
|
268
|
-
|
|
269
|
+
className: (0, classnames_1.default)('iui-table-body', {
|
|
270
|
+
'iui-zebra-striping': styleType === 'zebra-rows',
|
|
271
|
+
}),
|
|
272
|
+
}), { ref: bodyRef, onScroll: function () {
|
|
273
|
+
if (headerRef.current && bodyRef.current) {
|
|
274
|
+
headerRef.current.scrollLeft = bodyRef.current.scrollLeft;
|
|
275
|
+
}
|
|
276
|
+
} }),
|
|
269
277
|
data.length !== 0 &&
|
|
270
278
|
page.map(function (row) {
|
|
271
279
|
prepareRow(row);
|
|
@@ -40,7 +40,7 @@ var TableRow = function (props) {
|
|
|
40
40
|
rootMargin: intersectionMargin + "px",
|
|
41
41
|
});
|
|
42
42
|
var userRowProps = rowProps === null || rowProps === void 0 ? void 0 : rowProps(row);
|
|
43
|
-
var mergedProps = __assign(__assign(__assign({}, row.getRowProps({ style: { flex: "0 0 auto" } })), userRowProps), {
|
|
43
|
+
var mergedProps = __assign(__assign(__assign({}, row.getRowProps({ style: { flex: "0 0 auto", minWidth: '100%' } })), userRowProps), {
|
|
44
44
|
className: (0, classnames_1.default)('iui-row', {
|
|
45
45
|
'iui-selected': row.isSelected,
|
|
46
46
|
'iui-row-expanded': row.isExpanded && subComponent,
|
|
@@ -29,7 +29,9 @@ var utils_1 = require("../../utils");
|
|
|
29
29
|
var BaseFilter = function (props) {
|
|
30
30
|
var children = props.children, className = props.className, style = props.style, id = props.id;
|
|
31
31
|
(0, utils_1.useTheme)();
|
|
32
|
-
return (react_1.default.createElement("div", { className: (0, classnames_1.default)('iui-column-filter', className), style: style,
|
|
32
|
+
return (react_1.default.createElement("div", { className: (0, classnames_1.default)('iui-column-filter', className), style: style,
|
|
33
|
+
// Prevents from triggering sort
|
|
34
|
+
onMouseDown: function (e) {
|
|
33
35
|
e.stopPropagation();
|
|
34
36
|
}, id: id }, children));
|
|
35
37
|
};
|
|
@@ -54,9 +54,10 @@ var FilterToggle = function (props) {
|
|
|
54
54
|
close();
|
|
55
55
|
}, [close, column]);
|
|
56
56
|
return (react_1.default.createElement(react_1.default.Fragment, null, column.canFilter && column.Filter && (react_1.default.createElement(utils_1.Popover, { content: column.render('Filter', { close: close, setFilter: setFilter, clearFilter: clearFilter }), placement: 'bottom-start', visible: isVisible, onClickOutside: close, appendTo: ownerDocument === null || ownerDocument === void 0 ? void 0 : ownerDocument.body },
|
|
57
|
-
react_1.default.createElement(Buttons_1.IconButton, __assign({ styleType: 'borderless', isActive: isVisible || column.filterValue, className: (0, classnames_1.default)('iui-filter-button', className), onClick: function (
|
|
58
|
-
e.stopPropagation();
|
|
57
|
+
react_1.default.createElement(Buttons_1.IconButton, __assign({ styleType: 'borderless', isActive: isVisible || column.filterValue, className: (0, classnames_1.default)('iui-filter-button', className), onClick: function () {
|
|
59
58
|
setIsVisible(function (v) { return !v; });
|
|
60
|
-
}
|
|
59
|
+
},
|
|
60
|
+
// Prevents from triggering sort
|
|
61
|
+
onMouseDown: function (e) { return e.stopPropagation(); } }, rest), column.filterValue ? react_1.default.createElement(Filter_1.default, null) : react_1.default.createElement(FilterHollow_1.default, null))))));
|
|
61
62
|
};
|
|
62
63
|
exports.FilterToggle = FilterToggle;
|
|
@@ -114,11 +114,13 @@ var defaultGetResizerProps = function (ownerDocument) { return function (props,
|
|
|
114
114
|
{
|
|
115
115
|
onMouseDown: function (e) {
|
|
116
116
|
e.persist();
|
|
117
|
+
// Prevents from triggering sort
|
|
117
118
|
e.stopPropagation();
|
|
118
119
|
onResizeStart(e, header);
|
|
119
120
|
},
|
|
120
121
|
onTouchStart: function (e) {
|
|
121
122
|
e.persist();
|
|
123
|
+
// Prevents from triggering sort
|
|
122
124
|
e.stopPropagation();
|
|
123
125
|
onResizeStart(e, header);
|
|
124
126
|
},
|
|
@@ -58,14 +58,12 @@ import '@itwin/itwinui-css/css/button.css';
|
|
|
58
58
|
*/
|
|
59
59
|
export var ButtonGroup = React.forwardRef(function (props, ref) {
|
|
60
60
|
var children = props.children, className = props.className, style = props.style, overflowButton = props.overflowButton, rest = __rest(props, ["children", "className", "style", "overflowButton"]);
|
|
61
|
-
var items = React.useMemo(function () { return React.Children.
|
|
62
|
-
children,
|
|
63
|
-
]);
|
|
61
|
+
var items = React.useMemo(function () { var _a; return (_a = React.Children.map(children, function (child) { return React.createElement("div", null, child); })) !== null && _a !== void 0 ? _a : []; }, [children]);
|
|
64
62
|
useTheme();
|
|
65
63
|
var _a = useOverflow(items, !overflowButton), overflowRef = _a[0], visibleCount = _a[1];
|
|
66
64
|
var refs = useMergedRefs(overflowRef, ref);
|
|
67
65
|
return (React.createElement("div", __assign({ className: cx('iui-button-group', className), style: __assign(__assign({}, (!!overflowButton && { width: '100%' })), style), ref: refs }, rest), !!overflowButton && visibleCount < items.length ? (React.createElement(React.Fragment, null,
|
|
68
66
|
items.slice(0, visibleCount - 1),
|
|
69
|
-
overflowButton(visibleCount))) : (
|
|
67
|
+
overflowButton(visibleCount))) : (items)));
|
|
70
68
|
});
|
|
71
69
|
export default ButtonGroup;
|
|
@@ -57,8 +57,10 @@ export var SplitButton = function (props) {
|
|
|
57
57
|
return (React.createElement("span", { className: cx(className, 'iui-button-split-menu', {
|
|
58
58
|
'iui-disabled': props.disabled,
|
|
59
59
|
}), style: style, title: title, ref: ref },
|
|
60
|
-
React.createElement(
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
React.createElement("div", null,
|
|
61
|
+
React.createElement(Button, __assign({ styleType: styleType, size: size, onClick: onClick }, rest), children)),
|
|
62
|
+
React.createElement("div", null,
|
|
63
|
+
React.createElement(DropdownMenu, { placement: menuPlacement, menuItems: menuItems, style: { minWidth: menuWidth }, onShow: React.useCallback(function () { return setIsMenuOpen(true); }, []), onHide: React.useCallback(function () { return setIsMenuOpen(false); }, []) },
|
|
64
|
+
React.createElement(IconButton, { styleType: styleType, size: size, disabled: props.disabled }, isMenuOpen ? React.createElement(SvgCaretUpSmall, null) : React.createElement(SvgCaretDownSmall, null))))));
|
|
63
65
|
};
|
|
64
66
|
export default SplitButton;
|
|
@@ -155,6 +155,11 @@ export declare type TableProps<T extends Record<string, unknown> = Record<string
|
|
|
155
155
|
* @default false
|
|
156
156
|
*/
|
|
157
157
|
isResizable?: boolean;
|
|
158
|
+
/**
|
|
159
|
+
* Style of the table.
|
|
160
|
+
* @default 'default'
|
|
161
|
+
*/
|
|
162
|
+
styleType?: 'default' | 'zebra-rows';
|
|
158
163
|
} & Omit<CommonProps, 'title'>;
|
|
159
164
|
/**
|
|
160
165
|
* Table based on [react-table](https://react-table.tanstack.com/docs/api/overview).
|
package/esm/core/Table/Table.js
CHANGED
|
@@ -87,9 +87,9 @@ var tableResizeEndAction = 'tableResizeEnd';
|
|
|
87
87
|
*/
|
|
88
88
|
export var Table = function (props) {
|
|
89
89
|
var _a;
|
|
90
|
-
var data = props.data, columns = props.columns, _b = props.isLoading, isLoading = _b === void 0 ? false : _b, emptyTableContent = props.emptyTableContent, className = props.className, style = props.style, id = props.id, _c = props.isSelectable, isSelectable = _c === void 0 ? false : _c, onSelect = props.onSelect, onRowClick = props.onRowClick, _d = props.isSortable, isSortable = _d === void 0 ? false : _d, onSort = props.onSort, stateReducer = props.stateReducer, onBottomReached = props.onBottomReached, onRowInViewport = props.onRowInViewport, _e = props.intersectionMargin, intersectionMargin = _e === void 0 ? 300 : _e, subComponent = props.subComponent, onExpand = props.onExpand, onFilter = props.onFilter, emptyFilteredTableContent = props.emptyFilteredTableContent, filterFunctions = props.filterTypes, expanderCell = props.expanderCell, isRowDisabled = props.isRowDisabled, rowProps = props.rowProps, _f = props.density, density = _f === void 0 ? 'default' : _f, _g = props.selectSubRows, selectSubRows = _g === void 0 ? true : _g, getSubRows = props.getSubRows, _h = props.selectRowOnClick, selectRowOnClick = _h === void 0 ? true : _h, paginatorRenderer = props.paginatorRenderer, _j = props.pageSize, pageSize = _j === void 0 ? 25 : _j, _k = props.isResizable, isResizable = _k === void 0 ? false : _k, rest = __rest(props, ["data", "columns", "isLoading", "emptyTableContent", "className", "style", "id", "isSelectable", "onSelect", "onRowClick", "isSortable", "onSort", "stateReducer", "onBottomReached", "onRowInViewport", "intersectionMargin", "subComponent", "onExpand", "onFilter", "emptyFilteredTableContent", "filterTypes", "expanderCell", "isRowDisabled", "rowProps", "density", "selectSubRows", "getSubRows", "selectRowOnClick", "paginatorRenderer", "pageSize", "isResizable"]);
|
|
90
|
+
var data = props.data, columns = props.columns, _b = props.isLoading, isLoading = _b === void 0 ? false : _b, emptyTableContent = props.emptyTableContent, className = props.className, style = props.style, id = props.id, _c = props.isSelectable, isSelectable = _c === void 0 ? false : _c, onSelect = props.onSelect, onRowClick = props.onRowClick, _d = props.isSortable, isSortable = _d === void 0 ? false : _d, onSort = props.onSort, stateReducer = props.stateReducer, onBottomReached = props.onBottomReached, onRowInViewport = props.onRowInViewport, _e = props.intersectionMargin, intersectionMargin = _e === void 0 ? 300 : _e, subComponent = props.subComponent, onExpand = props.onExpand, onFilter = props.onFilter, emptyFilteredTableContent = props.emptyFilteredTableContent, filterFunctions = props.filterTypes, expanderCell = props.expanderCell, isRowDisabled = props.isRowDisabled, rowProps = props.rowProps, _f = props.density, density = _f === void 0 ? 'default' : _f, _g = props.selectSubRows, selectSubRows = _g === void 0 ? true : _g, getSubRows = props.getSubRows, _h = props.selectRowOnClick, selectRowOnClick = _h === void 0 ? true : _h, paginatorRenderer = props.paginatorRenderer, _j = props.pageSize, pageSize = _j === void 0 ? 25 : _j, _k = props.isResizable, isResizable = _k === void 0 ? false : _k, _l = props.styleType, styleType = _l === void 0 ? 'default' : _l, rest = __rest(props, ["data", "columns", "isLoading", "emptyTableContent", "className", "style", "id", "isSelectable", "onSelect", "onRowClick", "isSortable", "onSort", "stateReducer", "onBottomReached", "onRowInViewport", "intersectionMargin", "subComponent", "onExpand", "onFilter", "emptyFilteredTableContent", "filterTypes", "expanderCell", "isRowDisabled", "rowProps", "density", "selectSubRows", "getSubRows", "selectRowOnClick", "paginatorRenderer", "pageSize", "isResizable", "styleType"]);
|
|
91
91
|
useTheme();
|
|
92
|
-
var
|
|
92
|
+
var _m = React.useState(), ownerDocument = _m[0], setOwnerDocument = _m[1];
|
|
93
93
|
var defaultColumn = React.useMemo(function () { return ({
|
|
94
94
|
maxWidth: 0,
|
|
95
95
|
minWidth: 0,
|
|
@@ -225,6 +225,8 @@ export var Table = function (props) {
|
|
|
225
225
|
dispatch({ type: tableResizeEndAction, columnWidths: newColumnWidths_1 });
|
|
226
226
|
}
|
|
227
227
|
});
|
|
228
|
+
var headerRef = React.useRef(null);
|
|
229
|
+
var bodyRef = React.useRef(null);
|
|
228
230
|
return (React.createElement(React.Fragment, null,
|
|
229
231
|
React.createElement("div", __assign({ ref: function (element) {
|
|
230
232
|
setOwnerDocument(element === null || element === void 0 ? void 0 : element.ownerDocument);
|
|
@@ -235,7 +237,7 @@ export var Table = function (props) {
|
|
|
235
237
|
className: cx('iui-table', (_a = {}, _a["iui-" + density] = density !== 'default', _a), className),
|
|
236
238
|
style: style,
|
|
237
239
|
}), ariaDataAttributes),
|
|
238
|
-
React.createElement("div", { className: 'iui-table-header' }, headerGroups.slice(1).map(function (headerGroup) {
|
|
240
|
+
React.createElement("div", { className: 'iui-table-header', ref: headerRef }, headerGroups.slice(1).map(function (headerGroup) {
|
|
239
241
|
var headerGroupProps = headerGroup.getHeaderGroupProps({
|
|
240
242
|
className: 'iui-row',
|
|
241
243
|
});
|
|
@@ -258,8 +260,14 @@ export var Table = function (props) {
|
|
|
258
260
|
})));
|
|
259
261
|
})),
|
|
260
262
|
React.createElement("div", __assign({}, getTableBodyProps({
|
|
261
|
-
className: 'iui-table-body',
|
|
262
|
-
|
|
263
|
+
className: cx('iui-table-body', {
|
|
264
|
+
'iui-zebra-striping': styleType === 'zebra-rows',
|
|
265
|
+
}),
|
|
266
|
+
}), { ref: bodyRef, onScroll: function () {
|
|
267
|
+
if (headerRef.current && bodyRef.current) {
|
|
268
|
+
headerRef.current.scrollLeft = bodyRef.current.scrollLeft;
|
|
269
|
+
}
|
|
270
|
+
} }),
|
|
263
271
|
data.length !== 0 &&
|
|
264
272
|
page.map(function (row) {
|
|
265
273
|
prepareRow(row);
|
|
@@ -34,7 +34,7 @@ export var TableRow = function (props) {
|
|
|
34
34
|
rootMargin: intersectionMargin + "px",
|
|
35
35
|
});
|
|
36
36
|
var userRowProps = rowProps === null || rowProps === void 0 ? void 0 : rowProps(row);
|
|
37
|
-
var mergedProps = __assign(__assign(__assign({}, row.getRowProps({ style: { flex: "0 0 auto" } })), userRowProps), {
|
|
37
|
+
var mergedProps = __assign(__assign(__assign({}, row.getRowProps({ style: { flex: "0 0 auto", minWidth: '100%' } })), userRowProps), {
|
|
38
38
|
className: cx('iui-row', {
|
|
39
39
|
'iui-selected': row.isSelected,
|
|
40
40
|
'iui-row-expanded': row.isExpanded && subComponent,
|
|
@@ -23,7 +23,9 @@ import { useTheme } from '../../utils';
|
|
|
23
23
|
export var BaseFilter = function (props) {
|
|
24
24
|
var children = props.children, className = props.className, style = props.style, id = props.id;
|
|
25
25
|
useTheme();
|
|
26
|
-
return (React.createElement("div", { className: cx('iui-column-filter', className), style: style,
|
|
26
|
+
return (React.createElement("div", { className: cx('iui-column-filter', className), style: style,
|
|
27
|
+
// Prevents from triggering sort
|
|
28
|
+
onMouseDown: function (e) {
|
|
27
29
|
e.stopPropagation();
|
|
28
30
|
}, id: id }, children));
|
|
29
31
|
};
|
|
@@ -48,8 +48,9 @@ export var FilterToggle = function (props) {
|
|
|
48
48
|
close();
|
|
49
49
|
}, [close, column]);
|
|
50
50
|
return (React.createElement(React.Fragment, null, column.canFilter && column.Filter && (React.createElement(Popover, { content: column.render('Filter', { close: close, setFilter: setFilter, clearFilter: clearFilter }), placement: 'bottom-start', visible: isVisible, onClickOutside: close, appendTo: ownerDocument === null || ownerDocument === void 0 ? void 0 : ownerDocument.body },
|
|
51
|
-
React.createElement(IconButton, __assign({ styleType: 'borderless', isActive: isVisible || column.filterValue, className: cx('iui-filter-button', className), onClick: function (
|
|
52
|
-
e.stopPropagation();
|
|
51
|
+
React.createElement(IconButton, __assign({ styleType: 'borderless', isActive: isVisible || column.filterValue, className: cx('iui-filter-button', className), onClick: function () {
|
|
53
52
|
setIsVisible(function (v) { return !v; });
|
|
54
|
-
}
|
|
53
|
+
},
|
|
54
|
+
// Prevents from triggering sort
|
|
55
|
+
onMouseDown: function (e) { return e.stopPropagation(); } }, rest), column.filterValue ? React.createElement(SvgFilter, null) : React.createElement(SvgFilterHollow, null))))));
|
|
55
56
|
};
|
|
@@ -110,11 +110,13 @@ var defaultGetResizerProps = function (ownerDocument) { return function (props,
|
|
|
110
110
|
{
|
|
111
111
|
onMouseDown: function (e) {
|
|
112
112
|
e.persist();
|
|
113
|
+
// Prevents from triggering sort
|
|
113
114
|
e.stopPropagation();
|
|
114
115
|
onResizeStart(e, header);
|
|
115
116
|
},
|
|
116
117
|
onTouchStart: function (e) {
|
|
117
118
|
e.persist();
|
|
119
|
+
// Prevents from triggering sort
|
|
118
120
|
e.stopPropagation();
|
|
119
121
|
onResizeStart(e, header);
|
|
120
122
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/itwinui-react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.28.0",
|
|
4
4
|
"author": "Bentley Systems",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "cjs/index.js",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"build-storybook": "build-storybook"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@itwin/itwinui-css": "^0.
|
|
43
|
+
"@itwin/itwinui-css": "^0.43.0",
|
|
44
44
|
"@itwin/itwinui-icons-react": "^1.1.1",
|
|
45
45
|
"@itwin/itwinui-illustrations-react": "^1.0.1",
|
|
46
46
|
"@tippyjs/react": "^4.2.5",
|
|
@@ -63,6 +63,7 @@
|
|
|
63
63
|
"@testing-library/jest-dom": "^5.14.1",
|
|
64
64
|
"@testing-library/react": "^12.0.0",
|
|
65
65
|
"@testing-library/react-hooks": "^7.0.1",
|
|
66
|
+
"@testing-library/user-event": "^13.5.0",
|
|
66
67
|
"@types/classnames": "^2.2.7",
|
|
67
68
|
"@types/jest": "^27.0.0",
|
|
68
69
|
"@types/node": "^10.12.2",
|