Misc fixes to song list page

This commit is contained in:
jeffvli 2022-12-28 01:23:54 -08:00
parent b9a03fc412
commit 7500046ac6
2 changed files with 36 additions and 34 deletions

View file

@ -50,7 +50,10 @@ export const SongListContent = ({ tableRef }: SongListContentProps) => {
...page.filter, ...page.filter,
}); });
const columnDefs = useMemo(() => getColumnDefs(page.table.columns), [page.table.columns]); const columnDefs: ColDef[] = useMemo(
() => getColumnDefs(page.table.columns),
[page.table.columns],
);
const defaultColumnDefs: ColDef = useMemo(() => { const defaultColumnDefs: ColDef = useMemo(() => {
return { return {
@ -91,9 +94,8 @@ export const SongListContent = ({ tableRef }: SongListContentProps) => {
rowCount: undefined, rowCount: undefined,
}; };
params.api.setDatasource(dataSource); params.api.setDatasource(dataSource);
params.api.ensureIndexVisible(page.table.scrollOffset || 0, 'top');
}, },
[page.filter, page.table.scrollOffset, queryClient, server], [page.filter, queryClient, server],
); );
const onPaginationChanged = useCallback( const onPaginationChanged = useCallback(
@ -119,7 +121,7 @@ export const SongListContent = ({ tableRef }: SongListContentProps) => {
} }
}; };
const handleColumnMove = useCallback(() => { const handleColumnChange = useCallback(() => {
const { columnApi } = tableRef?.current || {}; const { columnApi } = tableRef?.current || {};
const columnsOrder = columnApi?.getAllGridColumns(); const columnsOrder = columnApi?.getAllGridColumns();
@ -134,7 +136,7 @@ export const SongListContent = ({ tableRef }: SongListContentProps) => {
updatedColumns.push({ updatedColumns.push({
...columnInSettings, ...columnInSettings,
...(!page.table.autoFit && { ...(!page.table.autoFit && {
width: column.getColDef().width, width: column.getActualWidth(),
}), }),
}); });
} }
@ -143,10 +145,12 @@ export const SongListContent = ({ tableRef }: SongListContentProps) => {
setTable({ columns: updatedColumns }); setTable({ columns: updatedColumns });
}, [page.table.autoFit, page.table.columns, setTable, tableRef]); }, [page.table.autoFit, page.table.columns, setTable, tableRef]);
const handleScroll = debounce((e: BodyScrollEvent) => { const debouncedColumnChange = debounce(handleColumnChange, 200);
const handleScroll = (e: BodyScrollEvent) => {
const scrollOffset = Number((e.top / page.table.rowHeight).toFixed(0)); const scrollOffset = Number((e.top / page.table.rowHeight).toFixed(0));
setTable({ scrollOffset }); setTable({ scrollOffset });
}, 200); };
return ( return (
<Stack <Stack
@ -173,18 +177,19 @@ export const SongListContent = ({ tableRef }: SongListContentProps) => {
columnDefs={columnDefs} columnDefs={columnDefs}
defaultColDef={defaultColumnDefs} defaultColDef={defaultColumnDefs}
enableCellChangeFlash={false} enableCellChangeFlash={false}
getRowId={(data) => data.data.uniqueId} getRowId={(data) => data.data.id}
infiniteInitialRowCount={checkSongList.data?.totalRecordCount || 10} infiniteInitialRowCount={checkSongList.data?.totalRecordCount || 100}
pagination={isPaginationEnabled} pagination={isPaginationEnabled}
paginationAutoPageSize={isPaginationEnabled} paginationAutoPageSize={isPaginationEnabled}
paginationPageSize={page.table.pagination.itemsPerPage || 100}
rowBuffer={20} rowBuffer={20}
rowHeight={page.table.rowHeight || 40} rowHeight={page.table.rowHeight || 40}
rowModelType="infinite" rowModelType="infinite"
rowSelection="multiple" rowSelection="multiple"
// onBodyScroll={handleScroll}
onBodyScrollEnd={handleScroll} onBodyScrollEnd={handleScroll}
onCellContextMenu={(e) => console.log('context', e)} onCellContextMenu={(e) => console.log('context', e)}
onColumnMoved={handleColumnMove} onColumnMoved={handleColumnChange}
onColumnResized={debouncedColumnChange}
onGridReady={onGridReady} onGridReady={onGridReady}
onGridSizeChanged={handleGridSizeChange} onGridSizeChanged={handleGridSizeChange}
onPaginationChanged={onPaginationChanged} onPaginationChanged={onPaginationChanged}
@ -192,6 +197,7 @@ export const SongListContent = ({ tableRef }: SongListContentProps) => {
</VirtualGridAutoSizerContainer> </VirtualGridAutoSizerContainer>
<AnimatePresence <AnimatePresence
presenceAffectsLayout presenceAffectsLayout
initial={false}
mode="wait" mode="wait"
> >
{page.display === ListDisplayType.TABLE_PAGINATED && ( {page.display === ListDisplayType.TABLE_PAGINATED && (

View file

@ -1,6 +1,6 @@
import type { IDatasource } from '@ag-grid-community/core'; import type { IDatasource } from '@ag-grid-community/core';
import type { AgGridReact as AgGridReactType } from '@ag-grid-community/react/lib/agGridReact'; import type { AgGridReact as AgGridReactType } from '@ag-grid-community/react/lib/agGridReact';
import { Flex, Group } from '@mantine/core'; import { Flex, Group, Stack } from '@mantine/core';
import debounce from 'lodash/debounce'; import debounce from 'lodash/debounce';
import { ChangeEvent, MouseEvent, MutableRefObject, useCallback } from 'react'; import { ChangeEvent, MouseEvent, MutableRefObject, useCallback } from 'react';
import { import {
@ -89,6 +89,7 @@ export const SongListHeader = ({ tableRef }: SongListHeaderProps) => {
const setPage = useSetSongStore(); const setPage = useSetSongStore();
const setFilter = useSetSongFilters(); const setFilter = useSetSongFilters();
const setTable = useSetSongTable(); const setTable = useSetSongTable();
const setPagination = useSetSongTablePagination();
const cq = useContainerQuery(); const cq = useContainerQuery();
const musicFoldersQuery = useMusicFolders(); const musicFoldersQuery = useMusicFolders();
@ -137,8 +138,9 @@ export const SongListHeader = ({ tableRef }: SongListHeaderProps) => {
tableRef.current?.api.setDatasource(dataSource); tableRef.current?.api.setDatasource(dataSource);
tableRef.current?.api.purgeInfiniteCache(); tableRef.current?.api.purgeInfiniteCache();
tableRef.current?.api.ensureIndexVisible(0, 'top'); tableRef.current?.api.ensureIndexVisible(0, 'top');
setPagination({ currentPage: 0 });
}, },
[page.filter, server, tableRef], [page.filter, server, setPagination, tableRef],
); );
const handleSetSortBy = useCallback( const handleSetSortBy = useCallback(
@ -181,8 +183,6 @@ export const SongListHeader = ({ tableRef }: SongListHeaderProps) => {
handleFilterChange(updatedFilters); handleFilterChange(updatedFilters);
}, [page.filter.sortOrder, handleFilterChange, setFilter]); }, [page.filter.sortOrder, handleFilterChange, setFilter]);
const setPagination = useSetSongTablePagination();
const handleSetViewType = useCallback( const handleSetViewType = useCallback(
(e: MouseEvent<HTMLButtonElement>) => { (e: MouseEvent<HTMLButtonElement>) => {
if (!e.currentTarget?.value) return; if (!e.currentTarget?.value) return;
@ -303,6 +303,7 @@ export const SongListHeader = ({ tableRef }: SongListHeaderProps) => {
component="div" component="div"
sx={{ cursor: 'default' }} sx={{ cursor: 'default' }}
> >
<Stack>
<MultiSelect <MultiSelect
clearable clearable
data={SONG_TABLE_COLUMNS} data={SONG_TABLE_COLUMNS}
@ -310,12 +311,6 @@ export const SongListHeader = ({ tableRef }: SongListHeaderProps) => {
width={300} width={300}
onChange={handleTableColumns} onChange={handleTableColumns}
/> />
</DropdownMenu.Item>
<DropdownMenu.Item
closeMenuOnClick={false}
component="div"
sx={{ cursor: 'default' }}
>
<Group position="apart"> <Group position="apart">
<Text>Auto Fit Columns</Text> <Text>Auto Fit Columns</Text>
<Switch <Switch
@ -323,6 +318,7 @@ export const SongListHeader = ({ tableRef }: SongListHeaderProps) => {
onChange={handleAutoFitColumns} onChange={handleAutoFitColumns}
/> />
</Group> </Group>
</Stack>
</DropdownMenu.Item> </DropdownMenu.Item>
</DropdownMenu.Dropdown> </DropdownMenu.Dropdown>
</DropdownMenu> </DropdownMenu>