@itwin/itwinui-react 1.33.0 → 1.34.1
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 +25 -0
- package/cjs/core/ButtonGroup/ButtonGroup.d.ts +0 -2
- package/cjs/core/ButtonGroup/ButtonGroup.js +3 -4
- package/cjs/core/ComboBox/ComboBox.js +2 -2
- package/cjs/core/Slider/Slider.js +10 -1
- package/cjs/core/Table/Table.d.ts +5 -0
- package/cjs/core/Table/Table.js +8 -8
- package/cjs/core/Table/TableRowMemoized.js +1 -0
- package/cjs/core/Table/actionHandlers/resizeHandler.d.ts +2 -0
- package/cjs/core/Table/actionHandlers/selectHandler.d.ts +1 -0
- package/cjs/core/Table/filters/BaseFilter.js +1 -1
- package/cjs/core/Table/filters/FilterToggle.js +4 -4
- package/cjs/core/Table/hooks/index.d.ts +1 -0
- package/cjs/core/Table/hooks/index.js +3 -1
- package/cjs/core/Table/hooks/useColumnDragAndDrop.d.ts +2 -0
- package/cjs/core/Table/hooks/useColumnDragAndDrop.js +120 -0
- package/cjs/core/Table/hooks/useExpanderCell.js +1 -0
- package/cjs/core/Table/hooks/useResizeColumns.js +8 -4
- package/cjs/core/Table/hooks/useSelectionCell.js +2 -2
- package/cjs/core/ToggleSwitch/ToggleSwitch.js +13 -10
- package/cjs/core/UserIcon/UserIcon.js +1 -10
- package/cjs/core/utils/hooks/useIntersection.d.ts +4 -3
- package/cjs/core/utils/hooks/useIntersection.js +10 -5
- package/cjs/core/utils/hooks/useOverflow.d.ts +3 -2
- package/cjs/core/utils/hooks/useOverflow.js +24 -21
- package/cjs/types/react-table-config.d.ts +7 -0
- package/esm/core/ButtonGroup/ButtonGroup.d.ts +0 -2
- package/esm/core/ButtonGroup/ButtonGroup.js +3 -4
- package/esm/core/ComboBox/ComboBox.js +2 -2
- package/esm/core/Slider/Slider.js +10 -1
- package/esm/core/Table/Table.d.ts +5 -0
- package/esm/core/Table/Table.js +10 -10
- package/esm/core/Table/TableRowMemoized.js +1 -0
- package/esm/core/Table/actionHandlers/resizeHandler.d.ts +2 -0
- package/esm/core/Table/actionHandlers/selectHandler.d.ts +1 -0
- package/esm/core/Table/filters/BaseFilter.js +1 -1
- package/esm/core/Table/filters/FilterToggle.js +4 -4
- package/esm/core/Table/hooks/index.d.ts +1 -0
- package/esm/core/Table/hooks/index.js +1 -0
- package/esm/core/Table/hooks/useColumnDragAndDrop.d.ts +2 -0
- package/esm/core/Table/hooks/useColumnDragAndDrop.js +116 -0
- package/esm/core/Table/hooks/useExpanderCell.js +1 -0
- package/esm/core/Table/hooks/useResizeColumns.js +8 -4
- package/esm/core/Table/hooks/useSelectionCell.js +2 -2
- package/esm/core/ToggleSwitch/ToggleSwitch.js +13 -10
- package/esm/core/UserIcon/UserIcon.js +1 -10
- package/esm/core/utils/hooks/useIntersection.d.ts +4 -3
- package/esm/core/utils/hooks/useIntersection.js +10 -5
- package/esm/core/utils/hooks/useOverflow.d.ts +3 -2
- package/esm/core/utils/hooks/useOverflow.js +24 -21
- package/esm/types/react-table-config.d.ts +7 -0
- package/package.json +15 -14
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
### [1.34.1](https://www.github.com/iTwin/iTwinUI-react/compare/v1.34.0...v1.34.1) (2022-03-24)
|
|
4
|
+
|
|
5
|
+
### Fixes
|
|
6
|
+
|
|
7
|
+
* **ComboBox:** Combine internal input onChange with `inputProps.onChange` ([#597](https://www.github.com/iTwin/iTwinUI-react/issues/597)) ([e033753](https://www.github.com/iTwin/iTwinUI-react/commit/e033753c81f3b9298df6eb198581c75344f96c00))
|
|
8
|
+
|
|
9
|
+
## [1.34.0](https://www.github.com/iTwin/iTwinUI-react/compare/v1.33.1...v1.34.0) (2022-03-22)
|
|
10
|
+
|
|
11
|
+
### What's new
|
|
12
|
+
|
|
13
|
+
* **Table:** support for draggable columns ([#561](https://www.github.com/iTwin/iTwinUI-react/issues/561)) ([0e741f5](https://www.github.com/iTwin/iTwinUI-react/commit/0e741f5c0838996a5f45c57abedf41daeef652d4))
|
|
14
|
+
|
|
15
|
+
### Fixes
|
|
16
|
+
|
|
17
|
+
* **ToggleSwitch:** updated toggle switch styles through css package ([#592](https://www.github.com/iTwin/iTwinUI-react/issues/592)) ([3a0be35](https://www.github.com/iTwin/iTwinUI-react/commit/3a0be355d4363fe7d704c3fd6f975c509c65da2b))
|
|
18
|
+
* **UserIcon:** busy status now also shows an icon
|
|
19
|
+
|
|
20
|
+
### [1.33.1](https://www.github.com/iTwin/iTwinUI-react/compare/v1.33.0...v1.33.1) (2022-03-18)
|
|
21
|
+
|
|
22
|
+
### Fixes
|
|
23
|
+
|
|
24
|
+
* **ButtonGroup:** Add vertical support to `overflowButton` ([#579](https://www.github.com/iTwin/iTwinUI-react/issues/579)) ([aad619b](https://www.github.com/iTwin/iTwinUI-react/commit/aad619b6dc7d65ffd79c8d33111489b1b8d27680))
|
|
25
|
+
* **Slider:** Fixed to call onUpdate on rail click ([#587](https://www.github.com/iTwin/iTwinUI-react/issues/587)) ([e7cc679](https://www.github.com/iTwin/iTwinUI-react/commit/e7cc6796308928230f2d2c7c79b6ee35286595a7))
|
|
26
|
+
* **Table:** Removed wrapper span from checkbox ([#583](https://www.github.com/iTwin/iTwinUI-react/issues/583)) ([996377b](https://www.github.com/iTwin/iTwinUI-react/commit/996377bf44cdacd9f42361f2199c2a83420ca15b))
|
|
27
|
+
|
|
3
28
|
## [1.33.0](https://www.github.com/iTwin/iTwinUI-react/compare/v1.32.0...v1.33.0) (2022-03-07)
|
|
4
29
|
|
|
5
30
|
### What's new
|
|
@@ -13,8 +13,6 @@ export declare type ButtonGroupProps = {
|
|
|
13
13
|
* and returns the `ReactNode` to render.
|
|
14
14
|
*
|
|
15
15
|
* The placement of this button can be controlled using the `overflowPlacement` prop.
|
|
16
|
-
*
|
|
17
|
-
* *Note: this will not work with `orientation='vertical'`.*
|
|
18
16
|
*/
|
|
19
17
|
overflowButton?: (firstOverflowingIndex: number) => React.ReactNode;
|
|
20
18
|
/**
|
|
@@ -63,16 +63,15 @@ require("@itwin/itwinui-css/css/button.css");
|
|
|
63
63
|
* </ButtonGroup>
|
|
64
64
|
*/
|
|
65
65
|
exports.ButtonGroup = react_1.default.forwardRef(function (props, ref) {
|
|
66
|
-
var children = props.children, className = props.className,
|
|
66
|
+
var children = props.children, className = props.className, overflowButton = props.overflowButton, _a = props.overflowPlacement, overflowPlacement = _a === void 0 ? 'end' : _a, _b = props.orientation, orientation = _b === void 0 ? 'horizontal' : _b, rest = __rest(props, ["children", "className", "overflowButton", "overflowPlacement", "orientation"]);
|
|
67
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]);
|
|
68
68
|
(0, utils_1.useTheme)();
|
|
69
|
-
var _c = (0, utils_1.useOverflow)(items, !overflowButton), overflowRef = _c[0], visibleCount = _c[1];
|
|
69
|
+
var _c = (0, utils_1.useOverflow)(items, !overflowButton, orientation), overflowRef = _c[0], visibleCount = _c[1];
|
|
70
70
|
var refs = (0, utils_1.useMergedRefs)(overflowRef, ref);
|
|
71
71
|
return (react_1.default.createElement("div", __assign({ className: (0, classnames_1.default)({
|
|
72
72
|
'iui-button-group': orientation === 'horizontal',
|
|
73
73
|
'iui-button-group-vertical': orientation === 'vertical',
|
|
74
|
-
}, className),
|
|
75
|
-
orientation === 'horizontal' && { width: '100%' })), style), "aria-orientation": orientation, ref: refs }, rest), !!overflowButton && visibleCount < items.length ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
74
|
+
}, className), "aria-orientation": orientation, ref: refs }, rest), !!overflowButton && visibleCount < items.length ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
76
75
|
overflowButton && overflowPlacement === 'start' && (react_1.default.createElement("div", null, overflowButton(visibleCount))),
|
|
77
76
|
items.slice(0, visibleCount - 1),
|
|
78
77
|
overflowButton && overflowPlacement === 'end' && (react_1.default.createElement("div", null, overflowButton(visibleCount))))) : (items)));
|
|
@@ -300,9 +300,9 @@ var ComboBox = function (props) {
|
|
|
300
300
|
}
|
|
301
301
|
(_a = dropdownMenuProps === null || dropdownMenuProps === void 0 ? void 0 : dropdownMenuProps.onHide) === null || _a === void 0 ? void 0 : _a.call(dropdownMenuProps, instance);
|
|
302
302
|
} }),
|
|
303
|
-
react_1.default.createElement(Input_1.Input, __assign({ ref: inputRef, onKeyDown: onKeyDown, onFocus: function () { return setIsOpen(true); },
|
|
303
|
+
react_1.default.createElement(Input_1.Input, __assign({ ref: inputRef, onKeyDown: onKeyDown, onFocus: function () { return setIsOpen(true); }, value: inputValue, "aria-activedescendant": isOpen && focusedIndex > -1
|
|
304
304
|
? getOptionId(focusedIndex)
|
|
305
|
-
: undefined, role: 'combobox', "aria-controls": isOpen ? id + "-list" : undefined, "aria-autocomplete": 'list', spellCheck: false, autoCapitalize: 'none', autoCorrect: 'off' }, inputProps))),
|
|
305
|
+
: undefined, role: 'combobox', "aria-controls": isOpen ? id + "-list" : undefined, "aria-autocomplete": 'list', spellCheck: false, autoCapitalize: 'none', autoCorrect: 'off' }, inputProps, { onChange: onInput }))),
|
|
306
306
|
react_1.default.createElement("span", { ref: toggleButtonRef, className: (0, classnames_1.default)('iui-end-icon', {
|
|
307
307
|
'iui-actionable': !(inputProps === null || inputProps === void 0 ? void 0 : inputProps.disabled),
|
|
308
308
|
'iui-disabled': inputProps === null || inputProps === void 0 ? void 0 : inputProps.disabled,
|
|
@@ -208,11 +208,20 @@ exports.Slider = react_1.default.forwardRef(function (props, ref) {
|
|
|
208
208
|
newValues[closestValueIndex] = pointerValue;
|
|
209
209
|
setCurrentValues(newValues);
|
|
210
210
|
onChange === null || onChange === void 0 ? void 0 : onChange(newValues);
|
|
211
|
+
onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(newValues);
|
|
211
212
|
focusThumb(containerRef.current, closestValueIndex);
|
|
212
213
|
event.preventDefault();
|
|
213
214
|
event.stopPropagation();
|
|
214
215
|
}
|
|
215
|
-
}, [
|
|
216
|
+
}, [
|
|
217
|
+
min,
|
|
218
|
+
max,
|
|
219
|
+
step,
|
|
220
|
+
currentValues,
|
|
221
|
+
getAllowableThumbRange,
|
|
222
|
+
onChange,
|
|
223
|
+
onUpdate,
|
|
224
|
+
]);
|
|
216
225
|
(0, utils_1.useEventListener)('pointermove', handlePointerMove, (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.ownerDocument);
|
|
217
226
|
(0, utils_1.useEventListener)('pointerup', handlePointerUp, (_b = containerRef.current) === null || _b === void 0 ? void 0 : _b.ownerDocument);
|
|
218
227
|
var tickMarkArea = react_1.default.useMemo(function () {
|
|
@@ -170,6 +170,11 @@ export declare type TableProps<T extends Record<string, unknown> = Record<string
|
|
|
170
170
|
* @beta
|
|
171
171
|
*/
|
|
172
172
|
enableVirtualization?: boolean;
|
|
173
|
+
/**
|
|
174
|
+
* Flag whether columns can be reordered.
|
|
175
|
+
* @default false
|
|
176
|
+
*/
|
|
177
|
+
enableColumnReordering?: boolean;
|
|
173
178
|
} & Omit<CommonProps, 'title'>;
|
|
174
179
|
/**
|
|
175
180
|
* Table based on [react-table](https://react-table.tanstack.com/docs/api/overview).
|
package/cjs/core/Table/Table.js
CHANGED
|
@@ -94,9 +94,9 @@ var tableResizeEndAction = 'tableResizeEnd';
|
|
|
94
94
|
*/
|
|
95
95
|
var Table = function (props) {
|
|
96
96
|
var _a;
|
|
97
|
-
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, _m = props.enableVirtualization, enableVirtualization = _m === void 0 ? false : _m, 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", "enableVirtualization"]);
|
|
97
|
+
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, _m = props.enableVirtualization, enableVirtualization = _m === void 0 ? false : _m, _o = props.enableColumnReordering, enableColumnReordering = _o === void 0 ? false : _o, 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", "enableVirtualization", "enableColumnReordering"]);
|
|
98
98
|
(0, utils_1.useTheme)();
|
|
99
|
-
var
|
|
99
|
+
var _p = react_1.default.useState(), ownerDocument = _p[0], setOwnerDocument = _p[1];
|
|
100
100
|
var defaultColumn = react_1.default.useMemo(function () { return ({
|
|
101
101
|
maxWidth: 0,
|
|
102
102
|
minWidth: 0,
|
|
@@ -152,7 +152,7 @@ var Table = function (props) {
|
|
|
152
152
|
return getSubRows ? getSubRows(item, index) : item.subRows;
|
|
153
153
|
});
|
|
154
154
|
}, [data, getSubRows]);
|
|
155
|
-
var instance = (0, react_table_1.useTable)(__assign(__assign({ manualPagination: !paginatorRenderer, paginateExpandedRows: false }, props), { columns: columns, defaultColumn: defaultColumn, disableSortBy: !isSortable, stateReducer: tableStateReducer, filterTypes: filterTypes, selectSubRows: selectSubRows, data: data, getSubRows: getSubRows, initialState: __assign({ pageSize: pageSize }, props.initialState) }), react_table_1.useFlexLayout, (0, hooks_1.useResizeColumns)(ownerDocument), react_table_1.useFilters, (0, hooks_1.useSubRowFiltering)(hasAnySubRows), react_table_1.useSortBy, react_table_1.useExpanded, react_table_1.usePagination, react_table_1.useRowSelect, hooks_1.useSubRowSelection, (0, hooks_1.useExpanderCell)(subComponent, expanderCell, isRowDisabled), (0, hooks_1.useSelectionCell)(isSelectable, isRowDisabled));
|
|
155
|
+
var instance = (0, react_table_1.useTable)(__assign(__assign({ manualPagination: !paginatorRenderer, paginateExpandedRows: false }, props), { columns: columns, defaultColumn: defaultColumn, disableSortBy: !isSortable, stateReducer: tableStateReducer, filterTypes: filterTypes, selectSubRows: selectSubRows, data: data, getSubRows: getSubRows, initialState: __assign({ pageSize: pageSize }, props.initialState) }), react_table_1.useFlexLayout, (0, hooks_1.useResizeColumns)(ownerDocument), react_table_1.useFilters, (0, hooks_1.useSubRowFiltering)(hasAnySubRows), react_table_1.useSortBy, react_table_1.useExpanded, react_table_1.usePagination, react_table_1.useRowSelect, hooks_1.useSubRowSelection, (0, hooks_1.useExpanderCell)(subComponent, expanderCell, isRowDisabled), (0, hooks_1.useSelectionCell)(isSelectable, isRowDisabled), react_table_1.useColumnOrder, (0, hooks_1.useColumnDragAndDrop)(enableColumnReordering));
|
|
156
156
|
var getTableProps = instance.getTableProps, rows = instance.rows, headerGroups = instance.headerGroups, getTableBodyProps = instance.getTableBodyProps, prepareRow = instance.prepareRow, state = instance.state, allColumns = instance.allColumns, filteredFlatRows = instance.filteredFlatRows, dispatch = instance.dispatch, page = instance.page, gotoPage = instance.gotoPage, setPageSize = instance.setPageSize, flatHeaders = instance.flatHeaders;
|
|
157
157
|
var ariaDataAttributes = Object.entries(rest).reduce(function (result, _a) {
|
|
158
158
|
var key = _a[0], value = _a[1];
|
|
@@ -266,21 +266,21 @@ var Table = function (props) {
|
|
|
266
266
|
className: 'iui-row',
|
|
267
267
|
});
|
|
268
268
|
return (react_1.default.createElement("div", __assign({}, headerGroupProps, { key: headerGroupProps.key }), headerGroup.headers.map(function (column, index) {
|
|
269
|
-
var
|
|
270
|
-
|
|
271
|
-
return (react_1.default.createElement("div", __assign({}, columnProps, { key: columnProps.key, title: undefined, ref: function (el) {
|
|
269
|
+
var columnProps = column.getHeaderProps(__assign(__assign({}, column.getSortByToggleProps()), { className: (0, classnames_1.default)('iui-cell', { 'iui-actionable': column.canSort }, { 'iui-sorted': column.isSorted }, column.columnClassName), style: __assign({}, (0, utils_2.getCellStyle)(column, !!state.isTableResizing)) }));
|
|
270
|
+
return (react_1.default.createElement("div", __assign({}, columnProps, column.getDragAndDropProps(), { key: columnProps.key, title: undefined, ref: function (el) {
|
|
272
271
|
if (el && isResizable) {
|
|
273
272
|
columnRefs.current[column.id] = el;
|
|
274
273
|
column.resizeWidth = el.getBoundingClientRect().width;
|
|
275
274
|
}
|
|
276
|
-
}
|
|
275
|
+
} }),
|
|
277
276
|
column.render('Header'),
|
|
278
277
|
!isLoading && (data.length != 0 || areFiltersSet) && (react_1.default.createElement(filters_1.FilterToggle, { column: column, ownerDocument: ownerDocument })),
|
|
279
278
|
!isLoading && data.length != 0 && column.canSort && (react_1.default.createElement("div", { className: 'iui-cell-end-icon' }, column.isSorted && column.isSortedDesc ? (react_1.default.createElement(SortUp_1.default, { className: 'iui-icon iui-sort', "aria-hidden": true })) : (react_1.default.createElement(SortDown_1.default, { className: 'iui-icon iui-sort', "aria-hidden": true })))),
|
|
280
279
|
isResizable &&
|
|
281
280
|
column.isResizerVisible &&
|
|
282
281
|
index !== headerGroup.headers.length - 1 && (react_1.default.createElement("div", __assign({}, column.getResizerProps(), { className: 'iui-resizer' }),
|
|
283
|
-
react_1.default.createElement("div", { className: 'iui-resizer-bar' })))
|
|
282
|
+
react_1.default.createElement("div", { className: 'iui-resizer-bar' }))),
|
|
283
|
+
enableColumnReordering && !column.disableReordering && (react_1.default.createElement("div", { className: 'iui-reorder-bar' }))));
|
|
284
284
|
})));
|
|
285
285
|
})),
|
|
286
286
|
react_1.default.createElement("div", __assign({}, getTableBodyProps({
|
|
@@ -92,6 +92,7 @@ exports.TableRowMemoized = react_1.default.memo(exports.TableRow, function (prev
|
|
|
92
92
|
prevProp.rowProps === nextProp.rowProps &&
|
|
93
93
|
prevProp.expanderCell === nextProp.expanderCell &&
|
|
94
94
|
prevProp.tableHasSubRows === nextProp.tableHasSubRows &&
|
|
95
|
+
prevProp.state.columnOrder === nextProp.state.columnOrder &&
|
|
95
96
|
!nextProp.state.columnResizing.isResizingColumn &&
|
|
96
97
|
!nextProp.state.isTableResizing;
|
|
97
98
|
});
|
|
@@ -11,6 +11,7 @@ export declare const onTableResizeStart: <T extends Record<string, unknown>>(sta
|
|
|
11
11
|
columnWidths: Record<string, number>;
|
|
12
12
|
isResizingColumn?: string | undefined;
|
|
13
13
|
};
|
|
14
|
+
columnReorderStartIndex: number;
|
|
14
15
|
columnOrder: import("react-table").IdType<T>[];
|
|
15
16
|
expanded: Record<import("react-table").IdType<T>, boolean>;
|
|
16
17
|
filters: import("react-table").Filters<T>;
|
|
@@ -36,6 +37,7 @@ export declare const onTableResizeEnd: <T extends Record<string, unknown>>(state
|
|
|
36
37
|
isResizingColumn?: string | undefined;
|
|
37
38
|
};
|
|
38
39
|
hiddenColumns?: import("react-table").IdType<T>[] | undefined;
|
|
40
|
+
columnReorderStartIndex: number;
|
|
39
41
|
columnOrder: import("react-table").IdType<T>[];
|
|
40
42
|
expanded: Record<import("react-table").IdType<T>, boolean>;
|
|
41
43
|
filters: import("react-table").Filters<T>;
|
|
@@ -19,6 +19,7 @@ export declare const onSingleSelectHandler: <T extends Record<string, unknown>>(
|
|
|
19
19
|
isResizingColumn?: string | undefined;
|
|
20
20
|
};
|
|
21
21
|
isTableResizing?: boolean | undefined;
|
|
22
|
+
columnReorderStartIndex: number;
|
|
22
23
|
columnOrder: import("react-table").IdType<T>[];
|
|
23
24
|
expanded: Record<import("react-table").IdType<T>, boolean>;
|
|
24
25
|
filters: import("react-table").Filters<T>;
|
|
@@ -31,7 +31,7 @@ var BaseFilter = function (props) {
|
|
|
31
31
|
(0, utils_1.useTheme)();
|
|
32
32
|
return (react_1.default.createElement("div", { className: (0, classnames_1.default)('iui-column-filter', className), style: style,
|
|
33
33
|
// Prevents from triggering sort
|
|
34
|
-
|
|
34
|
+
onClick: function (e) {
|
|
35
35
|
e.stopPropagation();
|
|
36
36
|
}, id: id }, children));
|
|
37
37
|
};
|
|
@@ -54,10 +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 () {
|
|
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 (e) {
|
|
58
58
|
setIsVisible(function (v) { return !v; });
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
// Prevents from triggering sort
|
|
60
|
+
e.stopPropagation();
|
|
61
|
+
} }, rest), column.filterValue ? react_1.default.createElement(Filter_1.default, null) : react_1.default.createElement(FilterHollow_1.default, null))))));
|
|
62
62
|
};
|
|
63
63
|
exports.FilterToggle = FilterToggle;
|
|
@@ -3,3 +3,4 @@ export { SELECTION_CELL_ID, useSelectionCell } from './useSelectionCell';
|
|
|
3
3
|
export { useSubRowFiltering } from './useSubRowFiltering';
|
|
4
4
|
export { useSubRowSelection } from './useSubRowSelection';
|
|
5
5
|
export { useResizeColumns } from './useResizeColumns';
|
|
6
|
+
export { useColumnDragAndDrop } from './useColumnDragAndDrop';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useResizeColumns = exports.useSubRowSelection = exports.useSubRowFiltering = exports.useSelectionCell = exports.SELECTION_CELL_ID = exports.useExpanderCell = exports.EXPANDER_CELL_ID = void 0;
|
|
3
|
+
exports.useColumnDragAndDrop = exports.useResizeColumns = exports.useSubRowSelection = exports.useSubRowFiltering = exports.useSelectionCell = exports.SELECTION_CELL_ID = exports.useExpanderCell = exports.EXPANDER_CELL_ID = void 0;
|
|
4
4
|
/*---------------------------------------------------------------------------------------------
|
|
5
5
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
6
6
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
@@ -17,3 +17,5 @@ var useSubRowSelection_1 = require("./useSubRowSelection");
|
|
|
17
17
|
Object.defineProperty(exports, "useSubRowSelection", { enumerable: true, get: function () { return useSubRowSelection_1.useSubRowSelection; } });
|
|
18
18
|
var useResizeColumns_1 = require("./useResizeColumns");
|
|
19
19
|
Object.defineProperty(exports, "useResizeColumns", { enumerable: true, get: function () { return useResizeColumns_1.useResizeColumns; } });
|
|
20
|
+
var useColumnDragAndDrop_1 = require("./useColumnDragAndDrop");
|
|
21
|
+
Object.defineProperty(exports, "useColumnDragAndDrop", { enumerable: true, get: function () { return useColumnDragAndDrop_1.useColumnDragAndDrop; } });
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
14
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
15
|
+
if (ar || !(i in from)) {
|
|
16
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
17
|
+
ar[i] = from[i];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.useColumnDragAndDrop = void 0;
|
|
24
|
+
var react_table_1 = require("react-table");
|
|
25
|
+
var REORDER_ACTIONS = {
|
|
26
|
+
columnDragStart: 'columnDragStart',
|
|
27
|
+
columnDragEnd: 'columnDragEnd',
|
|
28
|
+
};
|
|
29
|
+
var useColumnDragAndDrop = function (isEnabled) { return function (hooks) {
|
|
30
|
+
hooks.getDragAndDropProps = [defaultGetDragAndDropProps(isEnabled)];
|
|
31
|
+
hooks.stateReducers.push(reducer);
|
|
32
|
+
hooks.useInstance.push(useInstance);
|
|
33
|
+
}; };
|
|
34
|
+
exports.useColumnDragAndDrop = useColumnDragAndDrop;
|
|
35
|
+
var defaultGetDragAndDropProps = function (isEnabled) { return function (props, _a) {
|
|
36
|
+
var instance = _a.instance, header = _a.header;
|
|
37
|
+
if (!isEnabled || header.disableReordering) {
|
|
38
|
+
return props;
|
|
39
|
+
}
|
|
40
|
+
var onDragStart = function () {
|
|
41
|
+
instance.dispatch({
|
|
42
|
+
type: REORDER_ACTIONS.columnDragStart,
|
|
43
|
+
columnIndex: instance.flatHeaders.indexOf(header),
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
var setOnDragColumnStyle = function (event, position) {
|
|
47
|
+
var columnElement = event.currentTarget;
|
|
48
|
+
columnElement.classList.remove('iui-reorder-column-right');
|
|
49
|
+
columnElement.classList.remove('iui-reorder-column-left');
|
|
50
|
+
if (position === 'left') {
|
|
51
|
+
columnElement.classList.add('iui-reorder-column-left');
|
|
52
|
+
}
|
|
53
|
+
else if (position === 'right') {
|
|
54
|
+
columnElement.classList.add('iui-reorder-column-right');
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
var reorderColumns = function (tableColumns, srcIndex, dstIndex) {
|
|
58
|
+
var newTableColumns = __spreadArray([], tableColumns, true);
|
|
59
|
+
var removed = newTableColumns.splice(srcIndex, 1)[0];
|
|
60
|
+
newTableColumns.splice(dstIndex, 0, removed);
|
|
61
|
+
return newTableColumns;
|
|
62
|
+
};
|
|
63
|
+
var onDragOver = function (event) {
|
|
64
|
+
event.preventDefault();
|
|
65
|
+
var headerIndex = instance.flatHeaders.indexOf(header);
|
|
66
|
+
if (instance.state.columnReorderStartIndex !== headerIndex) {
|
|
67
|
+
setOnDragColumnStyle(event, instance.state.columnReorderStartIndex > headerIndex ? 'left' : 'right');
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
var onDragLeave = function (event) {
|
|
71
|
+
setOnDragColumnStyle(event);
|
|
72
|
+
};
|
|
73
|
+
var onDrop = function (event) {
|
|
74
|
+
event.preventDefault();
|
|
75
|
+
setOnDragColumnStyle(event);
|
|
76
|
+
var columnIds = instance.flatHeaders.map(function (x) { return x.id; });
|
|
77
|
+
var srcIndex = instance.state.columnReorderStartIndex;
|
|
78
|
+
var dstIndex = columnIds.findIndex(function (x) { return x === header.id; });
|
|
79
|
+
if (srcIndex === dstIndex || srcIndex === -1 || dstIndex === -1) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
instance.setColumnOrder(reorderColumns(columnIds, srcIndex, dstIndex));
|
|
83
|
+
instance.dispatch({
|
|
84
|
+
type: REORDER_ACTIONS.columnDragEnd,
|
|
85
|
+
columnIndex: -1,
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
return [
|
|
89
|
+
props,
|
|
90
|
+
{
|
|
91
|
+
draggable: true,
|
|
92
|
+
onDragStart: onDragStart,
|
|
93
|
+
onDragOver: onDragOver,
|
|
94
|
+
onDragLeave: onDragLeave,
|
|
95
|
+
onDrop: onDrop,
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
}; };
|
|
99
|
+
var reducer = function (newState, action) {
|
|
100
|
+
switch (action.type) {
|
|
101
|
+
case react_table_1.actions.init:
|
|
102
|
+
return __assign(__assign({}, newState), { columnReorderStartIndex: -1 });
|
|
103
|
+
case REORDER_ACTIONS.columnDragStart:
|
|
104
|
+
return __assign(__assign({}, newState), { columnReorderStartIndex: action.columnIndex });
|
|
105
|
+
case REORDER_ACTIONS.columnDragEnd:
|
|
106
|
+
return __assign(__assign({}, newState), { columnReorderStartIndex: -1 });
|
|
107
|
+
default:
|
|
108
|
+
return newState;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
var useInstance = function (instance) {
|
|
112
|
+
var flatHeaders = instance.flatHeaders, getHooks = instance.getHooks;
|
|
113
|
+
var getInstance = (0, react_table_1.useGetLatest)(instance);
|
|
114
|
+
flatHeaders.forEach(function (header) {
|
|
115
|
+
header.getDragAndDropProps = (0, react_table_1.makePropGetter)(getHooks().getDragAndDropProps, {
|
|
116
|
+
instance: getInstance(),
|
|
117
|
+
header: header,
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
};
|
|
@@ -35,6 +35,7 @@ var useExpanderCell = function (subComponent, expanderCell, isRowDisabled) { ret
|
|
|
35
35
|
maxWidth: 48,
|
|
36
36
|
columnClassName: 'iui-slot',
|
|
37
37
|
cellClassName: 'iui-slot',
|
|
38
|
+
disableReordering: true,
|
|
38
39
|
Cell: function (props) {
|
|
39
40
|
var row = props.row;
|
|
40
41
|
if (!subComponent(row)) {
|
|
@@ -112,16 +112,20 @@ var defaultGetResizerProps = function (ownerDocument) { return function (props,
|
|
|
112
112
|
return [
|
|
113
113
|
props,
|
|
114
114
|
{
|
|
115
|
-
|
|
116
|
-
e.persist();
|
|
115
|
+
onClick: function (e) {
|
|
117
116
|
// Prevents from triggering sort
|
|
118
117
|
e.stopPropagation();
|
|
118
|
+
},
|
|
119
|
+
onMouseDown: function (e) {
|
|
120
|
+
e.persist();
|
|
121
|
+
// Prevents from triggering drag'n'drop
|
|
122
|
+
e.preventDefault();
|
|
119
123
|
onResizeStart(e, header);
|
|
120
124
|
},
|
|
121
125
|
onTouchStart: function (e) {
|
|
122
126
|
e.persist();
|
|
123
|
-
// Prevents from triggering
|
|
124
|
-
e.
|
|
127
|
+
// Prevents from triggering drag'n'drop
|
|
128
|
+
e.preventDefault();
|
|
125
129
|
onResizeStart(e, header);
|
|
126
130
|
},
|
|
127
131
|
style: {
|
|
@@ -45,6 +45,7 @@ var useSelectionCell = function (isSelectable, isRowDisabled) { return function
|
|
|
45
45
|
maxWidth: 48,
|
|
46
46
|
columnClassName: 'iui-slot',
|
|
47
47
|
cellClassName: 'iui-slot',
|
|
48
|
+
disableReordering: true,
|
|
48
49
|
Header: function (_a) {
|
|
49
50
|
var getToggleAllRowsSelectedProps = _a.getToggleAllRowsSelectedProps, rows = _a.rows, initialRows = _a.initialRows, state = _a.state;
|
|
50
51
|
var disabled = rows.every(function (row) { return isRowDisabled === null || isRowDisabled === void 0 ? void 0 : isRowDisabled(row.original); });
|
|
@@ -55,8 +56,7 @@ var useSelectionCell = function (isSelectable, isRowDisabled) { return function
|
|
|
55
56
|
},
|
|
56
57
|
Cell: function (_a) {
|
|
57
58
|
var row = _a.row;
|
|
58
|
-
return (react_1.default.createElement(
|
|
59
|
-
react_1.default.createElement(Checkbox_1.Checkbox, __assign({}, row.getToggleRowSelectedProps(), { disabled: isRowDisabled === null || isRowDisabled === void 0 ? void 0 : isRowDisabled(row.original) }))));
|
|
59
|
+
return (react_1.default.createElement(Checkbox_1.Checkbox, __assign({}, row.getToggleRowSelectedProps(), { disabled: isRowDisabled === null || isRowDisabled === void 0 ? void 0 : isRowDisabled(row.original), onClick: function (e) { return e.stopPropagation(); } })));
|
|
60
60
|
},
|
|
61
61
|
}
|
|
62
62
|
], columns, true); });
|
|
@@ -57,20 +57,23 @@ exports.ToggleSwitch = react_1.default.forwardRef(function (props, ref) {
|
|
|
57
57
|
(0, utils_1.useTheme)();
|
|
58
58
|
var inputElementRef = react_1.default.useRef(null);
|
|
59
59
|
var refs = (0, utils_1.useMergedRefs)(inputElementRef, ref);
|
|
60
|
+
var WrapperComponent = label ? 'label' : 'div';
|
|
60
61
|
react_1.default.useEffect(function () {
|
|
61
62
|
if (inputElementRef.current && setFocus) {
|
|
62
63
|
inputElementRef.current.focus();
|
|
63
64
|
}
|
|
64
65
|
}, [setFocus]);
|
|
65
|
-
return (react_1.default.createElement(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
66
|
+
return (react_1.default.createElement(WrapperComponent, { className: (0, classnames_1.default)('iui-toggle-switch-wrapper', {
|
|
67
|
+
'iui-disabled': disabled,
|
|
68
|
+
'iui-label-on-right': label && labelPosition === 'right',
|
|
69
|
+
'iui-label-on-left': label && labelPosition === 'left',
|
|
70
|
+
}, className), style: style },
|
|
71
|
+
react_1.default.createElement("input", __assign({ className: 'iui-toggle-switch', type: 'checkbox', role: 'switch', disabled: disabled, ref: refs }, rest)),
|
|
72
|
+
icon &&
|
|
73
|
+
react_1.default.cloneElement(icon, {
|
|
74
|
+
className: (0, classnames_1.default)('iui-toggle-switch-icon', icon.props.className),
|
|
75
|
+
'aria-hidden': true,
|
|
76
|
+
}),
|
|
77
|
+
label && react_1.default.createElement("span", { className: 'iui-toggle-switch-label' }, label)));
|
|
75
78
|
});
|
|
76
79
|
exports.default = exports.ToggleSwitch;
|
|
@@ -30,9 +30,6 @@ exports.UserIcon = exports.defaultStatusTitles = void 0;
|
|
|
30
30
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
31
31
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
32
32
|
*--------------------------------------------------------------------------------------------*/
|
|
33
|
-
var Away_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/Away"));
|
|
34
|
-
var Checkmark_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/Checkmark"));
|
|
35
|
-
var CloseSmall_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/CloseSmall"));
|
|
36
33
|
var classnames_1 = __importDefault(require("classnames"));
|
|
37
34
|
var react_1 = __importDefault(require("react"));
|
|
38
35
|
var utils_1 = require("../utils");
|
|
@@ -63,17 +60,11 @@ var UserIcon = function (props) {
|
|
|
63
60
|
var _c = props.size, size = _c === void 0 ? 'small' : _c, status = props.status, abbreviation = props.abbreviation, image = props.image, _d = props.backgroundColor, backgroundColor = _d === void 0 ? 'white' : _d, title = props.title, translatedStatusTitles = props.translatedStatusTitles, className = props.className, style = props.style, rest = __rest(props, ["size", "status", "abbreviation", "image", "backgroundColor", "title", "translatedStatusTitles", "className", "style"]);
|
|
64
61
|
(0, utils_1.useTheme)();
|
|
65
62
|
var statusTitles = __assign(__assign({}, exports.defaultStatusTitles), translatedStatusTitles);
|
|
66
|
-
var iconMap = {
|
|
67
|
-
away: react_1.default.createElement(Away_1.default, { className: 'iui-status-symbol', "aria-hidden": true }),
|
|
68
|
-
offline: react_1.default.createElement(CloseSmall_1.default, { className: 'iui-status-symbol', "aria-hidden": true }),
|
|
69
|
-
online: react_1.default.createElement(Checkmark_1.default, { className: 'iui-status-symbol', "aria-hidden": true }),
|
|
70
|
-
busy: react_1.default.createElement(react_1.default.Fragment, null),
|
|
71
|
-
};
|
|
72
63
|
return (react_1.default.createElement("span", __assign({ className: (0, classnames_1.default)('iui-user-icon', (_a = {}, _a["iui-" + size] = size !== 'medium', _a), className), title: title, style: style }, rest), image !== null && image !== void 0 ? image : (react_1.default.createElement("abbr", { className: 'iui-initials', style: { backgroundColor: backgroundColor } }, abbreviation === null || abbreviation === void 0 ? void 0 : abbreviation.substring(0, 2))),
|
|
73
64
|
react_1.default.createElement("span", { className: 'iui-stroke' }),
|
|
74
65
|
status && (react_1.default.createElement("span", { title: statusTitles[status], className: (0, classnames_1.default)('iui-status', (_b = {},
|
|
75
66
|
_b["iui-" + status] = !!status,
|
|
76
|
-
_b)), "aria-label": statusTitles[status] }
|
|
67
|
+
_b)), "aria-label": statusTitles[status] }))));
|
|
77
68
|
};
|
|
78
69
|
exports.UserIcon = UserIcon;
|
|
79
70
|
exports.default = exports.UserIcon;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hook that uses `IntersectionObserver` to trigger `onIntersect` callback when element is in viewport.
|
|
3
|
-
* Callback is called only once.
|
|
4
|
-
*
|
|
3
|
+
* Callback is called only once by default (can be changed using the `once` parameter).
|
|
4
|
+
* @returns a callback ref that needs to be set on the element you want to observe.
|
|
5
|
+
* @private
|
|
5
6
|
* @example
|
|
6
7
|
* const onIntersection = React.useCallback(() => {
|
|
7
8
|
* console.log('Element is in viewport!');
|
|
@@ -9,4 +10,4 @@
|
|
|
9
10
|
* const ref = useIntersection(onIntersection);
|
|
10
11
|
* return (<div ref={ref}>One of many elements</div>);
|
|
11
12
|
*/
|
|
12
|
-
export declare const useIntersection: (onIntersect: () => void, options?: IntersectionObserverInit) => (node: HTMLElement | null) => void;
|
|
13
|
+
export declare const useIntersection: (onIntersect: () => void, options?: IntersectionObserverInit, once?: boolean) => (node: HTMLElement | null) => void;
|
|
@@ -12,8 +12,9 @@ var react_1 = __importDefault(require("react"));
|
|
|
12
12
|
var dom_1 = require("../functions/dom");
|
|
13
13
|
/**
|
|
14
14
|
* Hook that uses `IntersectionObserver` to trigger `onIntersect` callback when element is in viewport.
|
|
15
|
-
* Callback is called only once.
|
|
16
|
-
*
|
|
15
|
+
* Callback is called only once by default (can be changed using the `once` parameter).
|
|
16
|
+
* @returns a callback ref that needs to be set on the element you want to observe.
|
|
17
|
+
* @private
|
|
17
18
|
* @example
|
|
18
19
|
* const onIntersection = React.useCallback(() => {
|
|
19
20
|
* console.log('Element is in viewport!');
|
|
@@ -21,8 +22,9 @@ var dom_1 = require("../functions/dom");
|
|
|
21
22
|
* const ref = useIntersection(onIntersection);
|
|
22
23
|
* return (<div ref={ref}>One of many elements</div>);
|
|
23
24
|
*/
|
|
24
|
-
var useIntersection = function (onIntersect, options) {
|
|
25
|
+
var useIntersection = function (onIntersect, options, once) {
|
|
25
26
|
if (options === void 0) { options = {}; }
|
|
27
|
+
if (once === void 0) { once = true; }
|
|
26
28
|
var root = options.root, rootMargin = options.rootMargin, threshold = options.threshold;
|
|
27
29
|
var observer = react_1.default.useRef();
|
|
28
30
|
var setRef = react_1.default.useCallback(function (node) {
|
|
@@ -39,12 +41,15 @@ var useIntersection = function (onIntersect, options) {
|
|
|
39
41
|
observer.current = new IntersectionObserver(function (_a, obs) {
|
|
40
42
|
var entry = _a[0];
|
|
41
43
|
if (entry.isIntersecting) {
|
|
42
|
-
|
|
44
|
+
if (once) {
|
|
45
|
+
obs.disconnect();
|
|
46
|
+
}
|
|
43
47
|
onIntersect();
|
|
44
48
|
}
|
|
45
49
|
}, { root: root, rootMargin: rootMargin, threshold: threshold });
|
|
46
50
|
observer.current.observe(node);
|
|
47
|
-
}, [onIntersect, root, rootMargin, threshold]);
|
|
51
|
+
}, [onIntersect, once, root, rootMargin, threshold]);
|
|
52
|
+
react_1.default.useEffect(function () { return function () { var _a; return (_a = observer.current) === null || _a === void 0 ? void 0 : _a.disconnect(); }; }, []);
|
|
48
53
|
return setRef;
|
|
49
54
|
};
|
|
50
55
|
exports.useIntersection = useIntersection;
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
/**
|
|
3
3
|
* Hook that observes the size of an element and returns the number of items
|
|
4
|
-
* that should be visible based on the
|
|
4
|
+
* that should be visible based on the size of the container element.
|
|
5
5
|
*
|
|
6
6
|
* The returned number should be used to render the element with fewer items.
|
|
7
7
|
*
|
|
8
8
|
* @private
|
|
9
9
|
* @param items Items that this element contains.
|
|
10
10
|
* @param disabled Set to true to disconnect the observer.
|
|
11
|
+
* @param dimension 'horizontal' (default) or 'vertical'
|
|
11
12
|
* @returns [callback ref to set on container, stateful count of visible items]
|
|
12
13
|
*
|
|
13
14
|
* @example
|
|
@@ -20,4 +21,4 @@ import React from 'react';
|
|
|
20
21
|
* </div>
|
|
21
22
|
* );
|
|
22
23
|
*/
|
|
23
|
-
export declare const useOverflow: <T extends HTMLElement>(items: React.ReactNode[] | string, disabled?: boolean) => readonly [(instance: T | null) => void, number];
|
|
24
|
+
export declare const useOverflow: <T extends HTMLElement>(items: React.ReactNode[] | string, disabled?: boolean, orientation?: 'horizontal' | 'vertical') => readonly [(instance: T | null) => void, number];
|