mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-16 21:03:29 +00:00
fix: column reordering in cuesheet
This commit is contained in:
committed by
Carlos Valente
parent
f750ed3cdc
commit
0abc4de3cd
@@ -1,5 +1,4 @@
|
|||||||
import { useCallback, useEffect, useRef } from 'react';
|
import { useCallback, useRef } from 'react';
|
||||||
import { useLocalStorage } from '@mantine/hooks';
|
|
||||||
import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table';
|
import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table';
|
||||||
import Color from 'color';
|
import Color from 'color';
|
||||||
import { isOntimeBlock, isOntimeDelay, isOntimeEvent, OntimeRundown, OntimeRundownEntry } from 'ontime-types';
|
import { isOntimeBlock, isOntimeDelay, isOntimeEvent, OntimeRundown, OntimeRundownEntry } from 'ontime-types';
|
||||||
@@ -13,7 +12,7 @@ import DelayRow from './cuesheet-table-elements/DelayRow';
|
|||||||
import EventRow from './cuesheet-table-elements/EventRow';
|
import EventRow from './cuesheet-table-elements/EventRow';
|
||||||
import CuesheetTableSettings from './cuesheet-table-settings/CuesheetTableSettings';
|
import CuesheetTableSettings from './cuesheet-table-settings/CuesheetTableSettings';
|
||||||
import { useCuesheetSettings } from './store/CuesheetSettings';
|
import { useCuesheetSettings } from './store/CuesheetSettings';
|
||||||
import { initialColumnOrder } from './cuesheetCols';
|
import useColumnManager from './useColumnManager';
|
||||||
|
|
||||||
import style from './Cuesheet.module.scss';
|
import style from './Cuesheet.module.scss';
|
||||||
|
|
||||||
@@ -27,23 +26,20 @@ interface CuesheetProps {
|
|||||||
export default function Cuesheet({ data, columns, handleUpdate, selectedId }: CuesheetProps) {
|
export default function Cuesheet({ data, columns, handleUpdate, selectedId }: CuesheetProps) {
|
||||||
const { followSelected, showSettings, showDelayBlock, showPrevious, showIndexColumn } = useCuesheetSettings();
|
const { followSelected, showSettings, showDelayBlock, showPrevious, showIndexColumn } = useCuesheetSettings();
|
||||||
|
|
||||||
const [columnVisibility, setColumnVisibility] = useLocalStorage({ key: 'table-hidden', defaultValue: {} });
|
const {
|
||||||
const [columnOrder, saveColumnOrder] = useLocalStorage<string[]>({
|
columnVisibility,
|
||||||
key: 'table-order',
|
columnOrder,
|
||||||
defaultValue: initialColumnOrder,
|
columnSizing,
|
||||||
});
|
resetColumnOrder,
|
||||||
const [columnSizing, setColumnSizing] = useLocalStorage({ key: 'table-sizes', defaultValue: {} });
|
setColumnVisibility,
|
||||||
|
saveColumnOrder,
|
||||||
|
setColumnSizing,
|
||||||
|
} = useColumnManager(columns);
|
||||||
|
|
||||||
const selectedRef = useRef<HTMLTableRowElement | null>(null);
|
const selectedRef = useRef<HTMLTableRowElement | null>(null);
|
||||||
const tableContainerRef = useRef<HTMLDivElement | null>(null);
|
const tableContainerRef = useRef<HTMLDivElement | null>(null);
|
||||||
useFollowComponent({ followRef: selectedRef, scrollRef: tableContainerRef, doFollow: followSelected });
|
useFollowComponent({ followRef: selectedRef, scrollRef: tableContainerRef, doFollow: followSelected });
|
||||||
|
|
||||||
// keep column order in sync with columns
|
|
||||||
useEffect(() => {
|
|
||||||
const order = columns.map((col) => col.id as string);
|
|
||||||
saveColumnOrder(order);
|
|
||||||
}, [columns, saveColumnOrder]);
|
|
||||||
|
|
||||||
const table = useReactTable({
|
const table = useReactTable({
|
||||||
data,
|
data,
|
||||||
columns,
|
columns,
|
||||||
@@ -61,10 +57,6 @@ export default function Cuesheet({ data, columns, handleUpdate, selectedId }: Cu
|
|||||||
getCoreRowModel: getCoreRowModel(),
|
getCoreRowModel: getCoreRowModel(),
|
||||||
});
|
});
|
||||||
|
|
||||||
const resetColumnOrder = () => {
|
|
||||||
saveColumnOrder(initialColumnOrder);
|
|
||||||
};
|
|
||||||
|
|
||||||
const setAllVisible = () => {
|
const setAllVisible = () => {
|
||||||
table.toggleAllColumnsVisible(true);
|
table.toggleAllColumnsVisible(true);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -117,5 +117,3 @@ export function makeCuesheetColumns(customFields: CustomFields): ColumnDef<Ontim
|
|||||||
...dynamicCustomFields,
|
...dynamicCustomFields,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const initialColumnOrder: string[] = makeCuesheetColumns({}).map((column) => column.id as string);
|
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import { useCallback, useEffect } from 'react';
|
||||||
|
import { useLocalStorage } from '@mantine/hooks';
|
||||||
|
import { ColumnDef } from '@tanstack/react-table';
|
||||||
|
import { OntimeRundownEntry } from 'ontime-types';
|
||||||
|
|
||||||
|
export default function useColumnManager(columns: ColumnDef<OntimeRundownEntry>[]) {
|
||||||
|
const [columnVisibility, setColumnVisibility] = useLocalStorage({ key: 'table-hidden', defaultValue: {} });
|
||||||
|
const [columnOrder, saveColumnOrder] = useLocalStorage<string[]>({
|
||||||
|
key: 'table-order',
|
||||||
|
defaultValue: columns.map((col) => col.id as string),
|
||||||
|
});
|
||||||
|
const [columnSizing, setColumnSizing] = useLocalStorage({ key: 'table-sizes', defaultValue: {} });
|
||||||
|
|
||||||
|
// if the columns change, we update the dataset
|
||||||
|
useEffect(() => {
|
||||||
|
let shouldReplace = false;
|
||||||
|
const newColumns: string[] = [];
|
||||||
|
|
||||||
|
// iterate through columns to see if there are new ids
|
||||||
|
columns.forEach((column) => {
|
||||||
|
const columnnId = column.id as string;
|
||||||
|
if (!shouldReplace && !columnOrder.includes(columnnId)) {
|
||||||
|
shouldReplace = true;
|
||||||
|
}
|
||||||
|
newColumns.push(columnnId);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (shouldReplace) {
|
||||||
|
saveColumnOrder(newColumns);
|
||||||
|
}
|
||||||
|
}, [columnOrder, columns, saveColumnOrder]);
|
||||||
|
|
||||||
|
const resetColumnOrder = useCallback(() => {
|
||||||
|
saveColumnOrder(columns.map((col) => col.id as string));
|
||||||
|
}, [columns, saveColumnOrder]);
|
||||||
|
|
||||||
|
return {
|
||||||
|
columnVisibility,
|
||||||
|
columnOrder,
|
||||||
|
columnSizing,
|
||||||
|
resetColumnOrder,
|
||||||
|
setColumnVisibility,
|
||||||
|
saveColumnOrder,
|
||||||
|
setColumnSizing,
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user