Skip to content

Commit dfc06b3

Browse files
committed
Allow resize widths to be reset also
1 parent f2c095d commit dfc06b3

4 files changed

Lines changed: 36 additions & 33 deletions

File tree

src/DataGrid.tsx

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import type {
5050
CellSelectArgs,
5151
Column,
5252
ColumnOrColumnGroup,
53+
ColumnWidths,
5354
Direction,
5455
FillEvent,
5556
Maybe,
@@ -159,6 +160,8 @@ export interface DataGridProps<R, SR = unknown, K extends Key = Key> extends Sha
159160
* @default 35
160161
*/
161162
summaryRowHeight?: Maybe<number>;
163+
columnWidths?: Maybe<ColumnWidths>;
164+
onColumnWidthsChange?: Maybe<(columnWidths: ColumnWidths) => void>;
162165

163166
/**
164167
* Feature props
@@ -235,9 +238,6 @@ export interface DataGridProps<R, SR = unknown, K extends Key = Key> extends Sha
235238
direction?: Maybe<Direction>;
236239
'data-testid'?: Maybe<string>;
237240
'data-cy'?: Maybe<string>;
238-
239-
columnWidths?: Maybe<ReadonlyMap<string, number>>;
240-
onColumnWidthsChange?: Maybe<(widths: ReadonlyMap<string, number>) => void>;
241241
}
242242

243243
/**
@@ -261,6 +261,8 @@ export function DataGrid<R, SR = unknown, K extends Key = Key>(props: DataGridPr
261261
rowHeight: rawRowHeight,
262262
headerRowHeight: rawHeaderRowHeight,
263263
summaryRowHeight: rawSummaryRowHeight,
264+
columnWidths,
265+
onColumnWidthsChange,
264266
// Feature props
265267
selectedRows,
266268
isRowSelectionDisabled,
@@ -297,10 +299,7 @@ export function DataGrid<R, SR = unknown, K extends Key = Key>(props: DataGridPr
297299
'aria-describedby': ariaDescribedBy,
298300
'aria-rowcount': rawAriaRowCount,
299301
'data-testid': testId,
300-
'data-cy': dataCy,
301-
302-
columnWidths,
303-
onColumnWidthsChange
302+
'data-cy': dataCy
304303
} = props;
305304

306305
/**
@@ -326,19 +325,29 @@ export function DataGrid<R, SR = unknown, K extends Key = Key>(props: DataGridPr
326325
*/
327326
const [scrollTop, setScrollTop] = useState(0);
328327
const [scrollLeft, setScrollLeft] = useState(0);
329-
const [resizedColumnWidths, setResizedColumnWidths] = useState(
330-
(): ReadonlyMap<string, number> => new Map()
328+
const [resizedColumnWidthsInternal, setResizedColumnWidthsInternal] = useState(
329+
(): ReadonlyMap<string, number> => columnWidths?.resized ?? new Map()
331330
);
332331
const [measuredColumnWidthsInternal, setMeasuredColumnWidthsInternal] = useState(
333-
(): ReadonlyMap<string, number> => columnWidths ?? new Map()
332+
(): ReadonlyMap<string, number> => columnWidths?.measured ?? new Map()
334333
);
335334
const isColumnWidthsControlled = columnWidths != null && onColumnWidthsChange != null;
336335
const measuredColumnWidths = isColumnWidthsControlled
337-
? columnWidths
336+
? columnWidths.measured
338337
: measuredColumnWidthsInternal;
339338
const setMeasuredColumnWidths = isColumnWidthsControlled
340-
? onColumnWidthsChange
339+
? (measuredColumnWidths: ReadonlyMap<string, number>) => {
340+
onColumnWidthsChange({ ...columnWidths, measured: measuredColumnWidths });
341+
}
341342
: setMeasuredColumnWidthsInternal;
343+
const resizedColumnWidths = isColumnWidthsControlled
344+
? columnWidths.resized
345+
: resizedColumnWidthsInternal;
346+
const setResizedColumnWidths = isColumnWidthsControlled
347+
? (resizedColumnWidths: ReadonlyMap<string, number>) => {
348+
onColumnWidthsChange({ ...columnWidths, resized: resizedColumnWidths });
349+
}
350+
: setResizedColumnWidthsInternal;
342351

343352
const [isDragging, setDragging] = useState(false);
344353
const [draggedOverRowIdx, setOverRowIdx] = useState<number | undefined>(undefined);

src/hooks/useColumnWidths.ts

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useLayoutEffect, useState } from 'react';
22
import { flushSync } from 'react-dom';
33

4-
import type { CalculatedColumn, ResizedWidth, StateSetter } from '../types';
4+
import type { CalculatedColumn, ResizedWidth } from '../types';
55
import type { DataGridProps } from '../DataGrid';
66

77
export function useColumnWidths<R, SR>(
@@ -12,8 +12,8 @@ export function useColumnWidths<R, SR>(
1212
gridWidth: number,
1313
resizedColumnWidths: ReadonlyMap<string, number>,
1414
measuredColumnWidths: ReadonlyMap<string, number>,
15-
setResizedColumnWidths: StateSetter<ReadonlyMap<string, number>>,
16-
setMeasuredColumnWidths: (columnWidths: ReadonlyMap<string, number>) => void,
15+
setResizedColumnWidths: (resizedColumnWidths: ReadonlyMap<string, number>) => void,
16+
setMeasuredColumnWidths: (measuredColumnWidths: ReadonlyMap<string, number>) => void,
1717
onColumnResize: DataGridProps<R, SR>['onColumnResize']
1818
) {
1919
const [columnToAutoResize, setColumnToAutoResize] = useState<{
@@ -77,16 +77,13 @@ export function useColumnWidths<R, SR>(
7777

7878
if (columnToAutoResize !== null) {
7979
const resizingKey = columnToAutoResize.key;
80-
setResizedColumnWidths((resizedColumnWidths) => {
81-
const oldWidth = resizedColumnWidths.get(resizingKey);
82-
const newWidth = measureColumnWidth(gridRef, resizingKey);
83-
if (newWidth !== undefined && oldWidth !== newWidth) {
84-
const newResizedColumnWidths = new Map(resizedColumnWidths);
85-
newResizedColumnWidths.set(resizingKey, newWidth);
86-
return newResizedColumnWidths;
87-
}
88-
return resizedColumnWidths;
89-
});
80+
const oldWidth = resizedColumnWidths.get(resizingKey);
81+
const newWidth = measureColumnWidth(gridRef, resizingKey);
82+
if (newWidth !== undefined && oldWidth !== newWidth) {
83+
const newResizedColumnWidths = new Map(resizedColumnWidths);
84+
newResizedColumnWidths.set(resizingKey, newWidth);
85+
setResizedColumnWidths(newResizedColumnWidths);
86+
}
9087
setColumnToAutoResize(null);
9188
}
9289
}

src/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,11 @@ export interface Renderers<TRow, TSummaryRow> {
329329
noRowsFallback?: Maybe<ReactNode>;
330330
}
331331

332+
export interface ColumnWidths {
333+
readonly measured: ReadonlyMap<string, number>;
334+
readonly resized: ReadonlyMap<string, number>;
335+
}
336+
332337
export type Direction = 'ltr' | 'rtl';
333338

334339
export type ResizedWidth = number | 'max-content';

website/routes/CommonFeatures.tsx

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,6 @@ function CommonFeatures() {
323323
const [isExporting, setIsExporting] = useState(false);
324324
const gridRef = useRef<DataGridHandle>(null);
325325
const columns = useMemo(() => getColumns(countries, direction), [direction]);
326-
const [columnWidths, setColumnWidths] = useState(
327-
(): ReadonlyMap<string, number> => new Map<string, number>()
328-
);
329326

330327
const summaryRows = useMemo((): readonly SummaryRow[] => {
331328
return [
@@ -385,9 +382,6 @@ function CommonFeatures() {
385382
<button type="button" onClick={handleExportToPdf}>
386383
Export to PDF
387384
</button>
388-
<button type="button" onClick={() => setColumnWidths(new Map())}>
389-
Reset Width
390-
</button>
391385
</div>
392386
<DataGrid
393387
ref={gridRef}
@@ -408,8 +402,6 @@ function CommonFeatures() {
408402
className="fill-grid"
409403
direction={direction}
410404
enableVirtualization={!isExporting}
411-
columnWidths={columnWidths}
412-
onColumnWidthsChange={setColumnWidths}
413405
/>
414406
</>
415407
);

0 commit comments

Comments
 (0)