fix: resizing columns in cuesheet

This commit is contained in:
Carlos Valente
2025-07-03 18:05:49 +02:00
committed by Carlos Valente
parent 3ce5b42e05
commit 36223ff49f
2 changed files with 29 additions and 15 deletions
@@ -110,7 +110,9 @@ export default function CuesheetTable({ data, columns }: CuesheetTableProps) {
colSizes[`--col-${header.column.id}-size`] = header.column.getSize(); colSizes[`--col-${header.column.id}-size`] = header.column.getSize();
} }
return colSizes; return colSizes;
}, [table]); // eslint-disable-next-line react-compiler/react-compiler -- unfortunately this is what we need
// eslint-disable-next-line react-hooks/exhaustive-deps -- this works well and follows documentation
}, [table.getState().columnSizingInfo, table.getState().columnSizing]);
return ( return (
<> <>
@@ -1,31 +1,43 @@
import { useCallback, useEffect } from 'react'; import { useCallback, useEffect, useState } from 'react';
import { useLocalStorage } from '@mantine/hooks'; import { useLocalStorage } from '@mantine/hooks';
import { ColumnDef } from '@tanstack/react-table'; import { ColumnDef } from '@tanstack/react-table';
import { OntimeEntry } from 'ontime-types'; import { OntimeEntry } from 'ontime-types';
import { debounce } from '../../../common/utils/debounce';
const saveSizesToStorage = debounce((sizes: Record<string, number>) => {
localStorage.setItem('table-sizes', JSON.stringify(sizes));
}, 500);
export default function useColumnManager(columns: ColumnDef<OntimeEntry>[]) { export default function useColumnManager(columns: ColumnDef<OntimeEntry>[]) {
const [columnVisibility, setColumnVisibility] = useLocalStorage({ key: 'table-hidden', defaultValue: {} }); const [columnVisibility, setColumnVisibility] = useLocalStorage({ key: 'table-hidden', defaultValue: {} });
const [columnOrder, saveColumnOrder] = useLocalStorage<string[]>({ const [columnOrder, saveColumnOrder] = useLocalStorage<string[]>({
key: 'table-order', key: 'table-order',
defaultValue: columns.map((col) => col.id as string), defaultValue: columns.map((col) => col.id as string),
}); });
const [columnSizing, setColumnSizing] = useLocalStorage({ key: 'table-sizes', defaultValue: {} });
// if the columns order changes, we update the dataset const [columnSizing, setColumnSizingState] = useState(() => {
try {
const stored = localStorage.getItem('table-sizes');
return stored ? JSON.parse(stored) : {};
} catch {
return {};
}
});
// save sizes to localStorage whenever they change (debounced)
useEffect(() => { useEffect(() => {
let shouldReplace = false; saveSizesToStorage(columnSizing);
const newColumns: string[] = []; }, [columnSizing]);
// iterate through columns to see if there are new ids const setColumnSizing = useCallback((sizes: typeof columnSizing) => {
columns.forEach((column) => { setColumnSizingState(sizes);
const columnnId = column.id as string; }, []);
if (!shouldReplace && !columnOrder.includes(columnnId)) {
shouldReplace = true;
}
newColumns.push(columnnId);
});
if (shouldReplace) { // update column order if columns change
useEffect(() => {
const newColumns = columns.map((col) => col.id as string);
if (newColumns.some((id) => !columnOrder.includes(id))) {
saveColumnOrder(newColumns); saveColumnOrder(newColumns);
} }
}, [columnOrder, columns, saveColumnOrder]); }, [columnOrder, columns, saveColumnOrder]);