Skip to content

Commit fc7c40c

Browse files
committed
Add controlled column sizing.
1 parent 472b1ee commit fc7c40c

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

src/components/table/table.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import HeaderActions from "./header/actions"
2424
import Body from "./body"
2525
import usePinning from "./usePinning"
2626
import useVisibility from "./useVisibility"
27+
import useSizing from "./useSizing"
2728
import useExpanding from "./useExpanding"
2829
import usePaginating from "./usePaginating"
2930
import useSearching from "./useSearching"
@@ -57,6 +58,10 @@ const Table = memo(
5758
columnVisibility: defaultColumnVisibility,
5859
onColumnVisibilityChange: visibilityChangeCb,
5960

61+
enableColumnSizing,
62+
columnSizing: defaultColumnSizing,
63+
onColumnSizingChange: sizingChangeCb,
64+
6065
enablePagination,
6166
enableResizing,
6267
enableSelection,
@@ -101,6 +106,8 @@ const Table = memo(
101106
visibilityChangeCb
102107
)
103108

109+
const [columnSizing, onColumnSizingChange] = useSizing(defaultColumnSizing, sizingChangeCb)
110+
104111
const [columnPinning, onColumnPinningChange] = usePinning(
105112
defaultColumnPinning,
106113
pinningChangeCb
@@ -138,6 +145,7 @@ const Table = memo(
138145
filterFns,
139146
state: {
140147
columnVisibility,
148+
columnSizing,
141149
rowSelection,
142150
globalFilter: enableCustomSearch ? "" : globalFilter,
143151
sorting,
@@ -167,10 +175,12 @@ const Table = memo(
167175
getSubRows: useCallback(row => row.children, []),
168176
onPaginationChange,
169177
onColumnVisibilityChange,
178+
onColumnSizingChange,
170179
onColumnPinningChange,
171180
enableSubRowSelection,
172181
columnGroupingMode: "reorder",
173182
})
183+
174184
const prevStateRef = useRef(table.getState())
175185
table.isEqual = (selector = identity) => {
176186
if (!prevStateRef.current) {
@@ -179,6 +189,7 @@ const Table = memo(
179189
}
180190

181191
const areStatesEqual = isEqual(selector(prevStateRef.current), selector(table.getState()))
192+
182193
prevStateRef.current = table.getState()
183194
return areStatesEqual
184195
}

src/components/table/useSizing.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { useCallback, useEffect, useState, useRef } from "react"
2+
3+
const noop = () => {}
4+
const emptyObj = {}
5+
6+
export default (defaultColumnSizing = emptyObj, onChange = noop) => {
7+
const [columnSizing, setColumnSizing] = useState(() => defaultColumnSizing)
8+
const initialSetRef = useRef(false)
9+
10+
useEffect(() => {
11+
if (columnSizing === defaultColumnSizing) return
12+
13+
initialSetRef.current = true
14+
setColumnSizing(defaultColumnSizing)
15+
}, [defaultColumnSizing])
16+
17+
const onSizingChange = useCallback(
18+
getValue => {
19+
onChange(getValue(columnSizing))
20+
setColumnSizing(getValue(columnSizing))
21+
},
22+
[columnSizing]
23+
)
24+
25+
return [columnSizing, onSizingChange]
26+
}

0 commit comments

Comments
 (0)