Skip to content

Commit 2d24be8

Browse files
committed
[-] improve resizing of grid columns in webui, fixes #1242 (#1321)
Removed `columnsWithSizing` so `DataGrid` manages its own column widths internally. Renamed handler to `onColumnWidthChange` (fires once on drag end)
1 parent 98c7c13 commit 2d24be8

4 files changed

Lines changed: 36 additions & 36 deletions

File tree

internal/webui/src/hooks/useGridState.ts

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback, useState } from 'react';
1+
import { useCallback, useMemo, useState } from 'react';
22
import { GridColDef, GridColumnVisibilityModel } from '@mui/x-data-grid';
33

44
export interface GridColumnSizingModel {
@@ -49,52 +49,52 @@ export const useGridState = (
4949
}, [storageKey]);
5050

5151
const handleColumnVisibilityChange = useCallback((newModel: GridColumnVisibilityModel) => {
52-
const newState = {
53-
...gridState,
54-
columnVisibility: newModel
55-
};
56-
setGridState(newState);
57-
saveToStorage(newState);
58-
}, [gridState, saveToStorage]);
52+
setGridState(prev => {
53+
const newState = { ...prev, columnVisibility: newModel };
54+
saveToStorage(newState);
55+
return newState;
56+
});
57+
}, [saveToStorage]);
5958

60-
const handleColumnResize = useCallback((params: any) => {
61-
const newState = {
62-
...gridState,
63-
columnSizing: {
64-
...gridState.columnSizing,
65-
[params.field || params.colDef?.field]: params.width
66-
}
67-
};
68-
setGridState(newState);
69-
saveToStorage(newState);
70-
}, [gridState, saveToStorage]);
59+
const handleColumnWidthChange = useCallback((params: any) => {
60+
setGridState(prev => {
61+
const newState = {
62+
...prev,
63+
columnSizing: {
64+
...prev.columnSizing,
65+
[params.field || params.colDef?.field]: params.width
66+
}
67+
};
68+
saveToStorage(newState);
69+
return newState;
70+
});
71+
}, [saveToStorage]);
7172

7273
const resetColumnSizes = useCallback(() => {
7374
const defaultSizing = columns?.reduce((acc, col) => ({
7475
...acc,
7576
[col.field]: col.width || 150
7677
}), {});
7778

78-
const newState = {
79-
...gridState,
80-
columnSizing: defaultSizing
81-
};
82-
setGridState(newState);
83-
saveToStorage(newState);
84-
}, [columns, gridState, saveToStorage]);
79+
setGridState(prev => {
80+
const newState = { ...prev, columnSizing: defaultSizing };
81+
saveToStorage(newState);
82+
return newState;
83+
});
84+
}, [columns, saveToStorage]);
8585

86-
// Generate columns with applied widths
87-
const columnsWithSizing = columns?.map(col => ({
86+
// Memoize columns with applied widths so objects are stable between renders
87+
const columnsWithSizing = useMemo(() => columns?.map(col => ({
8888
...col,
8989
width: gridState.columnSizing[col.field] || col.width || 150
90-
}));
90+
})), [columns, gridState.columnSizing]);
9191

9292
return {
9393
columnVisibility: gridState.columnVisibility,
9494
columnSizing: gridState.columnSizing,
9595
columnsWithSizing,
9696
onColumnVisibilityChange: handleColumnVisibilityChange,
97-
onColumnResize: handleColumnResize,
97+
onColumnWidthChange: handleColumnWidthChange,
9898
resetColumnSizes
9999
};
100100
};

internal/webui/src/pages/MetricsPage/components/MetricsGrid/MetricsGrid.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export const MetricsGrid = () => {
2121
columnVisibility,
2222
columnsWithSizing,
2323
onColumnVisibilityChange,
24-
onColumnResize
24+
onColumnWidthChange
2525
} = useGridState('METRICS_GRID', columns);
2626

2727
const rows: MetricGridRow[] | [] = useMemo(() => {
@@ -63,7 +63,7 @@ export const MetricsGrid = () => {
6363
}}
6464
columnVisibilityModel={columnVisibility}
6565
onColumnVisibilityModelChange={onColumnVisibilityChange}
66-
onColumnResize={onColumnResize}
66+
onColumnWidthChange={onColumnWidthChange}
6767
initialState={{
6868
sorting: {
6969
sortModel: [{ field: 'Key', sort: 'asc' }],

internal/webui/src/pages/PresetsPage/components/PresetsGrid/PresetsGrid.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export const PresetsGrid = () => {
2121
columnVisibility,
2222
columnsWithSizing,
2323
onColumnVisibilityChange,
24-
onColumnResize
24+
onColumnWidthChange
2525
} = useGridState('PRESETS_GRID', columns);
2626

2727
const rows: PresetGridRow[] | [] = useMemo(() => {
@@ -63,7 +63,7 @@ export const PresetsGrid = () => {
6363
}}
6464
columnVisibilityModel={columnVisibility}
6565
onColumnVisibilityModelChange={onColumnVisibilityChange}
66-
onColumnResize={onColumnResize}
66+
onColumnWidthChange={onColumnWidthChange}
6767
/>
6868
<PresetFormDialog />
6969
</PresetFormProvider>

internal/webui/src/pages/SourcesPage/components/SourcesGrid/SourcesGrid.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const SourcesGrid = () => {
1919
columnVisibility,
2020
columnsWithSizing,
2121
onColumnVisibilityChange,
22-
onColumnResize
22+
onColumnWidthChange
2323
} = useGridState('SOURCES_GRID', columns, {
2424
Kind: false,
2525
IncludePattern: false,
@@ -56,7 +56,7 @@ export const SourcesGrid = () => {
5656
}}
5757
columnVisibilityModel={columnVisibility}
5858
onColumnVisibilityModelChange={onColumnVisibilityChange}
59-
onColumnResize={onColumnResize}
59+
onColumnWidthChange={onColumnWidthChange}
6060
/>
6161
<SourceFormDialog />
6262
</SourceFormProvider>

0 commit comments

Comments
 (0)