fix(ui): refinements for 'About' page (#2173)
* fix(ui): refinements for 'About' page * fix: remove unneeded GithubLink function * fix: display/link badges appropriately
This commit is contained in:
@@ -128,16 +128,16 @@ const Modal: React.FC<ModalProps> = ({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div className="relative sm:flex sm:items-center">
|
<div className="relative overflow-x-hidden sm:flex sm:items-center">
|
||||||
{iconSvg && <div className="modal-icon">{iconSvg}</div>}
|
{iconSvg && <div className="modal-icon">{iconSvg}</div>}
|
||||||
<div
|
<div
|
||||||
className={`mt-3 text-center sm:mt-0 sm:text-left ${
|
className={`mt-3 text-center sm:mt-0 sm:text-left truncate text-white ${
|
||||||
iconSvg ? 'sm:ml-4' : 'sm:mb-4'
|
iconSvg ? 'sm:ml-4' : 'sm:mb-4'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{title && (
|
{title && (
|
||||||
<span
|
<span
|
||||||
className="text-lg font-bold leading-6 text-white"
|
className="text-lg font-bold leading-6 truncate"
|
||||||
id="modal-headline"
|
id="modal-headline"
|
||||||
>
|
>
|
||||||
{title}
|
{title}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import { defineMessages, FormattedRelativeTime, useIntl } from 'react-intl';
|
|||||||
import ReactMarkdown from 'react-markdown';
|
import ReactMarkdown from 'react-markdown';
|
||||||
import useSWR from 'swr';
|
import useSWR from 'swr';
|
||||||
import globalMessages from '../../../../i18n/globalMessages';
|
import globalMessages from '../../../../i18n/globalMessages';
|
||||||
import Alert from '../../../Common/Alert';
|
|
||||||
import Badge from '../../../Common/Badge';
|
import Badge from '../../../Common/Badge';
|
||||||
import Button from '../../../Common/Button';
|
import Button from '../../../Common/Button';
|
||||||
import LoadingSpinner from '../../../Common/LoadingSpinner';
|
import LoadingSpinner from '../../../Common/LoadingSpinner';
|
||||||
@@ -13,14 +12,12 @@ import Transition from '../../../Transition';
|
|||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
releases: 'Releases',
|
releases: 'Releases',
|
||||||
releasedataMissing: 'Release data unavailable. Is GitHub down?',
|
releasedataMissing: 'Release data is currently unavailable.',
|
||||||
versionChangelog: 'Version Changelog',
|
versionChangelog: '{version} Changelog',
|
||||||
viewongithub: 'View on GitHub',
|
viewongithub: 'View on GitHub',
|
||||||
latestversion: 'Latest',
|
latestversion: 'Latest',
|
||||||
currentversion: 'Current Version',
|
currentversion: 'Current',
|
||||||
viewchangelog: 'View Changelog',
|
viewchangelog: 'View Changelog',
|
||||||
runningDevelopMessage:
|
|
||||||
'The latest changes to the <code>develop</code> branch of Overseerr are not shown below. Please see the commit history for this branch on <GithubLink>GitHub</GithubLink> for details.',
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const REPO_RELEASE_API =
|
const REPO_RELEASE_API =
|
||||||
@@ -58,8 +55,9 @@ const Release: React.FC<ReleaseProps> = ({
|
|||||||
}) => {
|
}) => {
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const [isModalOpen, setModalOpen] = useState(false);
|
const [isModalOpen, setModalOpen] = useState(false);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col px-4 py-2 bg-gray-800 rounded-md sm:flex-row">
|
<div className="flex flex-col w-full px-4 py-2 space-y-3 bg-gray-800 rounded-md shadow-md sm:space-y-0 sm:space-x-3 sm:flex-row ring-1 ring-gray-700">
|
||||||
<Transition
|
<Transition
|
||||||
enter="opacity-0 transition duration-300"
|
enter="opacity-0 transition duration-300"
|
||||||
enterFrom="opacity-0"
|
enterFrom="opacity-0"
|
||||||
@@ -72,7 +70,9 @@ const Release: React.FC<ReleaseProps> = ({
|
|||||||
<Modal
|
<Modal
|
||||||
onCancel={() => setModalOpen(false)}
|
onCancel={() => setModalOpen(false)}
|
||||||
iconSvg={<DocumentTextIcon />}
|
iconSvg={<DocumentTextIcon />}
|
||||||
title={intl.formatMessage(messages.versionChangelog)}
|
title={intl.formatMessage(messages.versionChangelog, {
|
||||||
|
version: release.name,
|
||||||
|
})}
|
||||||
cancelText={intl.formatMessage(globalMessages.close)}
|
cancelText={intl.formatMessage(globalMessages.close)}
|
||||||
okText={intl.formatMessage(messages.viewongithub)}
|
okText={intl.formatMessage(messages.viewongithub)}
|
||||||
onOk={() => {
|
onOk={() => {
|
||||||
@@ -84,8 +84,9 @@ const Release: React.FC<ReleaseProps> = ({
|
|||||||
</div>
|
</div>
|
||||||
</Modal>
|
</Modal>
|
||||||
</Transition>
|
</Transition>
|
||||||
<div className="flex items-center justify-center mb-4 sm:mb-0 sm:justify-start">
|
<div className="flex items-center justify-center flex-grow w-full space-x-2 truncate sm:justify-start">
|
||||||
<span className="mt-1 mr-2 text-xs">
|
<span className="text-lg font-bold truncate">
|
||||||
|
<span className="mr-2 text-xs font-normal whitespace-nowrap">
|
||||||
<FormattedRelativeTime
|
<FormattedRelativeTime
|
||||||
value={Math.floor(
|
value={Math.floor(
|
||||||
(new Date(release.created_at).getTime() - Date.now()) / 1000
|
(new Date(release.created_at).getTime() - Date.now()) / 1000
|
||||||
@@ -94,29 +95,24 @@ const Release: React.FC<ReleaseProps> = ({
|
|||||||
numeric="auto"
|
numeric="auto"
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
<span className="text-lg font-bold">{release.name}</span>
|
{release.name}
|
||||||
|
</span>
|
||||||
{isLatest && (
|
{isLatest && (
|
||||||
<span className="ml-2 -mt-1">
|
<Badge badgeType="success">
|
||||||
<Badge badgeType="primary">
|
|
||||||
{intl.formatMessage(messages.latestversion)}
|
{intl.formatMessage(messages.latestversion)}
|
||||||
</Badge>
|
</Badge>
|
||||||
</span>
|
|
||||||
)}
|
)}
|
||||||
{release.name.includes(currentVersion) && (
|
{release.name.includes(currentVersion) && (
|
||||||
<span className="ml-2 -mt-1">
|
<Badge badgeType="primary">
|
||||||
<Badge badgeType="success">
|
|
||||||
{intl.formatMessage(messages.currentversion)}
|
{intl.formatMessage(messages.currentversion)}
|
||||||
</Badge>
|
</Badge>
|
||||||
</span>
|
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-1 text-center sm:text-right">
|
|
||||||
<Button buttonType="primary" onClick={() => setModalOpen(true)}>
|
<Button buttonType="primary" onClick={() => setModalOpen(true)}>
|
||||||
<DocumentTextIcon />
|
<DocumentTextIcon />
|
||||||
<span>{intl.formatMessage(messages.viewchangelog)}</span>
|
<span>{intl.formatMessage(messages.viewchangelog)}</span>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -143,31 +139,10 @@ const Releases: React.FC<ReleasesProps> = ({ currentVersion }) => {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h3 className="heading">{intl.formatMessage(messages.releases)}</h3>
|
<h3 className="heading">{intl.formatMessage(messages.releases)}</h3>
|
||||||
<div className="section">
|
<div className="space-y-3 section">
|
||||||
{currentVersion.startsWith('develop-') && (
|
{data.map((release, index) => {
|
||||||
<Alert
|
|
||||||
title={intl.formatMessage(messages.runningDevelopMessage, {
|
|
||||||
code: function code(msg) {
|
|
||||||
return <code className="bg-opacity-50">{msg}</code>;
|
|
||||||
},
|
|
||||||
GithubLink: function GithubLink(msg) {
|
|
||||||
return (
|
return (
|
||||||
<a
|
<div key={`release-${release.id}`}>
|
||||||
href="https://github.com/sct/overseerr"
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer"
|
|
||||||
className="text-yellow-100 underline transition duration-300 hover:text-white"
|
|
||||||
>
|
|
||||||
{msg}
|
|
||||||
</a>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
})}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{data?.map((release, index) => {
|
|
||||||
return (
|
|
||||||
<div key={`release-${release.id}`} className="mb-2">
|
|
||||||
<Release
|
<Release
|
||||||
release={release}
|
release={release}
|
||||||
currentVersion={currentVersion}
|
currentVersion={currentVersion}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import {
|
|||||||
} from '../../../../server/interfaces/api/settingsInterfaces';
|
} from '../../../../server/interfaces/api/settingsInterfaces';
|
||||||
import globalMessages from '../../../i18n/globalMessages';
|
import globalMessages from '../../../i18n/globalMessages';
|
||||||
import Error from '../../../pages/_error';
|
import Error from '../../../pages/_error';
|
||||||
|
import Alert from '../../Common/Alert';
|
||||||
import Badge from '../../Common/Badge';
|
import Badge from '../../Common/Badge';
|
||||||
import List from '../../Common/List';
|
import List from '../../Common/List';
|
||||||
import LoadingSpinner from '../../Common/LoadingSpinner';
|
import LoadingSpinner from '../../Common/LoadingSpinner';
|
||||||
@@ -16,7 +17,7 @@ import Releases from './Releases';
|
|||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
about: 'About',
|
about: 'About',
|
||||||
overseerrinformation: 'Overseerr Information',
|
overseerrinformation: 'About Overseerr',
|
||||||
version: 'Version',
|
version: 'Version',
|
||||||
totalmedia: 'Total Media',
|
totalmedia: 'Total Media',
|
||||||
totalrequests: 'Total Requests',
|
totalrequests: 'Total Requests',
|
||||||
@@ -31,6 +32,8 @@ const messages = defineMessages({
|
|||||||
uptodate: 'Up to Date',
|
uptodate: 'Up to Date',
|
||||||
betawarning:
|
betawarning:
|
||||||
'This is BETA software. Features may be broken and/or unstable. Please report any issues on GitHub!',
|
'This is BETA software. Features may be broken and/or unstable. Please report any issues on GitHub!',
|
||||||
|
runningDevelop:
|
||||||
|
'You are running the <code>develop</code> branch of Overseerr, which is only recommended for those contributing to development or assisting with bleeding-edge testing.',
|
||||||
});
|
});
|
||||||
|
|
||||||
const SettingsAbout: React.FC = () => {
|
const SettingsAbout: React.FC = () => {
|
||||||
@@ -81,22 +84,58 @@ const SettingsAbout: React.FC = () => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="section">
|
<div className="section">
|
||||||
<List title={intl.formatMessage(messages.overseerrinformation)}>
|
<List title={intl.formatMessage(messages.overseerrinformation)}>
|
||||||
|
{data.version.startsWith('develop-') && (
|
||||||
|
<Alert
|
||||||
|
title={intl.formatMessage(messages.runningDevelop, {
|
||||||
|
code: function code(msg) {
|
||||||
|
return <code className="bg-opacity-50">{msg}</code>;
|
||||||
|
},
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
<List.Item
|
<List.Item
|
||||||
title={intl.formatMessage(messages.version)}
|
title={intl.formatMessage(messages.version)}
|
||||||
className="truncate"
|
className="flex flex-row items-center truncate"
|
||||||
|
>
|
||||||
|
<code className="truncate">
|
||||||
|
{data.version.replace('develop-', '')}
|
||||||
|
</code>
|
||||||
|
{status?.commitTag !== 'local' &&
|
||||||
|
(status?.updateAvailable ? (
|
||||||
|
<a
|
||||||
|
href={
|
||||||
|
data.version.startsWith('develop-')
|
||||||
|
? `https://github.com/sct/overseerr/compare/${status.commitTag}...develop`
|
||||||
|
: 'https://github.com/sct/overseerr/releases'
|
||||||
|
}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
<Badge
|
||||||
|
badgeType="warning"
|
||||||
|
className="ml-2 transition !cursor-pointer hover:bg-yellow-400"
|
||||||
>
|
>
|
||||||
<code>{data.version.replace('develop-', '')}</code>
|
|
||||||
{status?.updateAvailable ? (
|
|
||||||
<Badge badgeType="warning" className="ml-2">
|
|
||||||
{intl.formatMessage(messages.outofdate)}
|
{intl.formatMessage(messages.outofdate)}
|
||||||
</Badge>
|
</Badge>
|
||||||
|
</a>
|
||||||
) : (
|
) : (
|
||||||
status?.commitTag !== 'local' && (
|
<a
|
||||||
<Badge badgeType="success" className="ml-2">
|
href={
|
||||||
|
data.version.startsWith('develop-')
|
||||||
|
? 'https://github.com/sct/overseerr/commits/develop'
|
||||||
|
: 'https://github.com/sct/overseerr/releases'
|
||||||
|
}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
<Badge
|
||||||
|
badgeType="success"
|
||||||
|
className="ml-2 transition !cursor-pointer hover:bg-green-400"
|
||||||
|
>
|
||||||
{intl.formatMessage(messages.uptodate)}
|
{intl.formatMessage(messages.uptodate)}
|
||||||
</Badge>
|
</Badge>
|
||||||
)
|
</a>
|
||||||
)}
|
))}
|
||||||
</List.Item>
|
</List.Item>
|
||||||
<List.Item title={intl.formatMessage(messages.totalmedia)}>
|
<List.Item title={intl.formatMessage(messages.totalmedia)}>
|
||||||
{intl.formatNumber(data.totalMediaItems)}
|
{intl.formatNumber(data.totalMediaItems)}
|
||||||
@@ -118,7 +157,7 @@ const SettingsAbout: React.FC = () => {
|
|||||||
href="https://docs.overseerr.dev"
|
href="https://docs.overseerr.dev"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
className="text-indigo-500 hover:underline"
|
className="text-indigo-500 transition duration-300 hover:underline"
|
||||||
>
|
>
|
||||||
https://docs.overseerr.dev
|
https://docs.overseerr.dev
|
||||||
</a>
|
</a>
|
||||||
@@ -128,7 +167,7 @@ const SettingsAbout: React.FC = () => {
|
|||||||
href="https://github.com/sct/overseerr/discussions"
|
href="https://github.com/sct/overseerr/discussions"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
className="text-indigo-500 hover:underline"
|
className="text-indigo-500 transition duration-300 hover:underline"
|
||||||
>
|
>
|
||||||
https://github.com/sct/overseerr/discussions
|
https://github.com/sct/overseerr/discussions
|
||||||
</a>
|
</a>
|
||||||
@@ -138,7 +177,7 @@ const SettingsAbout: React.FC = () => {
|
|||||||
href="https://discord.gg/overseerr"
|
href="https://discord.gg/overseerr"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
className="text-indigo-500 hover:underline"
|
className="text-indigo-500 transition duration-300 hover:underline"
|
||||||
>
|
>
|
||||||
https://discord.gg/overseerr
|
https://discord.gg/overseerr
|
||||||
</a>
|
</a>
|
||||||
@@ -154,7 +193,7 @@ const SettingsAbout: React.FC = () => {
|
|||||||
href="https://github.com/sponsors/sct"
|
href="https://github.com/sponsors/sct"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
className="text-indigo-500 hover:underline"
|
className="text-indigo-500 transition duration-300 hover:underline"
|
||||||
>
|
>
|
||||||
https://github.com/sponsors/sct
|
https://github.com/sponsors/sct
|
||||||
</a>
|
</a>
|
||||||
@@ -167,7 +206,7 @@ const SettingsAbout: React.FC = () => {
|
|||||||
href="https://patreon.com/overseerr"
|
href="https://patreon.com/overseerr"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer"
|
rel="noreferrer"
|
||||||
className="text-indigo-500 hover:underline"
|
className="text-indigo-500 transition duration-300 hover:underline"
|
||||||
>
|
>
|
||||||
https://patreon.com/overseerr
|
https://patreon.com/overseerr
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -426,12 +426,11 @@
|
|||||||
"components.Settings.RadarrModal.validationPortRequired": "You must provide a valid port number",
|
"components.Settings.RadarrModal.validationPortRequired": "You must provide a valid port number",
|
||||||
"components.Settings.RadarrModal.validationProfileRequired": "You must select a quality profile",
|
"components.Settings.RadarrModal.validationProfileRequired": "You must select a quality profile",
|
||||||
"components.Settings.RadarrModal.validationRootFolderRequired": "You must select a root folder",
|
"components.Settings.RadarrModal.validationRootFolderRequired": "You must select a root folder",
|
||||||
"components.Settings.SettingsAbout.Releases.currentversion": "Current Version",
|
"components.Settings.SettingsAbout.Releases.currentversion": "Current",
|
||||||
"components.Settings.SettingsAbout.Releases.latestversion": "Latest",
|
"components.Settings.SettingsAbout.Releases.latestversion": "Latest",
|
||||||
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Release data unavailable. Is GitHub down?",
|
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Release data is currently unavailable.",
|
||||||
"components.Settings.SettingsAbout.Releases.releases": "Releases",
|
"components.Settings.SettingsAbout.Releases.releases": "Releases",
|
||||||
"components.Settings.SettingsAbout.Releases.runningDevelopMessage": "The latest changes to the <code>develop</code> branch of Overseerr are not shown below. Please see the commit history for this branch on <GithubLink>GitHub</GithubLink> for details.",
|
"components.Settings.SettingsAbout.Releases.versionChangelog": "{version} Changelog",
|
||||||
"components.Settings.SettingsAbout.Releases.versionChangelog": "Version Changelog",
|
|
||||||
"components.Settings.SettingsAbout.Releases.viewchangelog": "View Changelog",
|
"components.Settings.SettingsAbout.Releases.viewchangelog": "View Changelog",
|
||||||
"components.Settings.SettingsAbout.Releases.viewongithub": "View on GitHub",
|
"components.Settings.SettingsAbout.Releases.viewongithub": "View on GitHub",
|
||||||
"components.Settings.SettingsAbout.about": "About",
|
"components.Settings.SettingsAbout.about": "About",
|
||||||
@@ -441,8 +440,9 @@
|
|||||||
"components.Settings.SettingsAbout.githubdiscussions": "GitHub Discussions",
|
"components.Settings.SettingsAbout.githubdiscussions": "GitHub Discussions",
|
||||||
"components.Settings.SettingsAbout.helppaycoffee": "Help Pay for Coffee",
|
"components.Settings.SettingsAbout.helppaycoffee": "Help Pay for Coffee",
|
||||||
"components.Settings.SettingsAbout.outofdate": "Out of Date",
|
"components.Settings.SettingsAbout.outofdate": "Out of Date",
|
||||||
"components.Settings.SettingsAbout.overseerrinformation": "Overseerr Information",
|
"components.Settings.SettingsAbout.overseerrinformation": "About Overseerr",
|
||||||
"components.Settings.SettingsAbout.preferredmethod": "Preferred",
|
"components.Settings.SettingsAbout.preferredmethod": "Preferred",
|
||||||
|
"components.Settings.SettingsAbout.runningDevelop": "You are running the <code>develop</code> branch of Overseerr, which is only recommended for those contributing to development or assisting with bleeding-edge testing.",
|
||||||
"components.Settings.SettingsAbout.supportoverseerr": "Support Overseerr",
|
"components.Settings.SettingsAbout.supportoverseerr": "Support Overseerr",
|
||||||
"components.Settings.SettingsAbout.timezone": "Time Zone",
|
"components.Settings.SettingsAbout.timezone": "Time Zone",
|
||||||
"components.Settings.SettingsAbout.totalmedia": "Total Media",
|
"components.Settings.SettingsAbout.totalmedia": "Total Media",
|
||||||
|
|||||||
@@ -296,6 +296,10 @@ select.short {
|
|||||||
@apply w-min;
|
@apply w-min;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
button > span {
|
||||||
|
@apply whitespace-nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
button.input-action {
|
button.input-action {
|
||||||
@apply relative inline-flex items-center px-3 sm:px-3.5 py-2 -ml-px text-sm font-medium leading-5 text-white transition duration-150 ease-in-out bg-indigo-600 border border-gray-500 hover:bg-indigo-500 active:bg-gray-100 active:text-gray-700 last:rounded-r-md;
|
@apply relative inline-flex items-center px-3 sm:px-3.5 py-2 -ml-px text-sm font-medium leading-5 text-white transition duration-150 ease-in-out bg-indigo-600 border border-gray-500 hover:bg-indigo-500 active:bg-gray-100 active:text-gray-700 last:rounded-r-md;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user