From e8f1edc0621387921dca73a8c9ad1d15f6b3a847 Mon Sep 17 00:00:00 2001 From: 0xsysr3ll <31414959+0xSysR3ll@users.noreply.github.com> Date: Wed, 7 May 2025 16:41:06 +0200 Subject: [PATCH] feat(requestlist): add requests list media type filtering (#1511) * feat: add requests list media type filtering * chore: some better indent * fix(lint): missing break statements before case * fix: yet another lint issue * fix(lint): yet another lint issue * Revert "fix(lint): yet another lint issue" This reverts commit 24c3f90ed0beb6c9c37ec7aae008c329673be18f. * fix: lint issues --- jellyseerr-api.yml | 7 ++++ server/routes/request.ts | 16 +++++++++ src/components/RequestList/index.tsx | 54 +++++++++++++++++++++++++--- 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/jellyseerr-api.yml b/jellyseerr-api.yml index b6660596..8437056f 100644 --- a/jellyseerr-api.yml +++ b/jellyseerr-api.yml @@ -5867,6 +5867,13 @@ paths: type: number nullable: true example: 1 + - in: query + name: mediaType + schema: + type: string + enum: [movie, tv, all] + nullable: true + default: all responses: '200': description: Requests returned diff --git a/server/routes/request.ts b/server/routes/request.ts index 197571d7..8773b87f 100644 --- a/server/routes/request.ts +++ b/server/routes/request.ts @@ -38,6 +38,7 @@ requestRoutes.get, RequestResultsResponse>( const requestedBy = req.query.requestedBy ? Number(req.query.requestedBy) : null; + const mediaType = (req.query.mediaType as MediaType | 'all') || 'all'; let statusFilter: MediaRequestStatus[]; @@ -159,6 +160,21 @@ requestRoutes.get, RequestResultsResponse>( }); } + switch (mediaType) { + case 'all': + break; + case 'movie': + query = query.andWhere('request.type = :type', { + type: MediaType.MOVIE, + }); + break; + case 'tv': + query = query.andWhere('request.type = :type', { + type: MediaType.TV, + }); + break; + } + const [requests, requestCount] = await query .orderBy(sortFilter, sortDirection) .take(pageSize) diff --git a/src/components/RequestList/index.tsx b/src/components/RequestList/index.tsx index 2030d195..8cffe12e 100644 --- a/src/components/RequestList/index.tsx +++ b/src/components/RequestList/index.tsx @@ -14,6 +14,7 @@ import { Bars3BottomLeftIcon, ChevronLeftIcon, ChevronRightIcon, + CircleStackIcon, FunnelIcon, } from '@heroicons/react/24/solid'; import type { RequestResultsResponse } from '@server/interfaces/api/requestInterfaces'; @@ -47,6 +48,8 @@ type Sort = 'added' | 'modified'; type SortDirection = 'asc' | 'desc'; +type MediaType = 'all' | 'movie' | 'tv'; + const RequestList = () => { const router = useRouter(); const intl = useIntl(); @@ -56,6 +59,7 @@ const RequestList = () => { const { user: currentUser } = useUser(); const [currentFilter, setCurrentFilter] = useState(Filter.PENDING); const [currentSort, setCurrentSort] = useState('added'); + const [currentMediaType, setCurrentMediaType] = useState('all'); const [currentSortDirection, setCurrentSortDirection] = useState('desc'); const [currentPageSize, setCurrentPageSize] = useState(10); @@ -71,7 +75,7 @@ const RequestList = () => { } = useSWR( `/api/v1/request?take=${currentPageSize}&skip=${ pageIndex * currentPageSize - }&filter=${currentFilter}&sort=${currentSort}&sortDirection=${currentSortDirection}${ + }&filter=${currentFilter}&mediaType=${currentMediaType}&sort=${currentSort}&sortDirection=${currentSortDirection}${ router.pathname.startsWith('/profile') ? `&requestedBy=${currentUser?.id}` : router.query.userId @@ -107,12 +111,19 @@ const RequestList = () => { 'rl-filter-settings', JSON.stringify({ currentFilter, + currentMediaType, currentSort, currentSortDirection, currentPageSize, }) ); - }, [currentFilter, currentSort, currentSortDirection, currentPageSize]); + }, [ + currentFilter, + currentMediaType, + currentSort, + currentSortDirection, + currentPageSize, + ]); if (!data && !error) { return ; @@ -152,6 +163,37 @@ const RequestList = () => { {intl.formatMessage(messages.requests)}
+
+ + + + + ; +
@@ -263,11 +305,15 @@ const RequestList = () => { {intl.formatMessage(globalMessages.noresults)} - {currentFilter !== Filter.ALL && ( + {(currentFilter !== Filter.ALL || + currentMediaType !== Filter.ALL) && (