Fix item size slider for grid on album list
This commit is contained in:
parent
34f05fa2a5
commit
734b632c6c
1 changed files with 32 additions and 28 deletions
|
@ -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>
|
||||||
|
|
Reference in a new issue