mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-20 14:39:06 +00:00
fix: resizing columns in cuesheet
This commit is contained in:
committed by
Carlos Valente
parent
3ce5b42e05
commit
36223ff49f
@@ -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]);
|
||||||
|
|||||||
Reference in New Issue
Block a user