Fix item size slider for grid on album list

This commit is contained in:
jeffvli 2023-07-15 10:48:20 -07:00
parent 34f05fa2a5
commit 734b632c6c

View file

@ -115,6 +115,8 @@ export const AlbumListHeaderFilters = ({
const sortOrderLabel = ORDER.find((o) => o.value === filter.sortOrder)?.name || 'Unknown'; const sortOrderLabel = ORDER.find((o) => o.value === filter.sortOrder)?.name || 'Unknown';
const isGrid = display === ListDisplayType.CARD || display === ListDisplayType.POSTER;
const fetch = useCallback( const fetch = useCallback(
async (skip: number, take: number, filters: AlbumListFilter) => { async (skip: number, take: number, filters: AlbumListFilter) => {
const query: AlbumListQuery = { const query: AlbumListQuery = {
@ -156,7 +158,18 @@ export const AlbumListHeaderFilters = ({
const handleFilterChange = useCallback( const handleFilterChange = useCallback(
async (filters: AlbumListFilter) => { async (filters: AlbumListFilter) => {
if (display === ListDisplayType.TABLE || display === ListDisplayType.TABLE_PAGINATED) { if (isGrid) {
gridRef.current?.scrollTo(0);
gridRef.current?.resetLoadMoreItemsCache();
// Refetching within the virtualized grid may be inconsistent due to it refetching
// using an outdated set of filters. To avoid this, we fetch using the updated filters
// and then set the grid's data here.
const data = await fetch(0, 200, filters);
if (!data?.items) return;
gridRef.current?.setItemData(data.items);
} else {
const dataSource: IDatasource = { const dataSource: IDatasource = {
getRows: async (params) => { getRows: async (params) => {
const limit = params.endRow - params.startRow; const limit = params.endRow - params.startRow;
@ -208,20 +221,19 @@ export const AlbumListHeaderFilters = ({
if (display === ListDisplayType.TABLE_PAGINATED) { if (display === ListDisplayType.TABLE_PAGINATED) {
setTablePagination({ data: { currentPage: 0 }, key: 'album' }); setTablePagination({ data: { currentPage: 0 }, key: 'album' });
} }
} else {
gridRef.current?.scrollTo(0);
gridRef.current?.resetLoadMoreItemsCache();
// Refetching within the virtualized grid may be inconsistent due to it refetching
// using an outdated set of filters. To avoid this, we fetch using the updated filters
// and then set the grid's data here.
const data = await fetch(0, 200, filters);
if (!data?.items) return;
gridRef.current?.setItemData(data.items);
} }
}, },
[display, tableRef, customFilters, server, queryClient, setTablePagination, gridRef, fetch], [
isGrid,
gridRef,
fetch,
tableRef,
display,
customFilters,
server,
queryClient,
setTablePagination,
],
); );
const handleOpenFiltersModal = () => { const handleOpenFiltersModal = () => {
@ -352,10 +364,10 @@ export const AlbumListHeaderFilters = ({
}; };
const handleItemSize = (e: number) => { const handleItemSize = (e: number) => {
if (display === ListDisplayType.TABLE || display === ListDisplayType.TABLE_PAGINATED) { if (isGrid) {
setTable({ data: { rowHeight: e }, key: 'album' });
} else {
setGrid({ data: { itemsPerRow: e }, key: 'album' }); setGrid({ data: { itemsPerRow: e }, key: 'album' });
} else {
setTable({ data: { rowHeight: e }, key: 'album' });
} }
}; };
@ -593,21 +605,13 @@ export const AlbumListHeaderFilters = ({
</DropdownMenu.Item> </DropdownMenu.Item>
<DropdownMenu.Divider /> <DropdownMenu.Divider />
<DropdownMenu.Label> <DropdownMenu.Label>
{display === ListDisplayType.CARD || display === ListDisplayType.POSTER {isGrid ? 'Items per row' : 'Item size'}
? 'Items per row'
: 'Item size'}
</DropdownMenu.Label> </DropdownMenu.Label>
<DropdownMenu.Item closeMenuOnClick={false}> <DropdownMenu.Item closeMenuOnClick={false}>
<Slider <Slider
defaultValue={ defaultValue={isGrid ? grid?.itemsPerRow || 0 : table.rowHeight}
display === ListDisplayType.CARD || max={isGrid ? 14 : 100}
display === ListDisplayType.POSTER min={isGrid ? 2 : 25}
? grid?.itemsPerRow || 0
: table.rowHeight
}
label={null}
max={14}
min={2}
onChange={debouncedHandleItemSize} onChange={debouncedHandleItemSize}
/> />
</DropdownMenu.Item> </DropdownMenu.Item>