chore(deps): upgrade prettier, and tailwind (#2351)
This commit is contained in:
@@ -385,7 +385,7 @@ const BlacklistedItem = ({ item, revalidateList }: BlacklistedItemProps) => {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="z-10 mt-4 ml-4 flex w-full flex-col justify-center overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
|
||||
<div className="z-10 ml-4 mt-4 flex w-full flex-col justify-center overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
|
||||
<div className="card-field">
|
||||
<span className="card-field-name">Status</span>
|
||||
<Badge badgeType="danger">
|
||||
|
||||
@@ -329,7 +329,7 @@ const BlacklistedTagImportForm = forwardRef<
|
||||
const VerifyClearIndicator = <
|
||||
Option,
|
||||
IsMuti extends boolean,
|
||||
Group extends GroupBase<Option>
|
||||
Group extends GroupBase<Option>,
|
||||
>(
|
||||
props: ClearIndicatorProps<Option, IsMuti, Group>
|
||||
) => {
|
||||
|
||||
@@ -13,7 +13,7 @@ export type ButtonType =
|
||||
// Helper type to override types (overrides onClick)
|
||||
type MergeElementProps<
|
||||
T extends React.ElementType,
|
||||
P extends Record<string, unknown>
|
||||
P extends Record<string, unknown>,
|
||||
> = Omit<React.ComponentProps<T>, keyof P> & P;
|
||||
|
||||
type ElementTypes = 'button' | 'a';
|
||||
|
||||
@@ -57,7 +57,7 @@ const DropdownItems = ({
|
||||
>
|
||||
<Menu.Items
|
||||
className={[
|
||||
'absolute right-0 z-40 mt-2 -mr-1 w-56 origin-top-right rounded-md p-1 shadow-lg',
|
||||
'absolute right-0 z-40 -mr-1 mt-2 w-56 origin-top-right rounded-md p-1 shadow-lg',
|
||||
dropdownType === 'ghost'
|
||||
? 'border border-gray-700 bg-gray-800 bg-opacity-80 backdrop-blur'
|
||||
: 'bg-indigo-600',
|
||||
|
||||
@@ -91,7 +91,7 @@ const Modal = React.forwardRef<HTMLDivElement, ModalProps>(
|
||||
<Transition.Child
|
||||
appear
|
||||
as="div"
|
||||
className="fixed top-0 bottom-0 left-0 right-0 z-50 flex h-full w-full items-center justify-center bg-gray-800 bg-opacity-70"
|
||||
className="fixed bottom-0 left-0 right-0 top-0 z-50 flex h-full w-full items-center justify-center bg-gray-800 bg-opacity-70"
|
||||
enter="transition-opacity duration-300"
|
||||
enterFrom="opacity-0"
|
||||
enterTo="opacity-100"
|
||||
@@ -116,7 +116,7 @@ const Modal = React.forwardRef<HTMLDivElement, ModalProps>(
|
||||
</div>
|
||||
</Transition>
|
||||
<Transition
|
||||
className={`hide-scrollbar relative inline-block w-full overflow-auto bg-gray-800 px-4 pt-4 pb-4 text-left align-bottom shadow-xl ring-1 ring-gray-700 transition-all sm:my-8 sm:max-w-3xl sm:rounded-lg sm:align-middle ${dialogClass}`}
|
||||
className={`hide-scrollbar relative inline-block w-full overflow-auto bg-gray-800 px-4 pb-4 pt-4 text-left align-bottom shadow-xl ring-1 ring-gray-700 transition-all sm:my-8 sm:max-w-3xl sm:rounded-lg sm:align-middle ${dialogClass}`}
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-labelledby="modal-headline"
|
||||
@@ -135,7 +135,7 @@ const Modal = React.forwardRef<HTMLDivElement, ModalProps>(
|
||||
ref={modalRef}
|
||||
>
|
||||
{backdrop && (
|
||||
<div className="absolute top-0 left-0 right-0 z-0 h-64 max-h-full w-full">
|
||||
<div className="absolute left-0 right-0 top-0 z-0 h-64 max-h-full w-full">
|
||||
<CachedImage
|
||||
type="tmdb"
|
||||
alt=""
|
||||
|
||||
@@ -83,7 +83,7 @@ const MultiRangeSlider = ({
|
||||
max={max}
|
||||
value={valueMax}
|
||||
step="1"
|
||||
className={`pointer-events-none absolute top-0 left-0 right-0 z-20 h-2 w-full cursor-pointer appearance-none rounded-lg bg-transparent`}
|
||||
className={`pointer-events-none absolute left-0 right-0 top-0 z-20 h-2 w-full cursor-pointer appearance-none rounded-lg bg-transparent`}
|
||||
onChange={(e) => {
|
||||
const value = Number(e.target.value);
|
||||
|
||||
|
||||
@@ -35,8 +35,8 @@ const SensitiveInput = ({ as = 'input', ...props }: SensitiveInputProps) => {
|
||||
isHidden
|
||||
? 'password'
|
||||
: props.type !== 'password'
|
||||
? props.type ?? 'text'
|
||||
: 'text'
|
||||
? (props.type ?? 'text')
|
||||
: 'text'
|
||||
}
|
||||
/>
|
||||
<button
|
||||
|
||||
@@ -72,7 +72,7 @@ const SlideOver = ({
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
>
|
||||
<div className="flex h-full flex-col rounded-lg bg-gray-800 bg-opacity-80 shadow-xl ring-1 ring-gray-700 backdrop-blur">
|
||||
<header className="space-y-1 border-b border-gray-700 py-4 px-4">
|
||||
<header className="space-y-1 border-b border-gray-700 px-4 py-4">
|
||||
<div className="flex items-center justify-between space-x-3">
|
||||
<h2 className="text-overseerr text-2xl font-bold leading-7">
|
||||
{title}
|
||||
|
||||
@@ -78,7 +78,7 @@ type TableProps = {
|
||||
const Table = ({ children }: TableProps) => {
|
||||
return (
|
||||
<div className="flex flex-col">
|
||||
<div className="my-2 -mx-4 overflow-x-auto md:mx-0 lg:mx-0">
|
||||
<div className="-mx-4 my-2 overflow-x-auto md:mx-0 lg:mx-0">
|
||||
<div className="inline-block min-w-full py-2 align-middle">
|
||||
<div className="overflow-hidden rounded-lg shadow md:mx-0 lg:mx-0">
|
||||
<table className="min-w-full">{children}</table>
|
||||
|
||||
@@ -43,7 +43,7 @@ const DiscoverMovieGenre = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={title} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>{title}</Header>
|
||||
</div>
|
||||
<ListView
|
||||
|
||||
@@ -49,7 +49,7 @@ const DiscoverMovieKeyword = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={title} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>{title}</Header>
|
||||
</div>
|
||||
<ListView
|
||||
|
||||
@@ -52,7 +52,7 @@ const DiscoverMovieLanguage = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={title} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>{title}</Header>
|
||||
</div>
|
||||
<ListView
|
||||
|
||||
@@ -45,7 +45,7 @@ const DiscoverTvNetwork = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={title} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>
|
||||
{firstResultData?.network.logoPath ? (
|
||||
<div className="relative mb-6 flex h-24 justify-center sm:h-32">
|
||||
|
||||
@@ -195,7 +195,7 @@ const DiscoverSliderEdit = ({
|
||||
className={`absolute -bottom-2 left-0 w-full border-t-4 border-indigo-500`}
|
||||
/>
|
||||
)}
|
||||
<div className="flex w-full flex-col rounded-t-lg border-t border-l border-r border-gray-800 bg-gray-900 p-4 text-gray-400 md:flex-row md:items-center md:space-x-2">
|
||||
<div className="flex w-full flex-col rounded-t-lg border-l border-r border-t border-gray-800 bg-gray-900 p-4 text-gray-400 md:flex-row md:items-center md:space-x-2">
|
||||
<div
|
||||
className={`${slider.data ? 'mb-4' : 'mb-0'} flex space-x-2 md:mb-0`}
|
||||
>
|
||||
@@ -285,7 +285,7 @@ const DiscoverSliderEdit = ({
|
||||
</Button>
|
||||
</>
|
||||
)}
|
||||
<div className="absolute right-14 top-4 flex px-2 md:relative md:top-0 md:right-0">
|
||||
<div className="absolute right-14 top-4 flex px-2 md:relative md:right-0 md:top-0">
|
||||
<button
|
||||
className={'hover:text-white disabled:text-gray-800'}
|
||||
onClick={() =>
|
||||
@@ -305,7 +305,7 @@ const DiscoverSliderEdit = ({
|
||||
<ChevronDownIcon className="h-7 w-7 md:h-6 md:w-6" />
|
||||
</button>
|
||||
</div>
|
||||
<div className="absolute top-4 right-4 flex-1 text-right md:relative md:top-0 md:right-0">
|
||||
<div className="absolute right-4 top-4 flex-1 text-right md:relative md:right-0 md:top-0">
|
||||
<Tooltip content={intl.formatMessage(messages.enable)}>
|
||||
<div>
|
||||
<SlideCheckbox
|
||||
|
||||
@@ -45,7 +45,7 @@ const DiscoverMovieStudio = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={title} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>
|
||||
{firstResultData?.studio.logoPath ? (
|
||||
<div className="relative mb-6 flex h-24 justify-center sm:h-32">
|
||||
|
||||
@@ -43,7 +43,7 @@ const DiscoverTvGenre = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={title} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>{title}</Header>
|
||||
</div>
|
||||
<ListView
|
||||
|
||||
@@ -49,7 +49,7 @@ const DiscoverTvKeyword = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={title} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>{title}</Header>
|
||||
</div>
|
||||
<ListView
|
||||
|
||||
@@ -52,7 +52,7 @@ const DiscoverTvLanguage = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={title} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>{title}</Header>
|
||||
</div>
|
||||
<ListView
|
||||
|
||||
@@ -31,7 +31,7 @@ const DiscoverTvUpcoming = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={intl.formatMessage(messages.upcomingtv)} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>{intl.formatMessage(messages.upcomingtv)}</Header>
|
||||
</div>
|
||||
<ListView
|
||||
|
||||
@@ -37,8 +37,8 @@ const DiscoverWatchlist = () => {
|
||||
router.pathname.startsWith('/profile')
|
||||
? `user/${currentUser?.id}`
|
||||
: router.query.userId
|
||||
? `user/${router.query.userId}`
|
||||
: 'discover'
|
||||
? `user/${router.query.userId}`
|
||||
: 'discover'
|
||||
}/watchlist`
|
||||
);
|
||||
|
||||
@@ -55,7 +55,7 @@ const DiscoverWatchlist = () => {
|
||||
<PageTitle
|
||||
title={[title, router.query.userId ? user?.displayName : '']}
|
||||
/>
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header
|
||||
subtext={
|
||||
router.query.userId ? (
|
||||
|
||||
@@ -30,7 +30,7 @@ const MovieGenreList = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={intl.formatMessage(messages.moviegenres)} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>{intl.formatMessage(messages.moviegenres)}</Header>
|
||||
</div>
|
||||
<ul className="cards-horizontal">
|
||||
|
||||
@@ -36,7 +36,7 @@ const Trending = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={intl.formatMessage(messages.trending)} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>{intl.formatMessage(messages.trending)}</Header>
|
||||
</div>
|
||||
<ListView
|
||||
|
||||
@@ -30,7 +30,7 @@ const TvGenreList = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={intl.formatMessage(messages.seriesgenres)} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>{intl.formatMessage(messages.seriesgenres)}</Header>
|
||||
</div>
|
||||
<ul className="cards-horizontal">
|
||||
|
||||
@@ -31,7 +31,7 @@ const UpcomingMovies = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={intl.formatMessage(messages.upcomingmovies)} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>{intl.formatMessage(messages.upcomingmovies)}</Header>
|
||||
</div>
|
||||
<ListView
|
||||
|
||||
@@ -127,7 +127,7 @@ const Discover = () => {
|
||||
<>
|
||||
{isEditing && (
|
||||
<div className="my-6 rounded-lg bg-gray-800">
|
||||
<div className="flex items-center space-x-2 rounded-t-lg border-t border-l border-r border-gray-800 bg-gray-900 p-4 text-lg font-semibold text-gray-400">
|
||||
<div className="flex items-center space-x-2 rounded-t-lg border-l border-r border-t border-gray-800 bg-gray-900 p-4 text-lg font-semibold text-gray-400">
|
||||
<PlusIcon className="w-6" />
|
||||
<span data-testid="create-slider-header">
|
||||
{intl.formatMessage(messages.createnewslider)}
|
||||
@@ -172,7 +172,7 @@ const Discover = () => {
|
||||
leave="transition duration-300"
|
||||
leaveFrom="opacity-100 translate-y-0"
|
||||
leaveTo="opacity-0 translate-y-6"
|
||||
className="safe-shift-edit-menu fixed right-0 left-0 z-50 flex flex-col items-center justify-end space-x-0 space-y-2 border-t border-gray-700 bg-gray-800 bg-opacity-80 p-4 backdrop-blur sm:bottom-0 sm:flex-row sm:space-y-0 sm:space-x-3"
|
||||
className="safe-shift-edit-menu fixed left-0 right-0 z-50 flex flex-col items-center justify-end space-x-0 space-y-2 border-t border-gray-700 bg-gray-800 bg-opacity-80 p-4 backdrop-blur sm:bottom-0 sm:flex-row sm:space-x-3 sm:space-y-0"
|
||||
>
|
||||
<Button
|
||||
buttonType="default"
|
||||
|
||||
@@ -29,12 +29,12 @@ const DownloadBlock = ({
|
||||
{hasPermission(Permission.ADMIN)
|
||||
? downloadItem.title
|
||||
: downloadItem.episode
|
||||
? intl.formatMessage(messages.formattedTitle, {
|
||||
title,
|
||||
seasonNumber: downloadItem?.episode?.seasonNumber,
|
||||
episodeNumber: downloadItem?.episode?.episodeNumber,
|
||||
})
|
||||
: title}
|
||||
? intl.formatMessage(messages.formattedTitle, {
|
||||
title,
|
||||
seasonNumber: downloadItem?.episode?.seasonNumber,
|
||||
episodeNumber: downloadItem?.episode?.episodeNumber,
|
||||
})
|
||||
: title}
|
||||
</div>
|
||||
<div className="relative mb-2 h-6 min-w-0 overflow-hidden rounded-full bg-gray-700">
|
||||
<div
|
||||
|
||||
@@ -101,7 +101,7 @@ const IssueComment = ({
|
||||
{(isActiveUser || hasPermission(Permission.MANAGE_ISSUES)) && (
|
||||
<Menu
|
||||
as="div"
|
||||
className="absolute top-2 right-1 z-40 inline-block text-left"
|
||||
className="absolute right-1 top-2 z-40 inline-block text-left"
|
||||
>
|
||||
{({ open }) => (
|
||||
<>
|
||||
|
||||
@@ -370,7 +370,7 @@ const IssueDetails = () => {
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mt-4 mb-6 flex flex-col space-y-2">
|
||||
<div className="mb-6 mt-4 flex flex-col space-y-2">
|
||||
{issueData?.media.mediaUrl && (
|
||||
<Button
|
||||
as="a"
|
||||
@@ -388,13 +388,13 @@ const IssueDetails = () => {
|
||||
mediaServerName: 'Emby',
|
||||
})
|
||||
: settings.currentSettings.mediaServerType ===
|
||||
MediaServerType.PLEX
|
||||
? intl.formatMessage(messages.playonplex, {
|
||||
mediaServerName: 'Plex',
|
||||
})
|
||||
: intl.formatMessage(messages.playonplex, {
|
||||
mediaServerName: 'Jellyfin',
|
||||
})}
|
||||
MediaServerType.PLEX
|
||||
? intl.formatMessage(messages.playonplex, {
|
||||
mediaServerName: 'Plex',
|
||||
})
|
||||
: intl.formatMessage(messages.playonplex, {
|
||||
mediaServerName: 'Jellyfin',
|
||||
})}
|
||||
</span>
|
||||
</Button>
|
||||
)}
|
||||
@@ -436,13 +436,13 @@ const IssueDetails = () => {
|
||||
mediaServerName: 'Emby',
|
||||
})
|
||||
: settings.currentSettings.mediaServerType ===
|
||||
MediaServerType.PLEX
|
||||
? intl.formatMessage(messages.play4konplex, {
|
||||
mediaServerName: 'Plex',
|
||||
})
|
||||
: intl.formatMessage(messages.play4konplex, {
|
||||
mediaServerName: 'Jellyfin',
|
||||
})}
|
||||
MediaServerType.PLEX
|
||||
? intl.formatMessage(messages.play4konplex, {
|
||||
mediaServerName: 'Plex',
|
||||
})
|
||||
: intl.formatMessage(messages.play4konplex, {
|
||||
mediaServerName: 'Jellyfin',
|
||||
})}
|
||||
</span>
|
||||
</Button>
|
||||
)}
|
||||
@@ -483,7 +483,7 @@ const IssueDetails = () => {
|
||||
/>
|
||||
))}
|
||||
{otherComments.length === 0 && (
|
||||
<div className="mt-4 mb-10 text-gray-400">
|
||||
<div className="mb-10 mt-4 text-gray-400">
|
||||
<span>{intl.formatMessage(messages.nocomments)}</span>
|
||||
</div>
|
||||
)}
|
||||
@@ -636,7 +636,7 @@ const IssueDetails = () => {
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mt-4 mb-6 flex flex-col space-y-2">
|
||||
<div className="mb-6 mt-4 flex flex-col space-y-2">
|
||||
{issueData?.media.mediaUrl && (
|
||||
<Button
|
||||
as="a"
|
||||
@@ -654,13 +654,13 @@ const IssueDetails = () => {
|
||||
mediaServerName: 'Emby',
|
||||
})
|
||||
: settings.currentSettings.mediaServerType ===
|
||||
MediaServerType.PLEX
|
||||
? intl.formatMessage(messages.playonplex, {
|
||||
mediaServerName: 'Plex',
|
||||
})
|
||||
: intl.formatMessage(messages.playonplex, {
|
||||
mediaServerName: 'Jellyfin',
|
||||
})}
|
||||
MediaServerType.PLEX
|
||||
? intl.formatMessage(messages.playonplex, {
|
||||
mediaServerName: 'Plex',
|
||||
})
|
||||
: intl.formatMessage(messages.playonplex, {
|
||||
mediaServerName: 'Jellyfin',
|
||||
})}
|
||||
</span>
|
||||
</Button>
|
||||
)}
|
||||
@@ -701,13 +701,13 @@ const IssueDetails = () => {
|
||||
mediaServerName: 'Emby',
|
||||
})
|
||||
: settings.currentSettings.mediaServerType ===
|
||||
MediaServerType.PLEX
|
||||
? intl.formatMessage(messages.play4konplex, {
|
||||
mediaServerName: 'Plex',
|
||||
})
|
||||
: intl.formatMessage(messages.play4konplex, {
|
||||
mediaServerName: 'Jellyfin',
|
||||
})}
|
||||
MediaServerType.PLEX
|
||||
? intl.formatMessage(messages.play4konplex, {
|
||||
mediaServerName: 'Plex',
|
||||
})
|
||||
: intl.formatMessage(messages.play4konplex, {
|
||||
mediaServerName: 'Jellyfin',
|
||||
})}
|
||||
</span>
|
||||
</Button>
|
||||
)}
|
||||
|
||||
@@ -216,7 +216,7 @@ const IssueItem = ({ issue }: IssueItemProps) => {
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="z-10 mt-4 ml-4 flex w-full flex-col justify-center overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
|
||||
<div className="z-10 ml-4 mt-4 flex w-full flex-col justify-center overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
|
||||
<div className="card-field">
|
||||
<span className="card-field-name">
|
||||
{intl.formatMessage(messages.issuestatus)}
|
||||
|
||||
@@ -109,40 +109,40 @@ const LanguageSelector = ({
|
||||
isFixed: true,
|
||||
}
|
||||
: (value === '' || !value || value === 'server') && isUserSettings
|
||||
? {
|
||||
value: 'server',
|
||||
label: intl.formatMessage(messages.languageServerDefault, {
|
||||
language: serverValue
|
||||
? serverValue
|
||||
.split('|')
|
||||
.map((value) => languageName(value))
|
||||
.reduce((prev, curr) =>
|
||||
intl.formatMessage(globalMessages.delimitedlist, {
|
||||
a: prev,
|
||||
b: curr,
|
||||
})
|
||||
)
|
||||
: intl.formatMessage(messages.originalLanguageDefault),
|
||||
}),
|
||||
isFixed: true,
|
||||
}
|
||||
: (value
|
||||
?.split('|')
|
||||
.map((code) => {
|
||||
const matchedLanguage = sortedLanguages?.find(
|
||||
(lang) => lang.iso_639_1 === code
|
||||
);
|
||||
? {
|
||||
value: 'server',
|
||||
label: intl.formatMessage(messages.languageServerDefault, {
|
||||
language: serverValue
|
||||
? serverValue
|
||||
.split('|')
|
||||
.map((value) => languageName(value))
|
||||
.reduce((prev, curr) =>
|
||||
intl.formatMessage(globalMessages.delimitedlist, {
|
||||
a: prev,
|
||||
b: curr,
|
||||
})
|
||||
)
|
||||
: intl.formatMessage(messages.originalLanguageDefault),
|
||||
}),
|
||||
isFixed: true,
|
||||
}
|
||||
: (value
|
||||
?.split('|')
|
||||
.map((code) => {
|
||||
const matchedLanguage = sortedLanguages?.find(
|
||||
(lang) => lang.iso_639_1 === code
|
||||
);
|
||||
|
||||
if (!matchedLanguage) {
|
||||
return undefined;
|
||||
}
|
||||
if (!matchedLanguage) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return {
|
||||
label: matchedLanguage.name,
|
||||
value: matchedLanguage.iso_639_1,
|
||||
};
|
||||
})
|
||||
.filter((option) => option !== undefined) as OptionType[])
|
||||
return {
|
||||
label: matchedLanguage.name,
|
||||
value: matchedLanguage.iso_639_1,
|
||||
};
|
||||
})
|
||||
.filter((option) => option !== undefined) as OptionType[])
|
||||
}
|
||||
onChange={(value, options) => {
|
||||
if (
|
||||
|
||||
@@ -179,7 +179,7 @@ const MobileMenu = ({
|
||||
leave="transition duration-500"
|
||||
leaveFrom="opacity-100 -translate-y-full"
|
||||
leaveTo="opacity-0 translate-y-0"
|
||||
className="absolute top-0 left-0 right-0 flex w-full -translate-y-full flex-col space-y-6 border-t border-gray-600 bg-gray-900 bg-opacity-90 px-6 py-6 font-semibold text-gray-100 backdrop-blur"
|
||||
className="absolute left-0 right-0 top-0 flex w-full -translate-y-full flex-col space-y-6 border-t border-gray-600 bg-gray-900 bg-opacity-90 px-6 py-6 font-semibold text-gray-100 backdrop-blur"
|
||||
>
|
||||
{filteredLinks.map((link) => {
|
||||
const isActive = router.pathname.match(link.activeRegExp);
|
||||
@@ -249,7 +249,7 @@ const MobileMenu = ({
|
||||
{link.href === '/requests' &&
|
||||
pendingRequestsCount > 0 &&
|
||||
hasPermission(Permission.MANAGE_REQUESTS) && (
|
||||
<div className="absolute left-3 bottom-3">
|
||||
<div className="absolute bottom-3 left-3">
|
||||
<Badge
|
||||
className={`bg-gradient-to-br ${
|
||||
router.pathname.match(link.activeRegExp)
|
||||
@@ -257,7 +257,7 @@ const MobileMenu = ({
|
||||
: 'border-indigo-500 from-indigo-600 to-purple-600'
|
||||
} flex ${
|
||||
pendingRequestsCount > 99 ? 'w-6' : 'w-4'
|
||||
} h-4 items-center justify-center !px-[5px] !py-[7px] text-[8px]`}
|
||||
} h-4 items-center justify-center !px-[5px] !py-[7px] text-[8px]`}
|
||||
>
|
||||
{pendingRequestsCount > 99
|
||||
? '99+'
|
||||
|
||||
@@ -110,8 +110,8 @@ const PullToRefresh = () => {
|
||||
pullDownIconLocation < pullDownStopThreshold && pullDownInitThreshold
|
||||
? pullDownIconLocation
|
||||
: pullDownInitThreshold
|
||||
? pullDownStopThreshold
|
||||
: '',
|
||||
? pullDownStopThreshold
|
||||
: '',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
|
||||
@@ -188,7 +188,7 @@ const Sidebar = ({
|
||||
</div>
|
||||
<div
|
||||
ref={navRef}
|
||||
className="flex flex-1 flex-col overflow-y-auto pt-4 pb-8 sm:pb-4"
|
||||
className="flex flex-1 flex-col overflow-y-auto pb-8 pt-4 sm:pb-4"
|
||||
>
|
||||
<div className="flex flex-shrink-0 items-center px-2">
|
||||
<span className="w-full px-4 text-xl text-gray-50">
|
||||
@@ -218,13 +218,11 @@ const Sidebar = ({
|
||||
}}
|
||||
role="button"
|
||||
tabIndex={0}
|
||||
className={`flex items-center rounded-md px-2 py-2 text-base font-medium leading-6 text-white transition duration-150 ease-in-out focus:outline-none
|
||||
${
|
||||
className={`flex items-center rounded-md px-2 py-2 text-base font-medium leading-6 text-white transition duration-150 ease-in-out focus:outline-none ${
|
||||
router.pathname.match(sidebarLink.activeRegExp)
|
||||
? 'bg-gradient-to-br from-indigo-600 to-purple-600 hover:from-indigo-500 hover:to-purple-500'
|
||||
: 'hover:bg-gray-700 focus:bg-gray-700'
|
||||
}
|
||||
`}
|
||||
} `}
|
||||
data-testid={`${sidebarLink.dataTestId}-mobile`}
|
||||
>
|
||||
{sidebarLink.svgIcon}
|
||||
@@ -255,7 +253,7 @@ const Sidebar = ({
|
||||
</Transition>
|
||||
</div>
|
||||
|
||||
<div className="fixed top-0 bottom-0 left-0 z-30 hidden lg:flex lg:flex-shrink-0">
|
||||
<div className="fixed bottom-0 left-0 top-0 z-30 hidden lg:flex lg:flex-shrink-0">
|
||||
<div className="sidebar flex w-64 flex-col">
|
||||
<div className="flex h-0 flex-1 flex-col">
|
||||
<div className="flex flex-1 flex-col overflow-y-auto pb-4">
|
||||
@@ -279,13 +277,11 @@ const Sidebar = ({
|
||||
key={`desktop-${sidebarLink.messagesKey}`}
|
||||
href={sidebarLink.href}
|
||||
as={sidebarLink.as}
|
||||
className={`group flex items-center rounded-md px-2 py-2 text-lg font-medium leading-6 text-white transition duration-150 ease-in-out focus:outline-none
|
||||
${
|
||||
router.pathname.match(sidebarLink.activeRegExp)
|
||||
? 'bg-gradient-to-br from-indigo-600 to-purple-600 hover:from-indigo-500 hover:to-purple-500'
|
||||
: 'hover:bg-gray-700 focus:bg-gray-700'
|
||||
}
|
||||
`}
|
||||
className={`group flex items-center rounded-md px-2 py-2 text-lg font-medium leading-6 text-white transition duration-150 ease-in-out focus:outline-none ${
|
||||
router.pathname.match(sidebarLink.activeRegExp)
|
||||
? 'bg-gradient-to-br from-indigo-600 to-purple-600 hover:from-indigo-500 hover:to-purple-500'
|
||||
: 'hover:bg-gray-700 focus:bg-gray-700'
|
||||
} `}
|
||||
data-testid={sidebarLink.dataTestId}
|
||||
>
|
||||
{sidebarLink.svgIcon}
|
||||
|
||||
@@ -39,7 +39,7 @@ const MiniQuotaDisplay = ({ userId }: MiniQuotaDisplayProps) => {
|
||||
{intl.formatMessage(messages.movierequests)}
|
||||
</div>
|
||||
<div className="flex h-full items-center space-x-2 text-gray-200">
|
||||
{data?.movie.limit ?? 0 > 0 ? (
|
||||
{(data?.movie.limit ?? 0) > 0 ? (
|
||||
<>
|
||||
<ProgressCircle
|
||||
className="h-8 w-8"
|
||||
@@ -67,7 +67,7 @@ const MiniQuotaDisplay = ({ userId }: MiniQuotaDisplayProps) => {
|
||||
{intl.formatMessage(messages.seriesrequests)}
|
||||
</div>
|
||||
<div className="flex h-full items-center space-x-2 text-gray-200">
|
||||
{data?.tv.limit ?? 0 > 0 ? (
|
||||
{(data?.tv.limit ?? 0) > 0 ? (
|
||||
<>
|
||||
<ProgressCircle
|
||||
className="h-8 w-8"
|
||||
|
||||
@@ -36,8 +36,8 @@ const VersionStatus = ({ onClick }: VersionStatusProps) => {
|
||||
data.commitTag === 'local'
|
||||
? 'Keep it up! 👍'
|
||||
: data.version.startsWith('develop-')
|
||||
? intl.formatMessage(messages.streamdevelop)
|
||||
: intl.formatMessage(messages.streamstable);
|
||||
? intl.formatMessage(messages.streamdevelop)
|
||||
: intl.formatMessage(messages.streamstable);
|
||||
|
||||
return (
|
||||
<Link
|
||||
|
||||
@@ -96,7 +96,7 @@ const Layout = ({ children }: LayoutProps) => {
|
||||
WebkitBackdropFilter: isScrolled ? 'blur(5px)' : undefined,
|
||||
}}
|
||||
>
|
||||
<div className="flex flex-1 items-center justify-between px-4 md:pr-4 md:pl-4">
|
||||
<div className="flex flex-1 items-center justify-between px-4 md:pl-4 md:pr-4">
|
||||
<button
|
||||
className={`mr-2 hidden text-white sm:block ${
|
||||
isScrolled ? 'opacity-90' : 'opacity-70'
|
||||
|
||||
@@ -11,7 +11,7 @@ interface BarProps {
|
||||
const Bar = ({ progress, isFinished }: BarProps) => {
|
||||
return (
|
||||
<div
|
||||
className={`duration-400 fixed top-0 left-0 z-50 w-full transition-opacity ease-out ${
|
||||
className={`duration-400 fixed left-0 top-0 z-50 w-full transition-opacity ease-out ${
|
||||
isFinished ? 'opacity-0' : 'opacity-100'
|
||||
}`}
|
||||
>
|
||||
|
||||
@@ -95,7 +95,7 @@ const AddEmailModal: React.FC<AddEmailModalProps> = ({
|
||||
<label htmlFor="email" className="text-label">
|
||||
{intl.formatMessage(messages.email)}
|
||||
</label>
|
||||
<div className="mt-1 mb-2 sm:col-span-2 sm:mt-0">
|
||||
<div className="mb-2 mt-1 sm:col-span-2 sm:mt-0">
|
||||
<div className="flex rounded-md shadow-sm">
|
||||
<Field
|
||||
id="email"
|
||||
|
||||
@@ -45,8 +45,8 @@ const JellyfinLogin: React.FC<JellyfinLoginProps> = ({
|
||||
serverType === MediaServerType.JELLYFIN
|
||||
? ServerType.JELLYFIN
|
||||
: serverType === MediaServerType.EMBY
|
||||
? ServerType.EMBY
|
||||
: 'Media Server',
|
||||
? ServerType.EMBY
|
||||
: 'Media Server',
|
||||
};
|
||||
|
||||
const LoginSchema = Yup.object().shape({
|
||||
@@ -113,13 +113,13 @@ const JellyfinLogin: React.FC<JellyfinLoginProps> = ({
|
||||
<>
|
||||
<Form data-form-type="login">
|
||||
<div>
|
||||
<h2 className="mb-6 -mt-1 text-center text-lg font-bold text-neutral-200">
|
||||
<h2 className="-mt-1 mb-6 text-center text-lg font-bold text-neutral-200">
|
||||
{intl.formatMessage(messages.loginwithapp, {
|
||||
appName: mediaServerFormatValues.mediaServerName,
|
||||
})}
|
||||
</h2>
|
||||
|
||||
<div className="mt-1 mb-4">
|
||||
<div className="mb-4 mt-1">
|
||||
<div className="form-input-field">
|
||||
<Field
|
||||
id="username"
|
||||
@@ -135,7 +135,7 @@ const JellyfinLogin: React.FC<JellyfinLoginProps> = ({
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="mt-1 mb-2">
|
||||
<div className="mb-2 mt-1">
|
||||
<div className="form-input-field">
|
||||
<SensitiveInput
|
||||
as="field"
|
||||
|
||||
@@ -71,13 +71,13 @@ const LocalLogin = ({ revalidate }: LocalLoginProps) => {
|
||||
<>
|
||||
<Form data-form-type="login">
|
||||
<div>
|
||||
<h2 className="mb-6 -mt-1 text-center text-lg font-bold text-neutral-200">
|
||||
<h2 className="-mt-1 mb-6 text-center text-lg font-bold text-neutral-200">
|
||||
{intl.formatMessage(messages.loginwithapp, {
|
||||
appName: settings.currentSettings.applicationTitle,
|
||||
})}
|
||||
</h2>
|
||||
|
||||
<div className="mt-1 mb-4">
|
||||
<div className="mb-4 mt-1">
|
||||
<div className="form-input-field">
|
||||
<Field
|
||||
id="email"
|
||||
@@ -98,7 +98,7 @@ const LocalLogin = ({ revalidate }: LocalLoginProps) => {
|
||||
<div className="error">{errors.email}</div>
|
||||
)}
|
||||
</div>
|
||||
<div className="mt-1 mb-2">
|
||||
<div className="mb-2 mt-1">
|
||||
<div className="form-input-field">
|
||||
<SensitiveInput
|
||||
as="field"
|
||||
@@ -132,7 +132,7 @@ const LocalLogin = ({ revalidate }: LocalLoginProps) => {
|
||||
</div>
|
||||
</div>
|
||||
{loginError && (
|
||||
<div className="mt-1 mb-2 sm:col-span-2 sm:mt-0">
|
||||
<div className="mb-2 mt-1 sm:col-span-2 sm:mt-0">
|
||||
<div className="error">{loginError}</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -42,7 +42,7 @@ const PlexLoginButton = ({
|
||||
<FormattedMessage
|
||||
{...messages.loginwithapp}
|
||||
values={{
|
||||
appName: <PlexIcon className="mt-[2px] ml-[0.35em] w-8" />,
|
||||
appName: <PlexIcon className="ml-[0.35em] mt-[2px] w-8" />,
|
||||
}}
|
||||
>
|
||||
{(chunks) => (
|
||||
|
||||
@@ -85,19 +85,19 @@ const Login = () => {
|
||||
settings.currentSettings.mediaServerType === MediaServerType.PLEX
|
||||
? 'Plex'
|
||||
: settings.currentSettings.mediaServerType === MediaServerType.JELLYFIN
|
||||
? 'Jellyfin'
|
||||
: settings.currentSettings.mediaServerType === MediaServerType.EMBY
|
||||
? 'Emby'
|
||||
: undefined;
|
||||
? 'Jellyfin'
|
||||
: settings.currentSettings.mediaServerType === MediaServerType.EMBY
|
||||
? 'Emby'
|
||||
: undefined;
|
||||
|
||||
const MediaServerLogo =
|
||||
settings.currentSettings.mediaServerType === MediaServerType.PLEX
|
||||
? PlexLogo
|
||||
: settings.currentSettings.mediaServerType === MediaServerType.JELLYFIN
|
||||
? JellyfinLogo
|
||||
: settings.currentSettings.mediaServerType === MediaServerType.EMBY
|
||||
? EmbyLogo
|
||||
: undefined;
|
||||
? JellyfinLogo
|
||||
: settings.currentSettings.mediaServerType === MediaServerType.EMBY
|
||||
? EmbyLogo
|
||||
: undefined;
|
||||
|
||||
const isJellyfin =
|
||||
settings.currentSettings.mediaServerType === MediaServerType.JELLYFIN ||
|
||||
@@ -159,7 +159,7 @@ const Login = () => {
|
||||
) ?? []
|
||||
}
|
||||
/>
|
||||
<div className="absolute top-4 right-4 z-50">
|
||||
<div className="absolute right-4 top-4 z-50">
|
||||
<LanguagePicker />
|
||||
</div>
|
||||
<div className="relative z-40 mt-10 flex flex-col items-center px-4 sm:mx-auto sm:w-full sm:max-w-md">
|
||||
|
||||
@@ -378,7 +378,7 @@ const ManageSlideOver = ({
|
||||
</div>
|
||||
</div>
|
||||
{!!watchData.data.users.length && (
|
||||
<div className="flex flex-row space-x-2 px-4 pt-3 pb-2">
|
||||
<div className="flex flex-row space-x-2 px-4 pb-2 pt-3">
|
||||
<span className="shrink-0 font-bold leading-8">
|
||||
{intl.formatMessage(messages.playedby)}
|
||||
</span>
|
||||
@@ -391,7 +391,7 @@ const ManageSlideOver = ({
|
||||
: `/users/${user.id}`
|
||||
}
|
||||
key={`watch-user-${user.id}`}
|
||||
className="z-0 mb-1 -mr-2 shrink-0 hover:z-50"
|
||||
className="z-0 -mr-2 mb-1 shrink-0 hover:z-50"
|
||||
>
|
||||
<Tooltip
|
||||
key={`watch-user-${user.id}`}
|
||||
@@ -540,7 +540,7 @@ const ManageSlideOver = ({
|
||||
</div>
|
||||
</div>
|
||||
{!!watchData.data4k.users.length && (
|
||||
<div className="flex flex-row space-x-2 px-4 pt-3 pb-2">
|
||||
<div className="flex flex-row space-x-2 px-4 pb-2 pt-3">
|
||||
<span className="shrink-0 font-bold leading-8">
|
||||
{intl.formatMessage(messages.playedby)}
|
||||
</span>
|
||||
@@ -553,7 +553,7 @@ const ManageSlideOver = ({
|
||||
: `/users/${user.id}`
|
||||
}
|
||||
key={`watch-user-${user.id}`}
|
||||
className="z-0 mb-1 -mr-2 shrink-0 hover:z-50"
|
||||
className="z-0 -mr-2 mb-1 shrink-0 hover:z-50"
|
||||
>
|
||||
<Tooltip
|
||||
key={`watch-user-${user.id}`}
|
||||
@@ -711,9 +711,9 @@ const ManageSlideOver = ({
|
||||
MediaServerType.EMBY
|
||||
? 'Emby'
|
||||
: settings.currentSettings.mediaServerType ===
|
||||
MediaServerType.PLEX
|
||||
? 'Plex'
|
||||
: 'Jellyfin',
|
||||
MediaServerType.PLEX
|
||||
? 'Plex'
|
||||
: 'Jellyfin',
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -48,12 +48,11 @@ const ShowMoreCard = ({ url, posters }: ShowMoreCardProps) => {
|
||||
tabIndex={0}
|
||||
>
|
||||
<div
|
||||
className={`relative w-36 transform-gpu cursor-pointer
|
||||
overflow-hidden rounded-xl text-white shadow-lg ring-1 transition duration-150 ease-in-out sm:w-36 md:w-44 ${
|
||||
isHovered
|
||||
? 'scale-105 bg-gray-600 ring-gray-500'
|
||||
: 'scale-100 bg-gray-800 ring-gray-700'
|
||||
}`}
|
||||
className={`relative w-36 transform-gpu cursor-pointer overflow-hidden rounded-xl text-white shadow-lg ring-1 transition duration-150 ease-in-out sm:w-36 md:w-44 ${
|
||||
isHovered
|
||||
? 'scale-105 bg-gray-600 ring-gray-500'
|
||||
: 'scale-100 bg-gray-800 ring-gray-700'
|
||||
}`}
|
||||
>
|
||||
<div style={{ paddingBottom: '150%' }}>
|
||||
<div className="absolute inset-0 flex h-full w-full flex-col items-center p-2">
|
||||
|
||||
@@ -32,7 +32,7 @@ const MovieCast = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={[intl.formatMessage(messages.fullcast), data.title]} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header
|
||||
subtext={
|
||||
<Link href={`/movie/${data.id}`} className="hover:underline">
|
||||
|
||||
@@ -32,7 +32,7 @@ const MovieCrew = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={[intl.formatMessage(messages.fullcrew), data.title]} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header
|
||||
subtext={
|
||||
<Link href={`/movie/${data.id}`} className="hover:underline">
|
||||
|
||||
@@ -42,7 +42,7 @@ const MovieRecommendations = () => {
|
||||
<PageTitle
|
||||
title={[intl.formatMessage(messages.recommendations), movieData?.title]}
|
||||
/>
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header
|
||||
subtext={
|
||||
<Link href={`/movie/${movieData?.id}`} className="hover:underline">
|
||||
|
||||
@@ -40,7 +40,7 @@ const MovieSimilar = () => {
|
||||
<PageTitle
|
||||
title={[intl.formatMessage(messages.similar), movieData?.title]}
|
||||
/>
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header
|
||||
subtext={
|
||||
<Link href={`/movie/${movieData?.id}`} className="hover:underline">
|
||||
|
||||
@@ -232,8 +232,8 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
||||
const discoverRegion = user?.settings?.discoverRegion
|
||||
? user.settings.discoverRegion
|
||||
: settings.currentSettings.discoverRegion
|
||||
? settings.currentSettings.discoverRegion
|
||||
: 'US';
|
||||
? settings.currentSettings.discoverRegion
|
||||
: 'US';
|
||||
|
||||
const releases = data.releases.results.find(
|
||||
(r) => r.iso_3166_1 === discoverRegion
|
||||
@@ -292,8 +292,8 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
||||
const streamingRegion = user?.settings?.streamingRegion
|
||||
? user.settings.streamingRegion
|
||||
: settings.currentSettings.streamingRegion
|
||||
? settings.currentSettings.streamingRegion
|
||||
: 'US';
|
||||
? settings.currentSettings.streamingRegion
|
||||
: 'US';
|
||||
const streamingProviders =
|
||||
data?.watchProviders?.find(
|
||||
(provider) => provider.iso_3166_1 === streamingRegion
|
||||
|
||||
@@ -147,18 +147,18 @@ export const PermissionEdit = ({
|
||||
settings.currentSettings.mediaServerType === MediaServerType.PLEX
|
||||
? 'Plex'
|
||||
: settings.currentSettings.mediaServerType ===
|
||||
MediaServerType.JELLYFIN
|
||||
? 'Jellyfin'
|
||||
: 'Emby',
|
||||
MediaServerType.JELLYFIN
|
||||
? 'Jellyfin'
|
||||
: 'Emby',
|
||||
}),
|
||||
description: intl.formatMessage(messages.viewwatchlistsDescription, {
|
||||
mediaServerName:
|
||||
settings.currentSettings.mediaServerType === MediaServerType.PLEX
|
||||
? 'Plex'
|
||||
: settings.currentSettings.mediaServerType ===
|
||||
MediaServerType.JELLYFIN
|
||||
? 'Jellyfin'
|
||||
: 'Emby',
|
||||
MediaServerType.JELLYFIN
|
||||
? 'Jellyfin'
|
||||
: 'Emby',
|
||||
}),
|
||||
permission: Permission.WATCHLIST_VIEW,
|
||||
},
|
||||
|
||||
@@ -47,7 +47,7 @@ const PersonCard = ({
|
||||
>
|
||||
<div style={{ paddingBottom: '150%' }}>
|
||||
<div className="absolute inset-0 flex h-full w-full flex-col items-center p-2">
|
||||
<div className="relative mt-2 mb-4 flex h-1/2 w-full justify-center">
|
||||
<div className="relative mb-4 mt-2 flex h-1/2 w-full justify-center">
|
||||
{profilePath ? (
|
||||
<div className="relative h-full w-3/4 overflow-hidden rounded-full ring-1 ring-gray-700">
|
||||
<CachedImage
|
||||
|
||||
@@ -241,7 +241,7 @@ const PersonDetails = () => {
|
||||
<>
|
||||
<PageTitle title={data.name} />
|
||||
{(sortedCrew || sortedCast) && (
|
||||
<div className="absolute top-0 left-0 right-0 z-0 h-96">
|
||||
<div className="absolute left-0 right-0 top-0 z-0 h-96">
|
||||
<ImageFader
|
||||
isDarker
|
||||
backgroundImages={[...(sortedCast ?? []), ...(sortedCrew ?? [])]
|
||||
@@ -255,7 +255,7 @@ const PersonDetails = () => {
|
||||
</div>
|
||||
)}
|
||||
<div
|
||||
className={`relative z-10 mt-4 mb-8 flex flex-col items-center lg:flex-row ${
|
||||
className={`relative z-10 mb-8 mt-4 flex flex-col items-center lg:flex-row ${
|
||||
data.biography ? 'lg:items-start' : ''
|
||||
}`}
|
||||
>
|
||||
@@ -277,7 +277,7 @@ const PersonDetails = () => {
|
||||
{mediaTypePicker}
|
||||
</div>
|
||||
</div>
|
||||
<div className="mt-1 mb-2 space-y-1 text-xs text-white sm:text-sm lg:text-base">
|
||||
<div className="mb-2 mt-1 space-y-1 text-xs text-white sm:text-sm lg:text-base">
|
||||
<div>{personAttributes.join(' | ')}</div>
|
||||
{(data.alsoKnownAs ?? []).length > 0 && (
|
||||
<div>
|
||||
|
||||
@@ -118,12 +118,12 @@ const RegionSelector = ({
|
||||
{selectedRegion && selectedRegion.iso_3166_1 !== 'all'
|
||||
? regionName(selectedRegion.iso_3166_1)
|
||||
: isUserSetting && selectedRegion?.iso_3166_1 !== 'all'
|
||||
? intl.formatMessage(messages.regionServerDefault, {
|
||||
region: regionValue
|
||||
? regionName(regionValue)
|
||||
: intl.formatMessage(messages.regionDefault),
|
||||
})
|
||||
: intl.formatMessage(messages.regionDefault)}
|
||||
? intl.formatMessage(messages.regionServerDefault, {
|
||||
region: regionValue
|
||||
? regionName(regionValue)
|
||||
: intl.formatMessage(messages.regionDefault),
|
||||
})
|
||||
: intl.formatMessage(messages.regionDefault)}
|
||||
</span>
|
||||
<span className="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2 text-gray-500">
|
||||
<ChevronDownIcon className="h-5 w-5" />
|
||||
|
||||
@@ -285,7 +285,7 @@ const RequestBlock = ({ request, onUpdate }: RequestBlockProps) => {
|
||||
)}
|
||||
{(server || profile || rootFolder || languageProfile) && (
|
||||
<>
|
||||
<div className="mt-4 mb-1 text-sm">
|
||||
<div className="mb-1 mt-4 text-sm">
|
||||
{intl.formatMessage(messages.requestoverrides)}
|
||||
</div>
|
||||
<ul className="divide-y divide-gray-700 rounded-md bg-gray-800 px-2 text-xs">
|
||||
|
||||
@@ -79,15 +79,16 @@ const RequestButton = ({
|
||||
// Current user's pending request, or the first pending request
|
||||
const activeRequest = useMemo(() => {
|
||||
return activeRequests && activeRequests.length > 0
|
||||
? activeRequests.find((request) => request.requestedBy.id === user?.id) ??
|
||||
activeRequests[0]
|
||||
? (activeRequests.find(
|
||||
(request) => request.requestedBy.id === user?.id
|
||||
) ?? activeRequests[0])
|
||||
: undefined;
|
||||
}, [activeRequests, user]);
|
||||
const active4kRequest = useMemo(() => {
|
||||
return active4kRequests && active4kRequests.length > 0
|
||||
? active4kRequests.find(
|
||||
? (active4kRequests.find(
|
||||
(request) => request.requestedBy.id === user?.id
|
||||
) ?? active4kRequests[0]
|
||||
) ?? active4kRequests[0])
|
||||
: undefined;
|
||||
}, [active4kRequests, user]);
|
||||
|
||||
|
||||
@@ -398,7 +398,7 @@ const RequestCard = ({ request, onTitleData }: RequestCardProps) => {
|
||||
)}
|
||||
{!isMovie(title) && request.seasons.length > 0 && (
|
||||
<div className="my-0.5 hidden items-center text-sm sm:my-1 sm:flex">
|
||||
<span className="mr-2 font-bold ">
|
||||
<span className="mr-2 font-bold">
|
||||
{intl.formatMessage(messages.seasons, {
|
||||
seasonCount: request.seasons.length,
|
||||
})}
|
||||
|
||||
@@ -115,7 +115,7 @@ const RequestItemError = ({
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
<div className="mt-4 ml-4 flex w-full flex-col justify-center overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
|
||||
<div className="ml-4 mt-4 flex w-full flex-col justify-center overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
|
||||
{requestData && (
|
||||
<>
|
||||
<div className="card-field">
|
||||
@@ -486,7 +486,7 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="z-10 mt-4 ml-4 flex w-full flex-col justify-center gap-1 overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
|
||||
<div className="z-10 ml-4 mt-4 flex w-full flex-col justify-center gap-1 overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
|
||||
<div className="card-field">
|
||||
<span className="card-field-name">
|
||||
{intl.formatMessage(globalMessages.status)}
|
||||
|
||||
@@ -79,8 +79,8 @@ const RequestList = () => {
|
||||
router.pathname.startsWith('/profile')
|
||||
? `&requestedBy=${currentUser?.id}`
|
||||
: router.query.userId
|
||||
? `&requestedBy=${router.query.userId}`
|
||||
: ''
|
||||
? `&requestedBy=${router.query.userId}`
|
||||
: ''
|
||||
}`
|
||||
);
|
||||
|
||||
|
||||
@@ -308,7 +308,7 @@ const AdvancedRequester = ({
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="mt-4 mb-2 flex items-center text-lg font-semibold">
|
||||
<div className="mb-2 mt-4 flex items-center text-lg font-semibold">
|
||||
{intl.formatMessage(messages.advancedoptions)}
|
||||
</div>
|
||||
<div className="rounded-md">
|
||||
@@ -378,11 +378,11 @@ const AdvancedRequester = ({
|
||||
name: profile.name,
|
||||
})
|
||||
: !isAnime &&
|
||||
serverData.server.activeProfileId === profile.id
|
||||
? intl.formatMessage(messages.default, {
|
||||
name: profile.name,
|
||||
})
|
||||
: profile.name}
|
||||
serverData.server.activeProfileId === profile.id
|
||||
? intl.formatMessage(messages.default, {
|
||||
name: profile.name,
|
||||
})
|
||||
: profile.name}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
@@ -425,17 +425,17 @@ const AdvancedRequester = ({
|
||||
}),
|
||||
})
|
||||
: !isAnime &&
|
||||
serverData.server.activeDirectory === folder.path
|
||||
? intl.formatMessage(messages.default, {
|
||||
name: intl.formatMessage(messages.folder, {
|
||||
serverData.server.activeDirectory === folder.path
|
||||
? intl.formatMessage(messages.default, {
|
||||
name: intl.formatMessage(messages.folder, {
|
||||
path: folder.path,
|
||||
space: formatBytes(folder.freeSpace ?? 0),
|
||||
}),
|
||||
})
|
||||
: intl.formatMessage(messages.folder, {
|
||||
path: folder.path,
|
||||
space: formatBytes(folder.freeSpace ?? 0),
|
||||
}),
|
||||
})
|
||||
: intl.formatMessage(messages.folder, {
|
||||
path: folder.path,
|
||||
space: formatBytes(folder.freeSpace ?? 0),
|
||||
})}
|
||||
})}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
@@ -481,12 +481,12 @@ const AdvancedRequester = ({
|
||||
name: language.name,
|
||||
})
|
||||
: !isAnime &&
|
||||
serverData.server.activeLanguageProfileId ===
|
||||
language.id
|
||||
? intl.formatMessage(messages.default, {
|
||||
name: language.name,
|
||||
})
|
||||
: language.name}
|
||||
serverData.server.activeLanguageProfileId ===
|
||||
language.id
|
||||
? intl.formatMessage(messages.default, {
|
||||
name: language.name,
|
||||
})
|
||||
: language.name}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
|
||||
@@ -278,13 +278,13 @@ const CollectionRequestModal = ({
|
||||
isUpdating
|
||||
? intl.formatMessage(globalMessages.requesting)
|
||||
: selectedParts.length === 0
|
||||
? intl.formatMessage(messages.selectmovies)
|
||||
: intl.formatMessage(
|
||||
is4k ? messages.requestmovies4k : messages.requestmovies,
|
||||
{
|
||||
count: selectedParts.length,
|
||||
}
|
||||
)
|
||||
? intl.formatMessage(messages.selectmovies)
|
||||
: intl.formatMessage(
|
||||
is4k ? messages.requestmovies4k : messages.requestmovies,
|
||||
{
|
||||
count: selectedParts.length,
|
||||
}
|
||||
)
|
||||
}
|
||||
okDisabled={selectedParts.length === 0}
|
||||
okButtonType={'primary'}
|
||||
|
||||
@@ -238,23 +238,23 @@ const MovieRequestModal = ({
|
||||
hasPermission(Permission.MANAGE_REQUESTS)
|
||||
? updateRequest(true)
|
||||
: hasPermission(Permission.REQUEST_ADVANCED)
|
||||
? updateRequest()
|
||||
: cancelRequest()
|
||||
? updateRequest()
|
||||
: cancelRequest()
|
||||
}
|
||||
okDisabled={isUpdating}
|
||||
okText={
|
||||
hasPermission(Permission.MANAGE_REQUESTS)
|
||||
? intl.formatMessage(messages.approve)
|
||||
: hasPermission(Permission.REQUEST_ADVANCED)
|
||||
? intl.formatMessage(messages.edit)
|
||||
: intl.formatMessage(messages.cancel)
|
||||
? intl.formatMessage(messages.edit)
|
||||
: intl.formatMessage(messages.cancel)
|
||||
}
|
||||
okButtonType={
|
||||
hasPermission(Permission.MANAGE_REQUESTS)
|
||||
? 'success'
|
||||
: hasPermission(Permission.REQUEST_ADVANCED)
|
||||
? 'primary'
|
||||
: 'danger'
|
||||
? 'primary'
|
||||
: 'danger'
|
||||
}
|
||||
onSecondary={
|
||||
isOwner &&
|
||||
|
||||
@@ -408,8 +408,8 @@ const TvRequestModal = ({
|
||||
? messages.pending4krequest
|
||||
: messages.pendingrequest
|
||||
: is4k
|
||||
? messages.requestseries4ktitle
|
||||
: messages.requestseriestitle
|
||||
? messages.requestseries4ktitle
|
||||
: messages.requestseriestitle
|
||||
)}
|
||||
subTitle={data?.name}
|
||||
okText={
|
||||
@@ -417,33 +417,33 @@ const TvRequestModal = ({
|
||||
? selectedSeasons.length === 0
|
||||
? intl.formatMessage(messages.cancel)
|
||||
: hasPermission(Permission.MANAGE_REQUESTS)
|
||||
? intl.formatMessage(messages.approve)
|
||||
: intl.formatMessage(messages.edit)
|
||||
? intl.formatMessage(messages.approve)
|
||||
: intl.formatMessage(messages.edit)
|
||||
: getAllRequestedSeasons().length >= getAllSeasons().length
|
||||
? intl.formatMessage(messages.alreadyrequested)
|
||||
: !settings.currentSettings.partialRequestsEnabled
|
||||
? intl.formatMessage(
|
||||
is4k ? globalMessages.request4k : globalMessages.request
|
||||
)
|
||||
: selectedSeasons.length === 0
|
||||
? intl.formatMessage(messages.selectseason)
|
||||
: intl.formatMessage(
|
||||
is4k ? messages.requestseasons4k : messages.requestseasons,
|
||||
{
|
||||
seasonCount: selectedSeasons.length,
|
||||
}
|
||||
)
|
||||
? intl.formatMessage(messages.alreadyrequested)
|
||||
: !settings.currentSettings.partialRequestsEnabled
|
||||
? intl.formatMessage(
|
||||
is4k ? globalMessages.request4k : globalMessages.request
|
||||
)
|
||||
: selectedSeasons.length === 0
|
||||
? intl.formatMessage(messages.selectseason)
|
||||
: intl.formatMessage(
|
||||
is4k ? messages.requestseasons4k : messages.requestseasons,
|
||||
{
|
||||
seasonCount: selectedSeasons.length,
|
||||
}
|
||||
)
|
||||
}
|
||||
okDisabled={
|
||||
editRequest
|
||||
? false
|
||||
: !settings.currentSettings.partialRequestsEnabled &&
|
||||
quota?.tv.limit &&
|
||||
unrequestedSeasons.length > quota.tv.limit
|
||||
? true
|
||||
: getAllRequestedSeasons().length >= getAllSeasons().length ||
|
||||
(settings.currentSettings.partialRequestsEnabled &&
|
||||
selectedSeasons.length === 0)
|
||||
quota?.tv.limit &&
|
||||
unrequestedSeasons.length > quota.tv.limit
|
||||
? true
|
||||
: getAllRequestedSeasons().length >= getAllSeasons().length ||
|
||||
(settings.currentSettings.partialRequestsEnabled &&
|
||||
selectedSeasons.length === 0)
|
||||
}
|
||||
okButtonType={
|
||||
editRequest
|
||||
@@ -451,16 +451,16 @@ const TvRequestModal = ({
|
||||
selectedSeasons.length === 0
|
||||
? 'danger'
|
||||
: hasPermission(Permission.MANAGE_REQUESTS)
|
||||
? 'success'
|
||||
: 'primary'
|
||||
? 'success'
|
||||
: 'primary'
|
||||
: 'primary'
|
||||
}
|
||||
cancelText={
|
||||
editRequest
|
||||
? intl.formatMessage(globalMessages.close)
|
||||
: tvdbId
|
||||
? intl.formatMessage(globalMessages.back)
|
||||
: intl.formatMessage(globalMessages.cancel)
|
||||
? intl.formatMessage(globalMessages.back)
|
||||
: intl.formatMessage(globalMessages.cancel)
|
||||
}
|
||||
backdrop={`https://image.tmdb.org/t/p/w1920_and_h800_multi_faces/${data?.backdropPath}`}
|
||||
>
|
||||
|
||||
@@ -52,7 +52,7 @@ const ResetPassword = () => {
|
||||
'/images/rotate6.jpg',
|
||||
]}
|
||||
/>
|
||||
<div className="absolute top-4 right-4 z-50">
|
||||
<div className="absolute right-4 top-4 z-50">
|
||||
<LanguagePicker />
|
||||
</div>
|
||||
<div className="relative z-40 mt-10 flex flex-col items-center px-4 sm:mx-auto sm:w-full sm:max-w-md">
|
||||
@@ -112,7 +112,7 @@ const ResetPassword = () => {
|
||||
>
|
||||
{intl.formatMessage(messages.email)}
|
||||
</label>
|
||||
<div className="mt-1 mb-2 sm:col-span-2 sm:mt-0">
|
||||
<div className="mb-2 mt-1 sm:col-span-2 sm:mt-0">
|
||||
<div className="form-input-field">
|
||||
<Field
|
||||
id="email"
|
||||
|
||||
@@ -62,7 +62,7 @@ const ResetPassword = () => {
|
||||
'/images/rotate6.jpg',
|
||||
]}
|
||||
/>
|
||||
<div className="absolute top-4 right-4 z-50">
|
||||
<div className="absolute right-4 top-4 z-50">
|
||||
<LanguagePicker />
|
||||
</div>
|
||||
<div className="relative z-40 mt-10 flex flex-col items-center px-4 sm:mx-auto sm:w-full sm:max-w-md">
|
||||
@@ -122,7 +122,7 @@ const ResetPassword = () => {
|
||||
>
|
||||
{intl.formatMessage(messages.password)}
|
||||
</label>
|
||||
<div className="mt-1 mb-2 sm:col-span-2 sm:mt-0">
|
||||
<div className="mb-2 mt-1 sm:col-span-2 sm:mt-0">
|
||||
<div className="form-input-field">
|
||||
<SensitiveInput
|
||||
as="field"
|
||||
@@ -145,7 +145,7 @@ const ResetPassword = () => {
|
||||
>
|
||||
{intl.formatMessage(messages.confirmpassword)}
|
||||
</label>
|
||||
<div className="mt-1 mb-2 sm:col-span-2 sm:mt-0">
|
||||
<div className="mb-2 mt-1 sm:col-span-2 sm:mt-0">
|
||||
<div className="form-input-field">
|
||||
<SensitiveInput
|
||||
as="field"
|
||||
|
||||
@@ -44,7 +44,7 @@ const Search = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={intl.formatMessage(messages.search)} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header>{intl.formatMessage(messages.searchresults)}</Header>
|
||||
</div>
|
||||
<ListView
|
||||
|
||||
@@ -388,8 +388,8 @@ export const WatchProviderSelector = ({
|
||||
region
|
||||
? region
|
||||
: currentSettings.discoverRegion
|
||||
? currentSettings.discoverRegion
|
||||
: 'US'
|
||||
? currentSettings.discoverRegion
|
||||
: 'US'
|
||||
);
|
||||
const [activeProvider, setActiveProvider] = useState<number[]>(
|
||||
activeProviders ?? []
|
||||
@@ -476,7 +476,7 @@ export const WatchProviderSelector = ({
|
||||
/>
|
||||
</div>
|
||||
{isActive && (
|
||||
<div className="pointer-events-none absolute -top-1 -left-1 flex items-center justify-center text-indigo-100 opacity-90">
|
||||
<div className="pointer-events-none absolute -left-1 -top-1 flex items-center justify-center text-indigo-100 opacity-90">
|
||||
<CheckCircleIcon className="h-6 w-6" />
|
||||
</div>
|
||||
)}
|
||||
@@ -519,7 +519,7 @@ export const WatchProviderSelector = ({
|
||||
/>
|
||||
</div>
|
||||
{isActive && (
|
||||
<div className="pointer-events-none absolute -top-1 -left-1 flex items-center justify-center text-indigo-100 opacity-90">
|
||||
<div className="pointer-events-none absolute -left-1 -top-1 flex items-center justify-center text-indigo-100 opacity-90">
|
||||
<CheckCircleIcon className="h-6 w-6" />
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -9,7 +9,7 @@ interface LibraryItemProps {
|
||||
const LibraryItem = ({ isEnabled, name, onToggle }: LibraryItemProps) => {
|
||||
return (
|
||||
<li className="col-span-1 flex rounded-md shadow-sm">
|
||||
<div className="flex flex-1 items-center justify-between truncate rounded-md border-t border-b border-r border-gray-700 bg-gray-600">
|
||||
<div className="flex flex-1 items-center justify-between truncate rounded-md border-b border-r border-t border-gray-700 bg-gray-600">
|
||||
<div className="flex-1 cursor-default truncate px-4 py-6 text-sm leading-5">
|
||||
{name}
|
||||
</div>
|
||||
|
||||
@@ -136,10 +136,10 @@ const NotificationsEmail = () => {
|
||||
encryption: data.options.secure
|
||||
? 'implicit'
|
||||
: data.options.requireTls
|
||||
? 'opportunistic'
|
||||
: data.options.ignoreTls
|
||||
? 'none'
|
||||
: 'default',
|
||||
? 'opportunistic'
|
||||
: data.options.ignoreTls
|
||||
? 'none'
|
||||
: 'default',
|
||||
authUser: data.options.authUser,
|
||||
authPass: data.options.authPass,
|
||||
allowSelfSigned: data.options.allowSelfSigned,
|
||||
|
||||
@@ -256,7 +256,7 @@ const NotificationsNtfy = () => {
|
||||
</div>
|
||||
</div>
|
||||
{values.authMethodUsernamePassword && (
|
||||
<div className="mr-2 ml-4">
|
||||
<div className="ml-4 mr-2">
|
||||
<div className="form-row">
|
||||
<label htmlFor="username" className="text-label">
|
||||
{intl.formatMessage(messages.username)}
|
||||
@@ -302,7 +302,7 @@ const NotificationsNtfy = () => {
|
||||
</div>
|
||||
</div>
|
||||
{values.authMethodToken && (
|
||||
<div className="form-row mr-2 ml-4">
|
||||
<div className="form-row ml-4 mr-2">
|
||||
<label htmlFor="token" className="text-label">
|
||||
{intl.formatMessage(messages.token)}
|
||||
</label>
|
||||
|
||||
@@ -210,8 +210,8 @@ const OverrideRuleModal = ({
|
||||
isSubmitting
|
||||
? intl.formatMessage(globalMessages.saving)
|
||||
: rule
|
||||
? intl.formatMessage(globalMessages.save)
|
||||
: intl.formatMessage(messages.create)
|
||||
? intl.formatMessage(globalMessages.save)
|
||||
: intl.formatMessage(messages.create)
|
||||
}
|
||||
okDisabled={
|
||||
isSubmitting ||
|
||||
@@ -341,8 +341,8 @@ const OverrideRuleModal = ({
|
||||
values.radarrServiceId != null
|
||||
? 'movie'
|
||||
: values.sonarrServiceId != null
|
||||
? 'tv'
|
||||
: 'tv'
|
||||
? 'tv'
|
||||
: 'tv'
|
||||
}
|
||||
defaultValue={values.genre}
|
||||
isMulti
|
||||
|
||||
@@ -290,8 +290,8 @@ const RadarrModal = ({ onClose, radarr, onSave }: RadarrModalProps) => {
|
||||
isSubmitting
|
||||
? intl.formatMessage(globalMessages.saving)
|
||||
: radarr
|
||||
? intl.formatMessage(globalMessages.save)
|
||||
: intl.formatMessage(messages.add)
|
||||
? intl.formatMessage(globalMessages.save)
|
||||
: intl.formatMessage(messages.add)
|
||||
}
|
||||
secondaryButtonType="warning"
|
||||
secondaryText={
|
||||
@@ -518,10 +518,12 @@ const RadarrModal = ({ onClose, radarr, onSave }: RadarrModalProps) => {
|
||||
{isTesting
|
||||
? intl.formatMessage(messages.loadingprofiles)
|
||||
: !isValidated
|
||||
? intl.formatMessage(
|
||||
messages.testFirstQualityProfiles
|
||||
)
|
||||
: intl.formatMessage(messages.selectQualityProfile)}
|
||||
? intl.formatMessage(
|
||||
messages.testFirstQualityProfiles
|
||||
)
|
||||
: intl.formatMessage(
|
||||
messages.selectQualityProfile
|
||||
)}
|
||||
</option>
|
||||
{testResponse.profiles.length > 0 &&
|
||||
testResponse.profiles.map((profile) => (
|
||||
@@ -558,8 +560,10 @@ const RadarrModal = ({ onClose, radarr, onSave }: RadarrModalProps) => {
|
||||
{isTesting
|
||||
? intl.formatMessage(messages.loadingrootfolders)
|
||||
: !isValidated
|
||||
? intl.formatMessage(messages.testFirstRootFolders)
|
||||
: intl.formatMessage(messages.selectRootFolder)}
|
||||
? intl.formatMessage(
|
||||
messages.testFirstRootFolders
|
||||
)
|
||||
: intl.formatMessage(messages.selectRootFolder)}
|
||||
</option>
|
||||
{testResponse.rootFolders.length > 0 &&
|
||||
testResponse.rootFolders.map((folder) => (
|
||||
@@ -630,8 +634,8 @@ const RadarrModal = ({ onClose, radarr, onSave }: RadarrModalProps) => {
|
||||
!isValidated
|
||||
? intl.formatMessage(messages.testFirstTags)
|
||||
: isTesting
|
||||
? intl.formatMessage(messages.loadingTags)
|
||||
: intl.formatMessage(messages.selecttags)
|
||||
? intl.formatMessage(messages.loadingTags)
|
||||
: intl.formatMessage(messages.selecttags)
|
||||
}
|
||||
className="react-select-container"
|
||||
classNamePrefix="react-select"
|
||||
|
||||
@@ -61,7 +61,7 @@ const Release = ({ currentVersion, release, isLatest }: ReleaseProps) => {
|
||||
const [isModalOpen, setModalOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<div className="flex w-full flex-col space-y-3 rounded-md bg-gray-800 px-4 py-2 shadow-md ring-1 ring-gray-700 sm:flex-row sm:space-y-0 sm:space-x-3">
|
||||
<div className="flex w-full flex-col space-y-3 rounded-md bg-gray-800 px-4 py-2 shadow-md ring-1 ring-gray-700 sm:flex-row sm:space-x-3 sm:space-y-0">
|
||||
<Transition
|
||||
as={Fragment}
|
||||
enter="transition-opacity duration-300"
|
||||
|
||||
@@ -69,7 +69,7 @@ const SettingsAbout = () => {
|
||||
<p className="text-sm leading-5 text-gray-100">
|
||||
{intl.formatMessage(messages.betawarning)}
|
||||
</p>
|
||||
<p className="mt-3 text-sm leading-5 md:mt-0 md:ml-6">
|
||||
<p className="mt-3 text-sm leading-5 md:ml-6 md:mt-0">
|
||||
<a
|
||||
href="http://github.com/seerr-team/seerr"
|
||||
className="whitespace-nowrap font-medium text-gray-100 transition duration-150 ease-in-out hover:text-white"
|
||||
|
||||
@@ -259,8 +259,8 @@ const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
|
||||
settings.currentSettings.mediaServerType === MediaServerType.JELLYFIN
|
||||
? 'Jellyfin'
|
||||
: settings.currentSettings.mediaServerType === MediaServerType.EMBY
|
||||
? 'Emby'
|
||||
: undefined,
|
||||
? 'Emby'
|
||||
: undefined,
|
||||
};
|
||||
|
||||
return (
|
||||
@@ -308,7 +308,7 @@ const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
<div className="mt-10 mb-6">
|
||||
<div className="mb-6 mt-10">
|
||||
<h3 className="heading">
|
||||
<FormattedMessage {...messages.manualscanJellyfin} />
|
||||
</h3>
|
||||
@@ -424,7 +424,7 @@ const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
|
||||
{intl.formatMessage(messages.scanbackground)}
|
||||
</div>
|
||||
)}
|
||||
<div className="mt-10 mb-6">
|
||||
<div className="mb-6 mt-10">
|
||||
<h3 className="heading">
|
||||
{intl.formatMessage(
|
||||
messages.jellyfinSettings,
|
||||
|
||||
@@ -364,7 +364,7 @@ const SettingsJobs = () => {
|
||||
<label className="text-label">
|
||||
{intl.formatMessage(messages.editJobScheduleCurrent)}
|
||||
</label>
|
||||
<div className="form-input-area mt-2 mb-1">
|
||||
<div className="form-input-area mb-1 mt-2">
|
||||
<div>
|
||||
{jobModalState.job &&
|
||||
cronstrue.toString(jobModalState.job.cronSchedule, {
|
||||
|
||||
@@ -102,8 +102,8 @@ const SettingsLayout = ({ children }: SettingsLayoutProps) => {
|
||||
settings.currentSettings.mediaServerType === MediaServerType.JELLYFIN
|
||||
? 'Jellyfin'
|
||||
: settings.currentSettings.mediaServerType === MediaServerType.EMBY
|
||||
? 'Emby'
|
||||
: undefined,
|
||||
? 'Emby'
|
||||
: undefined,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -193,10 +193,10 @@ const SettingsLogs = () => {
|
||||
activeLog.log?.level === 'error'
|
||||
? 'danger'
|
||||
: activeLog.log?.level === 'warn'
|
||||
? 'warning'
|
||||
: activeLog.log?.level === 'info'
|
||||
? 'success'
|
||||
: 'default'
|
||||
? 'warning'
|
||||
: activeLog.log?.level === 'info'
|
||||
? 'success'
|
||||
: 'default'
|
||||
}
|
||||
>
|
||||
{activeLog.log?.level.toUpperCase()}
|
||||
@@ -344,10 +344,10 @@ const SettingsLogs = () => {
|
||||
row.level === 'error'
|
||||
? 'danger'
|
||||
: row.level === 'warn'
|
||||
? 'warning'
|
||||
: row.level === 'info'
|
||||
? 'success'
|
||||
: 'default'
|
||||
? 'warning'
|
||||
: row.level === 'info'
|
||||
? 'success'
|
||||
: 'default'
|
||||
}
|
||||
>
|
||||
{row.level.toUpperCase()}
|
||||
@@ -426,7 +426,7 @@ const SettingsLogs = () => {
|
||||
intl.formatMessage(globalMessages.showingresults, {
|
||||
from: pageIndex * currentPageSize + 1,
|
||||
to:
|
||||
data?.results.length ?? 0 < currentPageSize
|
||||
(data?.results.length ?? 0 < currentPageSize)
|
||||
? pageIndex * currentPageSize +
|
||||
(data?.results.length ?? 0)
|
||||
: (pageIndex + 1) * currentPageSize,
|
||||
|
||||
@@ -284,7 +284,7 @@ const SettingsNetwork = () => {
|
||||
</div>
|
||||
{values.dnsCacheEnabled && (
|
||||
<>
|
||||
<div className="mr-2 ml-4">
|
||||
<div className="ml-4 mr-2">
|
||||
<div className="form-row">
|
||||
<label
|
||||
htmlFor="dnsCacheForceMinTtl"
|
||||
@@ -357,7 +357,7 @@ const SettingsNetwork = () => {
|
||||
</div>
|
||||
{values.proxyEnabled && (
|
||||
<>
|
||||
<div className="mr-2 ml-4">
|
||||
<div className="ml-4 mr-2">
|
||||
<div className="form-row">
|
||||
<label
|
||||
htmlFor="proxyHostname"
|
||||
|
||||
@@ -480,12 +480,12 @@ const SettingsPlex = ({ onComplete }: SettingsPlexProps) => {
|
||||
? intl.formatMessage(messages.serverLocal)
|
||||
: intl.formatMessage(messages.serverRemote)
|
||||
}]${
|
||||
server.ssl
|
||||
? ` [${intl.formatMessage(
|
||||
messages.serverSecure
|
||||
)}]`
|
||||
: ''
|
||||
}
|
||||
server.ssl
|
||||
? ` [${intl.formatMessage(
|
||||
messages.serverSecure
|
||||
)}]`
|
||||
: ''
|
||||
}
|
||||
${server.status ? '' : '(' + server.message + ')'}
|
||||
`}
|
||||
</option>
|
||||
@@ -623,7 +623,7 @@ const SettingsPlex = ({ onComplete }: SettingsPlexProps) => {
|
||||
);
|
||||
}}
|
||||
</Formik>
|
||||
<div className="mt-10 mb-6">
|
||||
<div className="mb-6 mt-10">
|
||||
<h3 className="heading">
|
||||
{intl.formatMessage(messages.plexlibraries)}
|
||||
</h3>
|
||||
@@ -657,7 +657,7 @@ const SettingsPlex = ({ onComplete }: SettingsPlexProps) => {
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
<div className="mt-10 mb-6">
|
||||
<div className="mb-6 mt-10">
|
||||
<h3 className="heading">{intl.formatMessage(messages.manualscan)}</h3>
|
||||
<p className="description">
|
||||
{intl.formatMessage(messages.manualscanDescription)}
|
||||
@@ -734,7 +734,7 @@ const SettingsPlex = ({ onComplete }: SettingsPlexProps) => {
|
||||
</div>
|
||||
{!onComplete && (
|
||||
<>
|
||||
<div className="mt-10 mb-6">
|
||||
<div className="mb-6 mt-10">
|
||||
<h3 className="heading">
|
||||
{intl.formatMessage(messages.tautulliSettings)}
|
||||
</h3>
|
||||
|
||||
@@ -397,7 +397,7 @@ const SettingsServices = () => {
|
||||
<div className="flex h-full w-full items-center justify-center">
|
||||
<Button
|
||||
buttonType="ghost"
|
||||
className="mt-3 mb-3"
|
||||
className="mb-3 mt-3"
|
||||
onClick={() =>
|
||||
setEditRadarrModal({ open: true, radarr: null })
|
||||
}
|
||||
@@ -411,7 +411,7 @@ const SettingsServices = () => {
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
<div className="mt-10 mb-6">
|
||||
<div className="mb-6 mt-10">
|
||||
<h3 className="heading">
|
||||
{intl.formatMessage(messages.sonarrsettings)}
|
||||
</h3>
|
||||
@@ -499,7 +499,7 @@ const SettingsServices = () => {
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
<div className="mt-10 mb-6">
|
||||
<div className="mb-6 mt-10">
|
||||
<h3 className="heading">
|
||||
{intl.formatMessage(messages.overrideRules)}
|
||||
</h3>
|
||||
|
||||
@@ -81,10 +81,10 @@ const SettingsUsers = () => {
|
||||
settings.currentSettings.mediaServerType === MediaServerType.JELLYFIN
|
||||
? 'Jellyfin'
|
||||
: settings.currentSettings.mediaServerType === MediaServerType.EMBY
|
||||
? 'Emby'
|
||||
: settings.currentSettings.mediaServerType === MediaServerType.PLEX
|
||||
? 'Plex'
|
||||
: undefined,
|
||||
? 'Emby'
|
||||
: settings.currentSettings.mediaServerType === MediaServerType.PLEX
|
||||
? 'Plex'
|
||||
: undefined,
|
||||
};
|
||||
|
||||
return (
|
||||
|
||||
@@ -323,8 +323,8 @@ const SonarrModal = ({ onClose, sonarr, onSave }: SonarrModalProps) => {
|
||||
isSubmitting
|
||||
? intl.formatMessage(globalMessages.saving)
|
||||
: sonarr
|
||||
? intl.formatMessage(globalMessages.save)
|
||||
: intl.formatMessage(messages.add)
|
||||
? intl.formatMessage(globalMessages.save)
|
||||
: intl.formatMessage(messages.add)
|
||||
}
|
||||
secondaryButtonType="warning"
|
||||
secondaryText={
|
||||
@@ -572,10 +572,12 @@ const SonarrModal = ({ onClose, sonarr, onSave }: SonarrModalProps) => {
|
||||
{isTesting
|
||||
? intl.formatMessage(messages.loadingprofiles)
|
||||
: !isValidated
|
||||
? intl.formatMessage(
|
||||
messages.testFirstQualityProfiles
|
||||
)
|
||||
: intl.formatMessage(messages.selectQualityProfile)}
|
||||
? intl.formatMessage(
|
||||
messages.testFirstQualityProfiles
|
||||
)
|
||||
: intl.formatMessage(
|
||||
messages.selectQualityProfile
|
||||
)}
|
||||
</option>
|
||||
{testResponse.profiles.length > 0 &&
|
||||
testResponse.profiles.map((profile) => (
|
||||
@@ -612,8 +614,10 @@ const SonarrModal = ({ onClose, sonarr, onSave }: SonarrModalProps) => {
|
||||
{isTesting
|
||||
? intl.formatMessage(messages.loadingrootfolders)
|
||||
: !isValidated
|
||||
? intl.formatMessage(messages.testFirstRootFolders)
|
||||
: intl.formatMessage(messages.selectRootFolder)}
|
||||
? intl.formatMessage(
|
||||
messages.testFirstRootFolders
|
||||
)
|
||||
: intl.formatMessage(messages.selectRootFolder)}
|
||||
</option>
|
||||
{testResponse.rootFolders.length > 0 &&
|
||||
testResponse.rootFolders.map((folder) => (
|
||||
@@ -656,12 +660,12 @@ const SonarrModal = ({ onClose, sonarr, onSave }: SonarrModalProps) => {
|
||||
messages.loadinglanguageprofiles
|
||||
)
|
||||
: !isValidated
|
||||
? intl.formatMessage(
|
||||
messages.testFirstLanguageProfiles
|
||||
)
|
||||
: intl.formatMessage(
|
||||
messages.selectLanguageProfile
|
||||
)}
|
||||
? intl.formatMessage(
|
||||
messages.testFirstLanguageProfiles
|
||||
)
|
||||
: intl.formatMessage(
|
||||
messages.selectLanguageProfile
|
||||
)}
|
||||
</option>
|
||||
{testResponse.languageProfiles.length > 0 &&
|
||||
testResponse.languageProfiles.map((language) => (
|
||||
@@ -703,8 +707,8 @@ const SonarrModal = ({ onClose, sonarr, onSave }: SonarrModalProps) => {
|
||||
!isValidated
|
||||
? intl.formatMessage(messages.testFirstTags)
|
||||
: isTesting
|
||||
? intl.formatMessage(messages.loadingTags)
|
||||
: intl.formatMessage(messages.selecttags)
|
||||
? intl.formatMessage(messages.loadingTags)
|
||||
: intl.formatMessage(messages.selecttags)
|
||||
}
|
||||
isLoading={isTesting}
|
||||
className="react-select-container"
|
||||
@@ -780,10 +784,12 @@ const SonarrModal = ({ onClose, sonarr, onSave }: SonarrModalProps) => {
|
||||
{isTesting
|
||||
? intl.formatMessage(messages.loadingprofiles)
|
||||
: !isValidated
|
||||
? intl.formatMessage(
|
||||
messages.testFirstQualityProfiles
|
||||
)
|
||||
: intl.formatMessage(messages.selectQualityProfile)}
|
||||
? intl.formatMessage(
|
||||
messages.testFirstQualityProfiles
|
||||
)
|
||||
: intl.formatMessage(
|
||||
messages.selectQualityProfile
|
||||
)}
|
||||
</option>
|
||||
{testResponse.profiles.length > 0 &&
|
||||
testResponse.profiles.map((profile) => (
|
||||
@@ -820,8 +826,10 @@ const SonarrModal = ({ onClose, sonarr, onSave }: SonarrModalProps) => {
|
||||
{isTesting
|
||||
? intl.formatMessage(messages.loadingrootfolders)
|
||||
: !isValidated
|
||||
? intl.formatMessage(messages.testFirstRootFolders)
|
||||
: intl.formatMessage(messages.selectRootFolder)}
|
||||
? intl.formatMessage(
|
||||
messages.testFirstRootFolders
|
||||
)
|
||||
: intl.formatMessage(messages.selectRootFolder)}
|
||||
</option>
|
||||
{testResponse.rootFolders.length > 0 &&
|
||||
testResponse.rootFolders.map((folder) => (
|
||||
@@ -862,12 +870,12 @@ const SonarrModal = ({ onClose, sonarr, onSave }: SonarrModalProps) => {
|
||||
messages.loadinglanguageprofiles
|
||||
)
|
||||
: !isValidated
|
||||
? intl.formatMessage(
|
||||
messages.testFirstLanguageProfiles
|
||||
)
|
||||
: intl.formatMessage(
|
||||
messages.selectLanguageProfile
|
||||
)}
|
||||
? intl.formatMessage(
|
||||
messages.testFirstLanguageProfiles
|
||||
)
|
||||
: intl.formatMessage(
|
||||
messages.selectLanguageProfile
|
||||
)}
|
||||
</option>
|
||||
{testResponse.languageProfiles.length > 0 &&
|
||||
testResponse.languageProfiles.map((language) => (
|
||||
@@ -909,8 +917,8 @@ const SonarrModal = ({ onClose, sonarr, onSave }: SonarrModalProps) => {
|
||||
!isValidated
|
||||
? intl.formatMessage(messages.testFirstTags)
|
||||
: isTesting
|
||||
? intl.formatMessage(messages.loadingTags)
|
||||
: intl.formatMessage(messages.selecttags)
|
||||
? intl.formatMessage(messages.loadingTags)
|
||||
: intl.formatMessage(messages.selecttags)
|
||||
}
|
||||
isLoading={isTesting}
|
||||
className="react-select-container"
|
||||
|
||||
@@ -65,8 +65,8 @@ function JellyfinSetup({
|
||||
serverType === MediaServerType.JELLYFIN
|
||||
? ServerType.JELLYFIN
|
||||
: serverType === MediaServerType.EMBY
|
||||
? ServerType.EMBY
|
||||
: 'Media Server',
|
||||
? ServerType.EMBY
|
||||
: 'Media Server',
|
||||
};
|
||||
|
||||
const LoginSchema = Yup.object().shape({
|
||||
@@ -170,7 +170,7 @@ function JellyfinSetup({
|
||||
mediaServerFormatValues
|
||||
)}
|
||||
</label>
|
||||
<div className="mt-1 mb-2 sm:col-span-2 sm:mb-0 sm:mt-0">
|
||||
<div className="mb-2 mt-1 sm:col-span-2 sm:mb-0 sm:mt-0">
|
||||
<div className="flex rounded-md shadow-sm">
|
||||
<span className="inline-flex cursor-default items-center rounded-l-md border border-r-0 border-gray-500 bg-gray-800 px-3 text-gray-100 sm:text-sm">
|
||||
{values.useSsl ? 'https://' : 'http://'}
|
||||
@@ -218,7 +218,7 @@ function JellyfinSetup({
|
||||
<label htmlFor="useSsl" className="text-label mt-2">
|
||||
{intl.formatMessage(messages.enablessl)}
|
||||
</label>
|
||||
<div className="mt-1 mb-2 sm:col-span-2">
|
||||
<div className="mb-2 mt-1 sm:col-span-2">
|
||||
<div className="flex rounded-md shadow-sm">
|
||||
<Field
|
||||
id="useSsl"
|
||||
@@ -234,7 +234,7 @@ function JellyfinSetup({
|
||||
<label htmlFor="urlBase" className="text-label mt-1">
|
||||
{intl.formatMessage(messages.urlBase)}
|
||||
</label>
|
||||
<div className="mt-1 mb-2 sm:col-span-2 sm:mt-0">
|
||||
<div className="mb-2 mt-1 sm:col-span-2 sm:mt-0">
|
||||
<div className="flex rounded-md shadow-sm">
|
||||
<Field
|
||||
type="text"
|
||||
@@ -287,7 +287,7 @@ function JellyfinSetup({
|
||||
<label htmlFor="username" className="text-label">
|
||||
{intl.formatMessage(messages.username)}
|
||||
</label>
|
||||
<div className="mt-1 mb-2 sm:col-span-2 sm:mt-0">
|
||||
<div className="mb-2 mt-1 sm:col-span-2 sm:mt-0">
|
||||
<div className="flex rounded-md shadow-sm">
|
||||
<Field
|
||||
id="username"
|
||||
@@ -308,7 +308,7 @@ function JellyfinSetup({
|
||||
<label htmlFor="password" className="text-label">
|
||||
{intl.formatMessage(messages.password)}
|
||||
</label>
|
||||
<div className="mt-1 mb-2 sm:col-span-2 sm:mt-0">
|
||||
<div className="mb-2 mt-1 sm:col-span-2 sm:mt-0">
|
||||
<div className="flexrounded-md shadow-sm">
|
||||
<Field
|
||||
id="password"
|
||||
|
||||
@@ -19,9 +19,7 @@ const SetupSteps = ({
|
||||
<li className="relative md:flex md:flex-1">
|
||||
<div className="flex items-center space-x-4 px-6 py-4 text-sm font-medium leading-5">
|
||||
<div
|
||||
className={`flex h-10 w-10 flex-shrink-0 items-center justify-center border-2
|
||||
${active ? 'border-indigo-600 ' : 'border-white '}
|
||||
${completed ? 'border-indigo-600 bg-indigo-600 ' : ''} rounded-full`}
|
||||
className={`flex h-10 w-10 flex-shrink-0 items-center justify-center border-2 ${active ? 'border-indigo-600' : 'border-white'} ${completed ? 'border-indigo-600 bg-indigo-600' : ''} rounded-full`}
|
||||
>
|
||||
{completed && <CheckIcon className="h-6 w-6 text-white" />}
|
||||
{!completed && (
|
||||
@@ -40,7 +38,7 @@ const SetupSteps = ({
|
||||
</div>
|
||||
|
||||
{!isLastStep && (
|
||||
<div className="absolute top-0 right-0 hidden h-full w-5 md:block">
|
||||
<div className="absolute right-0 top-0 hidden h-full w-5 md:block">
|
||||
<svg
|
||||
className="h-full w-full text-gray-600"
|
||||
viewBox="0 0 22 80"
|
||||
|
||||
@@ -154,7 +154,7 @@ const Setup = () => {
|
||||
) ?? []
|
||||
}
|
||||
/>
|
||||
<div className="absolute top-4 right-4 z-50">
|
||||
<div className="absolute right-4 top-4 z-50">
|
||||
<LanguagePicker />
|
||||
</div>
|
||||
<div className="relative z-40 px-4 sm:mx-auto sm:w-full sm:max-w-4xl">
|
||||
@@ -204,7 +204,7 @@ const Setup = () => {
|
||||
</div>
|
||||
<div className="grid grid-cols-3">
|
||||
<div className="flex flex-col divide-y divide-gray-600 rounded-l border border-gray-600 py-2">
|
||||
<div className="mb-2 flex flex-1 items-center justify-center py-2 px-2">
|
||||
<div className="mb-2 flex flex-1 items-center justify-center px-2 py-2">
|
||||
<JellyfinLogo className="h-10" />
|
||||
</div>
|
||||
<div className="px-2 pt-2">
|
||||
@@ -220,7 +220,7 @@ const Setup = () => {
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-col divide-y divide-gray-600 border-y border-gray-600 py-2">
|
||||
<div className="mb-2 flex flex-1 items-center justify-center py-2 px-2">
|
||||
<div className="mb-2 flex flex-1 items-center justify-center px-2 py-2">
|
||||
<PlexLogo className="h-8" />
|
||||
</div>
|
||||
<div className="px-2 pt-2">
|
||||
@@ -236,7 +236,7 @@ const Setup = () => {
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-col divide-y divide-gray-600 rounded-r border border-gray-600 py-2">
|
||||
<div className="mb-2 flex flex-1 items-center justify-center py-2 px-2">
|
||||
<div className="mb-2 flex flex-1 items-center justify-center px-2 py-2">
|
||||
<EmbyLogo className="h-9" />
|
||||
</div>
|
||||
<div className="px-2 pt-2">
|
||||
|
||||
@@ -194,7 +194,7 @@ const Slider = ({
|
||||
</div>
|
||||
))}
|
||||
{isEmpty && (
|
||||
<div className="mt-16 mb-16 text-center font-medium text-gray-400">
|
||||
<div className="mb-16 mt-16 text-center font-medium text-gray-400">
|
||||
{emptyMessage
|
||||
? emptyMessage
|
||||
: intl.formatMessage(globalMessages.noresults)}
|
||||
|
||||
@@ -87,8 +87,8 @@ const StatusBadge = ({
|
||||
settings.currentSettings.mediaServerType === MediaServerType.EMBY
|
||||
? 'Emby'
|
||||
: settings.currentSettings.mediaServerType === MediaServerType.PLEX
|
||||
? 'Plex'
|
||||
: 'Jellyfin',
|
||||
? 'Plex'
|
||||
: 'Jellyfin',
|
||||
});
|
||||
} else if (hasPermission(Permission.MANAGE_REQUESTS)) {
|
||||
if (mediaType && tmdbId) {
|
||||
@@ -137,15 +137,13 @@ const StatusBadge = ({
|
||||
|
||||
const badgeDownloadProgress = (
|
||||
<div
|
||||
className={`
|
||||
absolute top-0 left-0 z-10 flex h-full bg-opacity-80 ${
|
||||
className={`absolute left-0 top-0 z-10 flex h-full bg-opacity-80 ${
|
||||
status === MediaStatus.DELETED
|
||||
? 'bg-red-600'
|
||||
: status === MediaStatus.PROCESSING
|
||||
? 'bg-indigo-500'
|
||||
: 'bg-green-500'
|
||||
} transition-all duration-200 ease-in-out
|
||||
`}
|
||||
? 'bg-indigo-500'
|
||||
: 'bg-green-500'
|
||||
} transition-all duration-200 ease-in-out`}
|
||||
style={{
|
||||
width: `${
|
||||
downloadItem ? calculateDownloadProgress(downloadItem[0]) : 0
|
||||
|
||||
@@ -36,7 +36,7 @@ const ErrorCard = ({ id, tmdbId, tvdbId, type, canExpand }: ErrorCardProps) => {
|
||||
data-testid="title-card"
|
||||
>
|
||||
<div
|
||||
className="relative transform-gpu cursor-default overflow-hidden rounded-xl bg-gray-800 bg-cover shadow outline-none ring-1 ring-gray-700 transition duration-300"
|
||||
className="relative transform-gpu cursor-default overflow-hidden rounded-xl bg-gray-800 bg-cover shadow outline-none ring-1 ring-gray-700 transition duration-300"
|
||||
style={{
|
||||
paddingBottom: '150%',
|
||||
}}
|
||||
|
||||
@@ -76,9 +76,8 @@ const TitleCard = ({
|
||||
const [showDetail, setShowDetail] = useState(false);
|
||||
const [showRequestModal, setShowRequestModal] = useState(false);
|
||||
const { addToast } = useToasts();
|
||||
const [toggleWatchlist, setToggleWatchlist] = useState<boolean>(
|
||||
!isAddedToWatchlist
|
||||
);
|
||||
const [toggleWatchlist, setToggleWatchlist] =
|
||||
useState<boolean>(!isAddedToWatchlist);
|
||||
const [showBlacklistModal, setShowBlacklistModal] = useState(false);
|
||||
const cardRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
@@ -282,8 +281,8 @@ const TitleCard = ({
|
||||
mediaType === 'movie'
|
||||
? 'movie'
|
||||
: mediaType === 'collection'
|
||||
? 'collection'
|
||||
: 'tv'
|
||||
? 'collection'
|
||||
: 'tv'
|
||||
}
|
||||
onComplete={requestComplete}
|
||||
onUpdating={requestUpdating}
|
||||
@@ -295,8 +294,8 @@ const TitleCard = ({
|
||||
mediaType === 'movie'
|
||||
? 'movie'
|
||||
: mediaType === 'collection'
|
||||
? 'collection'
|
||||
: 'tv'
|
||||
? 'collection'
|
||||
: 'tv'
|
||||
}
|
||||
show={showBlacklistModal}
|
||||
onCancel={closeBlacklistModal}
|
||||
@@ -352,8 +351,8 @@ const TitleCard = ({
|
||||
{mediaType === 'movie'
|
||||
? intl.formatMessage(globalMessages.movie)
|
||||
: mediaType === 'collection'
|
||||
? intl.formatMessage(globalMessages.collection)
|
||||
: intl.formatMessage(globalMessages.tvshow)}
|
||||
? intl.formatMessage(globalMessages.collection)
|
||||
: intl.formatMessage(globalMessages.tvshow)}
|
||||
</div>
|
||||
</div>
|
||||
{showDetail && currentStatus !== MediaStatus.BLACKLISTED && (
|
||||
@@ -454,8 +453,8 @@ const TitleCard = ({
|
||||
mediaType === 'movie'
|
||||
? `/movie/${id}`
|
||||
: mediaType === 'collection'
|
||||
? `/collection/${id}`
|
||||
: `/tv/${id}`
|
||||
? `/collection/${id}`
|
||||
: `/tv/${id}`
|
||||
}
|
||||
className="absolute inset-0 h-full w-full cursor-pointer overflow-hidden text-left"
|
||||
style={{
|
||||
|
||||
@@ -41,11 +41,11 @@ const Season = ({ seasonNumber, tvId }: SeasonProps) => {
|
||||
.map((episode) => {
|
||||
return (
|
||||
<div
|
||||
className="flex flex-col space-y-4 py-4 xl:flex-row xl:space-y-4 xl:space-x-4"
|
||||
className="flex flex-col space-y-4 py-4 xl:flex-row xl:space-x-4 xl:space-y-4"
|
||||
key={`season-${seasonNumber}-episode-${episode.episodeNumber}`}
|
||||
>
|
||||
<div className="flex-1">
|
||||
<div className="flex flex-col space-y-2 xl:flex-row xl:items-center xl:space-y-0 xl:space-x-2">
|
||||
<div className="flex flex-col space-y-2 xl:flex-row xl:items-center xl:space-x-2 xl:space-y-0">
|
||||
<h3 className="text-lg">
|
||||
{episode.episodeNumber} - {episode.name}
|
||||
</h3>
|
||||
|
||||
@@ -32,7 +32,7 @@ const TvCast = () => {
|
||||
<PageTitle
|
||||
title={[intl.formatMessage(messages.fullseriescast), data.name]}
|
||||
/>
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header
|
||||
subtext={
|
||||
<Link href={`/tv/${data.id}`} className="hover:underline">
|
||||
|
||||
@@ -32,7 +32,7 @@ const TvCrew = () => {
|
||||
<PageTitle
|
||||
title={[intl.formatMessage(messages.fullseriescrew), data.name]}
|
||||
/>
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header
|
||||
subtext={
|
||||
<Link href={`/tv/${data.id}`} className="hover:underline">
|
||||
|
||||
@@ -38,7 +38,7 @@ const TvRecommendations = () => {
|
||||
<PageTitle
|
||||
title={[intl.formatMessage(messages.recommendations), tvData?.name]}
|
||||
/>
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header
|
||||
subtext={
|
||||
<Link href={`/tv/${tvData?.id}`} className="hover:underline">
|
||||
|
||||
@@ -36,7 +36,7 @@ const TvSimilar = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={[intl.formatMessage(messages.similar), tvData?.name]} />
|
||||
<div className="mt-1 mb-5">
|
||||
<div className="mb-5 mt-1">
|
||||
<Header
|
||||
subtext={
|
||||
<Link href={`/tv/${tvData?.id}`} className="hover:underline">
|
||||
|
||||
@@ -227,8 +227,8 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
const discoverRegion = user?.settings?.discoverRegion
|
||||
? user.settings.discoverRegion
|
||||
: settings.currentSettings.discoverRegion
|
||||
? settings.currentSettings.discoverRegion
|
||||
: 'US';
|
||||
? settings.currentSettings.discoverRegion
|
||||
: 'US';
|
||||
const seriesAttributes: React.ReactNode[] = [];
|
||||
|
||||
const contentRating = data.contentRatings.results.find(
|
||||
@@ -320,8 +320,8 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
const streamingRegion = user?.settings?.streamingRegion
|
||||
? user.settings.streamingRegion
|
||||
: settings.currentSettings.streamingRegion
|
||||
? settings.currentSettings.streamingRegion
|
||||
: 'US';
|
||||
? settings.currentSettings.streamingRegion
|
||||
: 'US';
|
||||
const streamingProviders =
|
||||
data?.watchProviders?.find(
|
||||
(provider) => provider.iso_3166_1 === streamingRegion
|
||||
@@ -849,7 +849,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
<Disclosure.Button
|
||||
className={`mt-2 flex w-full items-center justify-between space-x-2 border-gray-700 bg-gray-800 px-4 py-2 text-gray-200 ${
|
||||
open
|
||||
? 'rounded-t-md border-t border-l border-r'
|
||||
? 'rounded-t-md border-l border-r border-t'
|
||||
: 'rounded-md border'
|
||||
}`}
|
||||
>
|
||||
|
||||
@@ -536,13 +536,13 @@ const UserList = () => {
|
||||
mediaServerName: 'Emby',
|
||||
})
|
||||
: settings.currentSettings.mediaServerType ===
|
||||
MediaServerType.PLEX
|
||||
? intl.formatMessage(messages.importfrommediaserver, {
|
||||
mediaServerName: 'Plex',
|
||||
})
|
||||
: intl.formatMessage(messages.importfrommediaserver, {
|
||||
mediaServerName: 'Jellyfin',
|
||||
})}
|
||||
MediaServerType.PLEX
|
||||
? intl.formatMessage(messages.importfrommediaserver, {
|
||||
mediaServerName: 'Plex',
|
||||
})
|
||||
: intl.formatMessage(messages.importfrommediaserver, {
|
||||
mediaServerName: 'Jellyfin',
|
||||
})}
|
||||
</span>
|
||||
</Button>
|
||||
</div>
|
||||
@@ -705,8 +705,8 @@ const UserList = () => {
|
||||
{user.id === 1
|
||||
? intl.formatMessage(messages.owner)
|
||||
: hasPermission(Permission.ADMIN, user.permissions)
|
||||
? intl.formatMessage(messages.admin)
|
||||
: intl.formatMessage(messages.user)}
|
||||
? intl.formatMessage(messages.admin)
|
||||
: intl.formatMessage(messages.user)}
|
||||
</Table.TD>
|
||||
<Table.TD>
|
||||
{intl.formatDate(user.createdAt, {
|
||||
|
||||
@@ -38,7 +38,7 @@ const ProfileHeader = ({ user, isSettingsPage }: ProfileHeaderProps) => {
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="relative z-40 mt-6 mb-12 lg:flex lg:items-end lg:justify-between lg:space-x-5">
|
||||
<div className="relative z-40 mb-12 mt-6 lg:flex lg:items-end lg:justify-between lg:space-x-5">
|
||||
<div className="flex items-end justify-items-end space-x-5">
|
||||
<div className="flex-shrink-0">
|
||||
<div className="relative">
|
||||
@@ -81,7 +81,7 @@ const ProfileHeader = ({ user, isSettingsPage }: ProfileHeaderProps) => {
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="justify-stretch mt-6 flex flex-col-reverse space-y-4 space-y-reverse lg:flex-row lg:justify-end lg:space-y-0 lg:space-x-3 lg:space-x-reverse">
|
||||
<div className="mt-6 flex flex-col-reverse justify-stretch space-y-4 space-y-reverse lg:flex-row lg:justify-end lg:space-x-3 lg:space-y-0 lg:space-x-reverse">
|
||||
{(loggedInUser?.id === user.id ||
|
||||
(user.id !== 1 && hasPermission(Permission.MANAGE_USERS))) &&
|
||||
!isSettingsPage ? (
|
||||
|
||||
@@ -285,8 +285,8 @@ const UserGeneralSettings = () => {
|
||||
{user?.id === 1
|
||||
? intl.formatMessage(messages.owner)
|
||||
: hasPermission(Permission.ADMIN)
|
||||
? intl.formatMessage(messages.admin)
|
||||
: intl.formatMessage(messages.user)}
|
||||
? intl.formatMessage(messages.admin)
|
||||
: intl.formatMessage(messages.user)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -138,7 +138,7 @@ const LinkJellyfinModal: React.FC<LinkJellyfinModalProps> = ({
|
||||
<label htmlFor="username" className="text-label">
|
||||
{intl.formatMessage(messages.username)}
|
||||
</label>
|
||||
<div className="mt-1 mb-2 sm:col-span-2 sm:mt-0">
|
||||
<div className="mb-2 mt-1 sm:col-span-2 sm:mt-0">
|
||||
<div className="flex rounded-md shadow-sm">
|
||||
<Field
|
||||
id="username"
|
||||
@@ -154,7 +154,7 @@ const LinkJellyfinModal: React.FC<LinkJellyfinModalProps> = ({
|
||||
<label htmlFor="password" className="text-label">
|
||||
{intl.formatMessage(messages.password)}
|
||||
</label>
|
||||
<div className="mt-1 mb-2 sm:col-span-2 sm:mt-0">
|
||||
<div className="mb-2 mt-1 sm:col-span-2 sm:mt-0">
|
||||
<div className="flex rounded-md shadow-sm">
|
||||
<Field
|
||||
id="password"
|
||||
|
||||
@@ -71,7 +71,7 @@ const DeviceItem = ({
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="z-10 mt-4 ml-4 flex w-full flex-col justify-center overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
|
||||
<div className="z-10 ml-4 mt-4 flex w-full flex-col justify-center overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
|
||||
<div className="card-field">
|
||||
<span className="card-field-name">
|
||||
{intl.formatMessage(messages.operatingsystem)}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user