1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-04-18 21:35:51 -04:00

Fixed: Improve sorting movies by release dates

This commit is contained in:
Bogdan
2024-08-23 03:21:19 +03:00
parent bf84471509
commit df77474314
15 changed files with 99 additions and 34 deletions
@@ -106,7 +106,7 @@ function MovieIndexSortMenu(props: MovieIndexSortMenuProps) {
sortDirection={sortDirection}
onPress={onSortSelect}
>
{translate('ReleaseDates')}
{translate('ReleaseDate')}
</SortMenuItem>
<SortMenuItem
@@ -75,6 +75,7 @@ function MovieIndexPoster(props: MovieIndexPosterProps) {
inCinemas,
physicalRelease,
digitalRelease,
releaseDate,
path,
movieFile,
ratings,
@@ -142,20 +143,6 @@ function MovieIndexPoster(props: MovieIndexPosterProps) {
height: `${posterHeight}px`,
};
let releaseDate = '';
let releaseDateType = '';
if (physicalRelease && digitalRelease) {
releaseDate =
physicalRelease < digitalRelease ? physicalRelease : digitalRelease;
releaseDateType = physicalRelease < digitalRelease ? 'Released' : 'Digital';
} else if (physicalRelease && !digitalRelease) {
releaseDate = physicalRelease;
releaseDateType = 'Released';
} else if (digitalRelease && !physicalRelease) {
releaseDate = digitalRelease;
releaseDateType = 'Digital';
}
return (
<div className={styles.content}>
<div className={styles.posterContainer} title={title}>
@@ -262,10 +249,8 @@ function MovieIndexPoster(props: MovieIndexPosterProps) {
) : null}
{showReleaseDate && releaseDate ? (
<div className={styles.title}>
<Icon
name={releaseDateType === 'Digital' ? icons.MOVIE_FILE : icons.DISC}
/>{' '}
<div className={styles.title} title={translate('ReleaseDate')}>
<Icon name={icons.CALENDAR} />{' '}
{getRelativeDate(releaseDate, shortDateFormat, showRelativeDates, {
timeFormat,
timeForToday: false,
@@ -314,6 +299,7 @@ function MovieIndexPoster(props: MovieIndexPosterProps) {
inCinemas={inCinemas}
physicalRelease={physicalRelease}
digitalRelease={digitalRelease}
releaseDate={releaseDate}
ratings={ratings}
sizeOnDisk={sizeOnDisk}
sortKey={sortKey}
@@ -23,6 +23,7 @@ interface MovieIndexPosterInfoProps {
inCinemas?: string;
digitalRelease?: string;
physicalRelease?: string;
releaseDate?: string;
path: string;
ratings: Ratings;
certification: string;
@@ -53,6 +54,7 @@ function MovieIndexPosterInfo(props: MovieIndexPosterInfoProps) {
inCinemas,
digitalRelease,
physicalRelease,
releaseDate,
path,
ratings,
certification,
@@ -152,7 +154,7 @@ function MovieIndexPosterInfo(props: MovieIndexPosterInfoProps) {
);
return (
<div className={styles.info}>
<div className={styles.info} title={translate('DigitalRelease')}>
<Icon name={icons.MOVIE_FILE} /> {digitalReleaseDate}
</div>
);
@@ -170,12 +172,24 @@ function MovieIndexPosterInfo(props: MovieIndexPosterInfoProps) {
);
return (
<div className={styles.info}>
<div className={styles.info} title={translate('PhysicalRelease')}>
<Icon name={icons.DISC} /> {physicalReleaseDate}
</div>
);
}
if (sortKey === 'releaseDate' && releaseDate && !showReleaseDate) {
return (
<div className={styles.info} title={translate('ReleaseDate')}>
<Icon name={icons.CALENDAR} />{' '}
{getRelativeDate(releaseDate, shortDateFormat, showRelativeDates, {
timeFormat,
timeForToday: false,
})}
</div>
);
}
if (!showTmdbRating && sortKey === 'tmdbRating' && !!ratings.tmdb) {
return (
<div className={styles.info}>
@@ -218,6 +218,7 @@ export default function MovieIndexPosters(props: MovieIndexPostersProps) {
break;
case 'digitalRelease':
case 'physicalRelease':
case 'releaseDate':
if (!showReleaseDate) {
heights.push(19);
}
@@ -42,6 +42,7 @@
.inCinemas,
.physicalRelease,
.digitalRelease,
.releaseDate,
.genres {
composes: cell;
+1
View File
@@ -20,6 +20,7 @@ interface CssExports {
'physicalRelease': string;
'popularity': string;
'qualityProfileId': string;
'releaseDate': string;
'releaseGroups': string;
'rottenTomatoesRating': string;
'runtime': string;
@@ -66,6 +66,7 @@ function MovieIndexRow(props: MovieIndexRowProps) {
inCinemas,
digitalRelease,
physicalRelease,
releaseDate,
runtime,
minimumAvailability,
path,
@@ -278,6 +279,19 @@ function MovieIndexRow(props: MovieIndexRowProps) {
);
}
if (name === 'releaseDate') {
return (
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore ts(2739)
<RelativeDateCellConnector
key={name}
className={styles[name]}
date={releaseDate}
component={VirtualTableRowCell}
/>
);
}
if (name === 'runtime') {
return (
<VirtualTableRowCell key={name} className={styles[name]}>
@@ -35,6 +35,7 @@
.inCinemas,
.physicalRelease,
.digitalRelease,
.releaseDate,
.genres {
composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
@@ -17,6 +17,7 @@ interface CssExports {
'physicalRelease': string;
'popularity': string;
'qualityProfileId': string;
'releaseDate': string;
'releaseGroups': string;
'rottenTomatoesRating': string;
'runtime': string;
+6 -5
View File
@@ -42,16 +42,17 @@ interface Movie extends ModelBase {
status: MovieStatus;
title: string;
titleSlug: string;
originalTitle: string;
originalLanguage: Language;
collection: Collection;
studio: string;
qualityProfileId: number;
added: string;
year: number;
inCinemas: string;
physicalRelease: string;
originalLanguage: Language;
originalTitle: string;
digitalRelease: string;
inCinemas?: string;
physicalRelease?: string;
digitalRelease?: string;
releaseDate?: string;
runtime: number;
minimumAvailability: string;
path: string;
+13 -8
View File
@@ -258,8 +258,10 @@ export const sortPredicates = {
},
inCinemas: function(item, direction) {
if (item.inCinemas) {
return moment(item.inCinemas).unix();
const { inCinemas } = item;
if (inCinemas) {
return moment(inCinemas).unix();
}
if (direction === sortDirections.DESCENDING) {
@@ -270,8 +272,10 @@ export const sortPredicates = {
},
physicalRelease: function(item, direction) {
if (item.physicalRelease) {
return moment(item.physicalRelease).unix();
const { physicalRelease } = item;
if (physicalRelease) {
return moment(physicalRelease).unix();
}
if (direction === sortDirections.DESCENDING) {
@@ -282,8 +286,10 @@ export const sortPredicates = {
},
digitalRelease: function(item, direction) {
if (item.digitalRelease) {
return moment(item.digitalRelease).unix();
const { digitalRelease } = item;
if (digitalRelease) {
return moment(digitalRelease).unix();
}
if (direction === sortDirections.DESCENDING) {
@@ -294,8 +300,7 @@ export const sortPredicates = {
},
releaseDate: function(item, direction) {
const { inCinemas, digitalRelease, physicalRelease } = item;
const releaseDate = digitalRelease || physicalRelease || inCinemas;
const { releaseDate } = item;
if (releaseDate) {
return moment(releaseDate).unix();
@@ -142,6 +142,12 @@ export const defaultState = {
isSortable: true,
isVisible: false
},
{
name: 'releaseDate',
label: () => translate('ReleaseDate'),
isSortable: true,
isVisible: false
},
{
name: 'runtime',
label: () => translate('Runtime'),
@@ -433,6 +439,12 @@ export const defaultState = {
type: filterBuilderTypes.DATE,
valueType: filterBuilderValueTypes.DATE
},
{
name: 'releaseDate',
label: () => translate('ReleaseDate'),
type: filterBuilderTypes.DATE,
valueType: filterBuilderValueTypes.DATE
},
{
name: 'runtime',
label: () => translate('Runtime'),