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
This commit is contained in:
@@ -5867,6 +5867,13 @@ paths:
|
|||||||
type: number
|
type: number
|
||||||
nullable: true
|
nullable: true
|
||||||
example: 1
|
example: 1
|
||||||
|
- in: query
|
||||||
|
name: mediaType
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
enum: [movie, tv, all]
|
||||||
|
nullable: true
|
||||||
|
default: all
|
||||||
responses:
|
responses:
|
||||||
'200':
|
'200':
|
||||||
description: Requests returned
|
description: Requests returned
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ requestRoutes.get<Record<string, unknown>, RequestResultsResponse>(
|
|||||||
const requestedBy = req.query.requestedBy
|
const requestedBy = req.query.requestedBy
|
||||||
? Number(req.query.requestedBy)
|
? Number(req.query.requestedBy)
|
||||||
: null;
|
: null;
|
||||||
|
const mediaType = (req.query.mediaType as MediaType | 'all') || 'all';
|
||||||
|
|
||||||
let statusFilter: MediaRequestStatus[];
|
let statusFilter: MediaRequestStatus[];
|
||||||
|
|
||||||
@@ -159,6 +160,21 @@ requestRoutes.get<Record<string, unknown>, 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
|
const [requests, requestCount] = await query
|
||||||
.orderBy(sortFilter, sortDirection)
|
.orderBy(sortFilter, sortDirection)
|
||||||
.take(pageSize)
|
.take(pageSize)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import {
|
|||||||
Bars3BottomLeftIcon,
|
Bars3BottomLeftIcon,
|
||||||
ChevronLeftIcon,
|
ChevronLeftIcon,
|
||||||
ChevronRightIcon,
|
ChevronRightIcon,
|
||||||
|
CircleStackIcon,
|
||||||
FunnelIcon,
|
FunnelIcon,
|
||||||
} from '@heroicons/react/24/solid';
|
} from '@heroicons/react/24/solid';
|
||||||
import type { RequestResultsResponse } from '@server/interfaces/api/requestInterfaces';
|
import type { RequestResultsResponse } from '@server/interfaces/api/requestInterfaces';
|
||||||
@@ -47,6 +48,8 @@ type Sort = 'added' | 'modified';
|
|||||||
|
|
||||||
type SortDirection = 'asc' | 'desc';
|
type SortDirection = 'asc' | 'desc';
|
||||||
|
|
||||||
|
type MediaType = 'all' | 'movie' | 'tv';
|
||||||
|
|
||||||
const RequestList = () => {
|
const RequestList = () => {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
@@ -56,6 +59,7 @@ const RequestList = () => {
|
|||||||
const { user: currentUser } = useUser();
|
const { user: currentUser } = useUser();
|
||||||
const [currentFilter, setCurrentFilter] = useState<Filter>(Filter.PENDING);
|
const [currentFilter, setCurrentFilter] = useState<Filter>(Filter.PENDING);
|
||||||
const [currentSort, setCurrentSort] = useState<Sort>('added');
|
const [currentSort, setCurrentSort] = useState<Sort>('added');
|
||||||
|
const [currentMediaType, setCurrentMediaType] = useState<string>('all');
|
||||||
const [currentSortDirection, setCurrentSortDirection] =
|
const [currentSortDirection, setCurrentSortDirection] =
|
||||||
useState<SortDirection>('desc');
|
useState<SortDirection>('desc');
|
||||||
const [currentPageSize, setCurrentPageSize] = useState<number>(10);
|
const [currentPageSize, setCurrentPageSize] = useState<number>(10);
|
||||||
@@ -71,7 +75,7 @@ const RequestList = () => {
|
|||||||
} = useSWR<RequestResultsResponse>(
|
} = useSWR<RequestResultsResponse>(
|
||||||
`/api/v1/request?take=${currentPageSize}&skip=${
|
`/api/v1/request?take=${currentPageSize}&skip=${
|
||||||
pageIndex * currentPageSize
|
pageIndex * currentPageSize
|
||||||
}&filter=${currentFilter}&sort=${currentSort}&sortDirection=${currentSortDirection}${
|
}&filter=${currentFilter}&mediaType=${currentMediaType}&sort=${currentSort}&sortDirection=${currentSortDirection}${
|
||||||
router.pathname.startsWith('/profile')
|
router.pathname.startsWith('/profile')
|
||||||
? `&requestedBy=${currentUser?.id}`
|
? `&requestedBy=${currentUser?.id}`
|
||||||
: router.query.userId
|
: router.query.userId
|
||||||
@@ -107,12 +111,19 @@ const RequestList = () => {
|
|||||||
'rl-filter-settings',
|
'rl-filter-settings',
|
||||||
JSON.stringify({
|
JSON.stringify({
|
||||||
currentFilter,
|
currentFilter,
|
||||||
|
currentMediaType,
|
||||||
currentSort,
|
currentSort,
|
||||||
currentSortDirection,
|
currentSortDirection,
|
||||||
currentPageSize,
|
currentPageSize,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}, [currentFilter, currentSort, currentSortDirection, currentPageSize]);
|
}, [
|
||||||
|
currentFilter,
|
||||||
|
currentMediaType,
|
||||||
|
currentSort,
|
||||||
|
currentSortDirection,
|
||||||
|
currentPageSize,
|
||||||
|
]);
|
||||||
|
|
||||||
if (!data && !error) {
|
if (!data && !error) {
|
||||||
return <LoadingSpinner />;
|
return <LoadingSpinner />;
|
||||||
@@ -152,6 +163,37 @@ const RequestList = () => {
|
|||||||
{intl.formatMessage(messages.requests)}
|
{intl.formatMessage(messages.requests)}
|
||||||
</Header>
|
</Header>
|
||||||
<div className="mt-2 flex flex-grow flex-col sm:flex-row lg:flex-grow-0">
|
<div className="mt-2 flex flex-grow flex-col sm:flex-row lg:flex-grow-0">
|
||||||
|
<div className="mb-2 flex flex-grow sm:mb-0 sm:mr-2 lg:flex-grow-0">
|
||||||
|
<span className="inline-flex cursor-default items-center rounded-l-md border border-r-0 border-gray-500 bg-gray-800 px-3 text-sm text-gray-100">
|
||||||
|
<CircleStackIcon className="h-6 w-6" />
|
||||||
|
</span>
|
||||||
|
<select
|
||||||
|
id="mediaType"
|
||||||
|
name="mediaType"
|
||||||
|
onChange={(e) => {
|
||||||
|
setCurrentMediaType(e.target.value as MediaType);
|
||||||
|
router.push({
|
||||||
|
pathname: router.pathname,
|
||||||
|
query: router.query.userId
|
||||||
|
? { userId: router.query.userId }
|
||||||
|
: {},
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
value={currentMediaType}
|
||||||
|
className="rounded-r-only"
|
||||||
|
>
|
||||||
|
<option value="all">
|
||||||
|
{intl.formatMessage(globalMessages.all)}
|
||||||
|
</option>
|
||||||
|
<option value="movie">
|
||||||
|
{intl.formatMessage(globalMessages.movies)}
|
||||||
|
</option>
|
||||||
|
<option value="tv">
|
||||||
|
{intl.formatMessage(globalMessages.tvshows)}
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
;
|
||||||
|
</div>
|
||||||
<div className="mb-2 flex flex-grow sm:mb-0 sm:mr-2 lg:flex-grow-0">
|
<div className="mb-2 flex flex-grow sm:mb-0 sm:mr-2 lg:flex-grow-0">
|
||||||
<span className="inline-flex cursor-default items-center rounded-l-md border border-r-0 border-gray-500 bg-gray-800 px-3 text-sm text-gray-100">
|
<span className="inline-flex cursor-default items-center rounded-l-md border border-r-0 border-gray-500 bg-gray-800 px-3 text-sm text-gray-100">
|
||||||
<FunnelIcon className="h-6 w-6" />
|
<FunnelIcon className="h-6 w-6" />
|
||||||
@@ -263,11 +305,15 @@ const RequestList = () => {
|
|||||||
<span className="text-2xl text-gray-400">
|
<span className="text-2xl text-gray-400">
|
||||||
{intl.formatMessage(globalMessages.noresults)}
|
{intl.formatMessage(globalMessages.noresults)}
|
||||||
</span>
|
</span>
|
||||||
{currentFilter !== Filter.ALL && (
|
{(currentFilter !== Filter.ALL ||
|
||||||
|
currentMediaType !== Filter.ALL) && (
|
||||||
<div className="mt-4">
|
<div className="mt-4">
|
||||||
<Button
|
<Button
|
||||||
buttonType="primary"
|
buttonType="primary"
|
||||||
onClick={() => setCurrentFilter(Filter.ALL)}
|
onClick={() => {
|
||||||
|
setCurrentFilter(Filter.ALL);
|
||||||
|
setCurrentMediaType(Filter.ALL);
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
{intl.formatMessage(messages.showallrequests)}
|
{intl.formatMessage(messages.showallrequests)}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
Reference in New Issue
Block a user