fix(ui): minor fixes (#3036)

* fix(ui): hide available media on person page

* fix(ui): set correct label for image cache settings

* fix(ui): disable status badge tooltip for collections

* fix(ui): replace empty space when no episodes in season

* fix: suggested changes

* fix(jobs): set watchlist sync to short interval

* chore: run i18n:extract

* fix: suggested changes
This commit is contained in:
Danshil Kokil Mungur
2022-10-04 07:03:24 +04:00
committed by GitHub
parent 21d20fdfd6
commit f5c2fc1c20
9 changed files with 60 additions and 35 deletions

View File

@@ -372,7 +372,8 @@ export interface TmdbPersonCombinedCredits {
crew: TmdbPersonCreditCrew[]; crew: TmdbPersonCreditCrew[];
} }
export interface TmdbSeasonWithEpisodes extends TmdbTvSeasonResult { export interface TmdbSeasonWithEpisodes
extends Omit<TmdbTvSeasonResult, 'episode_count'> {
episodes: TmdbTvEpisodeResult[]; episodes: TmdbTvEpisodeResult[];
external_ids: TmdbExternalIds; external_ids: TmdbExternalIds;
} }

View File

@@ -63,7 +63,7 @@ export const startJobs = (): void => {
id: 'plex-watchlist-sync', id: 'plex-watchlist-sync',
name: 'Plex Watchlist Sync', name: 'Plex Watchlist Sync',
type: 'process', type: 'process',
interval: 'long', interval: 'short',
cronSchedule: jobs['plex-watchlist-sync'].schedule, cronSchedule: jobs['plex-watchlist-sync'].schedule,
job: schedule.scheduleJob(jobs['plex-watchlist-sync'].schedule, () => { job: schedule.scheduleJob(jobs['plex-watchlist-sync'].schedule, () => {
logger.info('Starting scheduled job: Plex Watchlist Sync', { logger.info('Starting scheduled job: Plex Watchlist Sync', {

View File

@@ -50,7 +50,7 @@ interface Season {
seasonNumber: number; seasonNumber: number;
} }
export interface SeasonWithEpisodes extends Season { export interface SeasonWithEpisodes extends Omit<Season, 'episodeCount'> {
episodes: Episode[]; episodes: Episode[];
externalIds: ExternalIds; externalIds: ExternalIds;
} }
@@ -141,7 +141,6 @@ export const mapSeasonWithEpisodes = (
season: TmdbSeasonWithEpisodes season: TmdbSeasonWithEpisodes
): SeasonWithEpisodes => ({ ): SeasonWithEpisodes => ({
airDate: season.air_date, airDate: season.air_date,
episodeCount: season.episode_count,
episodes: season.episodes.map(mapEpisodeResult), episodes: season.episodes.map(mapEpisodeResult),
externalIds: mapExternalIds(season.external_ids), externalIds: mapExternalIds(season.external_ids),
id: season.id, id: season.id,

View File

@@ -1,5 +1,7 @@
import TheMovieDb from '@server/api/themoviedb'; import TheMovieDb from '@server/api/themoviedb';
import { MediaStatus } from '@server/constants/media';
import Media from '@server/entity/Media'; import Media from '@server/entity/Media';
import { getSettings } from '@server/lib/settings';
import logger from '@server/logger'; import logger from '@server/logger';
import { import {
mapCastCredits, mapCastCredits,
@@ -34,6 +36,7 @@ personRoutes.get('/:id', async (req, res, next) => {
personRoutes.get('/:id/combined_credits', async (req, res, next) => { personRoutes.get('/:id/combined_credits', async (req, res, next) => {
const tmdb = new TheMovieDb(); const tmdb = new TheMovieDb();
const settings = getSettings();
try { try {
const combinedCredits = await tmdb.getPersonCombinedCredits({ const combinedCredits = await tmdb.getPersonCombinedCredits({
@@ -41,14 +44,30 @@ personRoutes.get('/:id/combined_credits', async (req, res, next) => {
language: req.locale ?? (req.query.language as string), language: req.locale ?? (req.query.language as string),
}); });
const castMedia = await Media.getRelatedMedia( let castMedia = await Media.getRelatedMedia(
combinedCredits.cast.map((result) => result.id) combinedCredits.cast.map((result) => result.id)
); );
const crewMedia = await Media.getRelatedMedia( let crewMedia = await Media.getRelatedMedia(
combinedCredits.crew.map((result) => result.id) combinedCredits.crew.map((result) => result.id)
); );
if (settings.main.hideAvailable) {
castMedia = castMedia.filter(
(media) =>
(media.mediaType === 'movie' || media.mediaType === 'tv') &&
media.status !== MediaStatus.AVAILABLE &&
media.status !== MediaStatus.PARTIALLY_AVAILABLE
);
crewMedia = crewMedia.filter(
(media) =>
(media.mediaType === 'movie' || media.mediaType === 'tv') &&
media.status !== MediaStatus.AVAILABLE &&
media.status !== MediaStatus.PARTIALLY_AVAILABLE
);
}
return res.status(200).json({ return res.status(200).json({
cast: combinedCredits.cast cast: combinedCredits.cast
.map((result) => .map((result) =>

View File

@@ -20,7 +20,7 @@ const Tooltip = ({ children, content, tooltipConfig }: TooltipProps) => {
return ( return (
<> <>
{React.cloneElement(children, { ref: setTriggerRef })} {React.cloneElement(children, { ref: setTriggerRef })}
{visible && ( {visible && content && (
<div <div
ref={setTooltipRef} ref={setTooltipRef}
{...getTooltipProps({ {...getTooltipProps({

View File

@@ -309,7 +309,7 @@ const SettingsMain = () => {
</div> </div>
</div> </div>
<div className="form-row"> <div className="form-row">
<label htmlFor="csrfProtection" className="checkbox-label"> <label htmlFor="cacheImages" className="checkbox-label">
<span className="mr-2"> <span className="mr-2">
{intl.formatMessage(messages.cacheImages)} {intl.formatMessage(messages.cacheImages)}
</span> </span>

View File

@@ -77,7 +77,7 @@ const StatusBadge = ({
mediaType === 'movie' ? globalMessages.movie : globalMessages.tvshow mediaType === 'movie' ? globalMessages.movie : globalMessages.tvshow
), ),
}); });
} else if (hasPermission(Permission.ADMIN)) { } else if (hasPermission(Permission.ADMIN) && serviceUrl) {
mediaLink = serviceUrl; mediaLink = serviceUrl;
mediaLinkDescription = intl.formatMessage(messages.openinarr, { mediaLinkDescription = intl.formatMessage(messages.openinarr, {
arr: mediaType === 'movie' ? 'Radarr' : 'Sonarr', arr: mediaType === 'movie' ? 'Radarr' : 'Sonarr',

View File

@@ -6,6 +6,7 @@ import useSWR from 'swr';
const messages = defineMessages({ const messages = defineMessages({
somethingwentwrong: 'Something went wrong while retrieving season data.', somethingwentwrong: 'Something went wrong while retrieving season data.',
noepisodes: 'Episode list unavailable.',
}); });
type SeasonProps = { type SeasonProps = {
@@ -29,7 +30,10 @@ const Season = ({ seasonNumber, tvId }: SeasonProps) => {
return ( return (
<div className="flex flex-col justify-center divide-y divide-gray-700"> <div className="flex flex-col justify-center divide-y divide-gray-700">
{data.episodes {data.episodes.length === 0 ? (
<p>{intl.formatMessage(messages.noepisodes)}</p>
) : (
data.episodes
.slice() .slice()
.reverse() .reverse()
.map((episode) => { .map((episode) => {
@@ -56,7 +60,8 @@ const Season = ({ seasonNumber, tvId }: SeasonProps) => {
)} )}
</div> </div>
); );
})} })
)}
</div> </div>
); );
}; };

View File

@@ -881,6 +881,7 @@
"components.TitleCard.mediaerror": "{mediaType} Not Found", "components.TitleCard.mediaerror": "{mediaType} Not Found",
"components.TitleCard.tmdbid": "TMDB ID", "components.TitleCard.tmdbid": "TMDB ID",
"components.TitleCard.tvdbid": "TheTVDB ID", "components.TitleCard.tvdbid": "TheTVDB ID",
"components.TvDetails.Season.noepisodes": "Episode list unavailable.",
"components.TvDetails.Season.somethingwentwrong": "Something went wrong while retrieving season data.", "components.TvDetails.Season.somethingwentwrong": "Something went wrong while retrieving season data.",
"components.TvDetails.TvCast.fullseriescast": "Full Series Cast", "components.TvDetails.TvCast.fullseriescast": "Full Series Cast",
"components.TvDetails.TvCrew.fullseriescrew": "Full Series Crew", "components.TvDetails.TvCrew.fullseriescrew": "Full Series Crew",