Skip to content

Commit c51041a

Browse files
authored
[+] persist visible column settings, fixes #581 (#635)
* [+] add useGridColumnVisibility hook to manage column visibility state for data grids * [+] integrate useGridColumnVisibility hook in grid components
1 parent b752f6a commit c51041a

File tree

4 files changed

+48
-4
lines changed

4 files changed

+48
-4
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { useCallback, useState } from 'react';
2+
import { GridColDef, GridColumnVisibilityModel } from '@mui/x-data-grid';
3+
4+
export const useGridColumnVisibility = (
5+
storageKey: string,
6+
columns: GridColDef[]
7+
) => {
8+
const [columnVisibility, setColumnVisibility] = useState<GridColumnVisibilityModel>(() => {
9+
const defaultVisibility = columns?.reduce((acc, col) => ({
10+
...acc,
11+
[col.field]: col.hide !== true
12+
}), {});
13+
14+
const saved = localStorage.getItem(storageKey);
15+
const savedVisibility = saved ? JSON.parse(saved) : {};
16+
17+
return {
18+
...defaultVisibility,
19+
...savedVisibility
20+
};
21+
});
22+
23+
const handleColumnVisibilityChange = useCallback((newModel: GridColumnVisibilityModel) => {
24+
setColumnVisibility(newModel);
25+
localStorage.setItem(storageKey, JSON.stringify(newModel));
26+
}, [storageKey]);
27+
28+
return {
29+
columnVisibility,
30+
onColumnVisibilityChange: handleColumnVisibilityChange
31+
};
32+
};

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Error } from "components/Error/Error";
44
import { Loading } from "components/Loading/Loading";
55
import { MetricFormDialog } from "containers/MetricFormDialog/MetricFormDialog";
66
import { MetricFormProvider } from "contexts/MetricForm/MetricForm.provider";
7+
import { useGridColumnVisibility } from 'hooks/useGridColumnVisibility';
78
import { usePageStyles } from "styles/page";
89
import { useMetrics } from "queries/Metric";
910
import { useMetricsGridColumns } from "./MetricsGrid.consts";
@@ -15,6 +16,9 @@ export const MetricsGrid = () => {
1516

1617
const { classes } = usePageStyles();
1718

19+
const columns = useMetricsGridColumns();
20+
const { columnVisibility, onColumnVisibilityChange } = useGridColumnVisibility('METRICS_GRID', columns);
21+
1822
const rows: MetricGridRow[] | [] = useMemo(() => {
1923
if (data) {
2024
return Object.keys(data).map((key) => {
@@ -28,8 +32,6 @@ export const MetricsGrid = () => {
2832
return [];
2933
}, [data]);
3034

31-
const columns = useMetricsGridColumns();
32-
3335
if (isLoading) {
3436
return (
3537
<Loading />
@@ -53,6 +55,8 @@ export const MetricsGrid = () => {
5355
rowsPerPageOptions={[]}
5456
components={{ Toolbar: () => <MetricsGridToolbar /> }}
5557
disableColumnMenu
58+
columnVisibilityModel={columnVisibility}
59+
onColumnVisibilityModelChange={onColumnVisibilityChange}
5660
/>
5761
<MetricFormDialog />
5862
</MetricFormProvider>

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Error } from "components/Error/Error";
44
import { Loading } from "components/Loading/Loading";
55
import { PresetFormDialog } from "containers/PresetFormDialog/PresetFormDialog";
66
import { PresetFormProvider } from "contexts/PresetForm/PresetForm.provider";
7+
import { useGridColumnVisibility } from 'hooks/useGridColumnVisibility';
78
import { usePageStyles } from "styles/page";
89
import { usePresets } from "queries/Preset";
910
import { usePresetsGridColumns } from "./PresetsGrid.consts";
@@ -15,6 +16,9 @@ export const PresetsGrid = () => {
1516

1617
const { data, isLoading, isError, error } = usePresets();
1718

19+
const columns = usePresetsGridColumns();
20+
const { columnVisibility, onColumnVisibilityChange } = useGridColumnVisibility('PRESETS_GRID', columns);
21+
1822
const rows: PresetGridRow[] | [] = useMemo(() => {
1923
if (data) {
2024
return Object.keys(data).map((key) => {
@@ -28,8 +32,6 @@ export const PresetsGrid = () => {
2832
return [];
2933
}, [data]);
3034

31-
const columns = usePresetsGridColumns();
32-
3335
if (isLoading) {
3436
return (
3537
<Loading />
@@ -53,6 +55,8 @@ export const PresetsGrid = () => {
5355
rowsPerPageOptions={[]}
5456
components={{ Toolbar: () => <PresetsGridToolbar /> }}
5557
disableColumnMenu
58+
columnVisibilityModel={columnVisibility}
59+
onColumnVisibilityModelChange={onColumnVisibilityChange}
5660
/>
5761
<PresetFormDialog />
5862
</PresetFormProvider>

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Error } from "components/Error/Error";
33
import { Loading } from "components/Loading/Loading";
44
import { SourceFormDialog } from "containers/SourceFormDialog/SourceFormDialog";
55
import { SourceFormProvider } from "contexts/SourceForm/SourceForm.provider";
6+
import { useGridColumnVisibility } from 'hooks/useGridColumnVisibility';
67
import { usePageStyles } from "styles/page";
78
import { useSources } from "queries/Source";
89
import { useSourcesGridColumns } from "./SourcesGrid.consts";
@@ -14,6 +15,7 @@ export const SourcesGrid = () => {
1415
const { data, isLoading, isError, error } = useSources();
1516

1617
const columns = useSourcesGridColumns();
18+
const { columnVisibility, onColumnVisibilityChange } = useGridColumnVisibility('SOURCES_GRID', columns);
1719

1820
if (isLoading) {
1921
return (
@@ -38,6 +40,8 @@ export const SourcesGrid = () => {
3840
rowsPerPageOptions={[]}
3941
components={{ Toolbar: () => <SourcesGridToolbar /> }}
4042
disableColumnMenu
43+
columnVisibilityModel={columnVisibility}
44+
onColumnVisibilityModelChange={onColumnVisibilityChange}
4145
/>
4246
<SourceFormDialog />
4347
</SourceFormProvider>

0 commit comments

Comments
 (0)