Misc History Improvements

This commit is contained in:
Qstick
2020-10-23 01:09:34 -04:00
parent eca9b87571
commit 4b66d99029
32 changed files with 280 additions and 904 deletions

View File

@@ -2,255 +2,43 @@ import PropTypes from 'prop-types';
import React from 'react';
import DescriptionList from 'Components/DescriptionList/DescriptionList';
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
import DescriptionListItemDescription from 'Components/DescriptionList/DescriptionListItemDescription';
import DescriptionListItemTitle from 'Components/DescriptionList/DescriptionListItemTitle';
import Link from 'Components/Link/Link';
import formatDateTime from 'Utilities/Date/formatDateTime';
import formatAge from 'Utilities/Number/formatAge';
import translate from 'Utilities/String/translate';
import styles from './HistoryDetails.css';
function HistoryDetails(props) {
const {
indexer,
eventType,
sourceTitle,
data,
shortDateFormat,
timeFormat
data
} = props;
if (eventType === 'grabbed') {
if (eventType === 'indexerQuery') {
const {
indexer,
releaseGroup,
nzbInfoUrl,
downloadClient,
downloadId,
age,
ageHours,
ageMinutes,
publishedDate
query,
queryResults
} = data;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('Name')}
data={sourceTitle}
title={translate('Query')}
data={query}
/>
{
!!indexer &&
<DescriptionListItem
title={translate('Indexer')}
data={indexer}
data={indexer.name}
/>
}
{
!!releaseGroup &&
!!data &&
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('ReleaseGroup')}
data={releaseGroup}
/>
}
{
!!nzbInfoUrl &&
<span>
<DescriptionListItemTitle>
Info URL
</DescriptionListItemTitle>
<DescriptionListItemDescription>
<Link to={nzbInfoUrl}>{nzbInfoUrl}</Link>
</DescriptionListItemDescription>
</span>
}
{
!!downloadClient &&
<DescriptionListItem
title={translate('DownloadClient')}
data={downloadClient}
/>
}
{
!!downloadId &&
<DescriptionListItem
title={translate('GrabID')}
data={downloadId}
/>
}
{
!!indexer &&
<DescriptionListItem
title={translate('AgeWhenGrabbed')}
data={formatAge(age, ageHours, ageMinutes)}
/>
}
{
!!publishedDate &&
<DescriptionListItem
title={translate('PublishedDate')}
data={formatDateTime(publishedDate, shortDateFormat, timeFormat, { includeSeconds: true })}
/>
}
</DescriptionList>
);
}
if (eventType === 'downloadFailed') {
const {
message
} = data;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('Name')}
data={sourceTitle}
/>
{
!!message &&
<DescriptionListItem
title={translate('Message')}
data={message}
/>
}
</DescriptionList>
);
}
if (eventType === 'downloadFolderImported') {
const {
droppedPath,
importedPath
} = data;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('Name')}
data={sourceTitle}
/>
{
!!droppedPath &&
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('Source')}
data={droppedPath}
/>
}
{
!!importedPath &&
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('ImportedTo')}
data={importedPath}
/>
}
</DescriptionList>
);
}
if (eventType === 'movieFileDeleted') {
const {
reason
} = data;
let reasonMessage = '';
switch (reason) {
case 'Manual':
reasonMessage = 'File was deleted by via UI';
break;
case 'MissingFromDisk':
reasonMessage = 'Prowlarr was unable to find the file on disk so it was removed';
break;
case 'Upgrade':
reasonMessage = 'File was deleted to import an upgrade';
break;
default:
reasonMessage = '';
}
return (
<DescriptionList>
<DescriptionListItem
title={translate('Name')}
data={sourceTitle}
/>
<DescriptionListItem
title={translate('Reason')}
data={reasonMessage}
/>
</DescriptionList>
);
}
if (eventType === 'movieFileRenamed') {
const {
sourcePath,
sourceRelativePath,
path,
relativePath
} = data;
return (
<DescriptionList>
<DescriptionListItem
title={translate('SourcePath')}
data={sourcePath}
/>
<DescriptionListItem
title={translate('SourceRelativePath')}
data={sourceRelativePath}
/>
<DescriptionListItem
title={translate('DestinationPath')}
data={path}
/>
<DescriptionListItem
title={translate('DestinationRelativePath')}
data={relativePath}
/>
</DescriptionList>
);
}
if (eventType === 'downloadIgnored') {
const {
message
} = data;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('Name')}
data={sourceTitle}
/>
{
!!message &&
<DescriptionListItem
title={translate('Message')}
data={message}
title={'Query Results'}
data={queryResults}
/>
}
</DescriptionList>
@@ -262,15 +50,15 @@ function HistoryDetails(props) {
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('Name')}
data={sourceTitle}
data={data.query}
/>
</DescriptionList>
);
}
HistoryDetails.propTypes = {
indexer: PropTypes.object.isRequired,
eventType: PropTypes.string.isRequired,
sourceTitle: PropTypes.string.isRequired,
data: PropTypes.object.isRequired,
shortDateFormat: PropTypes.string.isRequired,
timeFormat: PropTypes.string.isRequired

View File

@@ -14,18 +14,8 @@ import styles from './HistoryDetailsModal.css';
function getHeaderTitle(eventType) {
switch (eventType) {
case 'grabbed':
return 'Grabbed';
case 'downloadFailed':
return 'Download Failed';
case 'downloadFolderImported':
return 'Movie Imported';
case 'movieFileDeleted':
return 'Movie File Deleted';
case 'movieFileRenamed':
return 'Movie File Renamed';
case 'downloadIgnored':
return 'Download Ignored';
case 'indexerQuery':
return 'Indexer Query';
default:
return 'Unknown';
}
@@ -35,7 +25,7 @@ function HistoryDetailsModal(props) {
const {
isOpen,
eventType,
sourceTitle,
indexer,
data,
isMarkingAsFailed,
shortDateFormat,
@@ -57,7 +47,7 @@ function HistoryDetailsModal(props) {
<ModalBody>
<HistoryDetails
eventType={eventType}
sourceTitle={sourceTitle}
indexer={indexer}
data={data}
shortDateFormat={shortDateFormat}
timeFormat={timeFormat}
@@ -91,7 +81,7 @@ function HistoryDetailsModal(props) {
HistoryDetailsModal.propTypes = {
isOpen: PropTypes.bool.isRequired,
eventType: PropTypes.string.isRequired,
sourceTitle: PropTypes.string.isRequired,
indexer: PropTypes.object.isRequired,
data: PropTypes.object.isRequired,
isMarkingAsFailed: PropTypes.bool.isRequired,
shortDateFormat: PropTypes.string.isRequired,

View File

@@ -7,20 +7,8 @@ import styles from './HistoryEventTypeCell.css';
function getIconName(eventType) {
switch (eventType) {
case 'grabbed':
return icons.DOWNLOADING;
case 'movieFolderImported':
return icons.DRIVE;
case 'downloadFolderImported':
return icons.DOWNLOADED;
case 'downloadFailed':
return icons.DOWNLOADING;
case 'movieFileDeleted':
return icons.DELETE;
case 'movieFileRenamed':
return icons.ORGANIZE;
case 'downloadIgnored':
return icons.IGNORE;
case 'indexerQuery':
return icons.SEARCH;
default:
return icons.UNKNOWN;
}
@@ -35,31 +23,19 @@ function getIconKind(eventType) {
}
}
function getTooltip(eventType, data) {
function getTooltip(eventType, data, indexer) {
switch (eventType) {
case 'grabbed':
return `Movie grabbed from ${data.indexer} and sent to ${data.downloadClient}`;
case 'movieFolderImported':
return 'Movie imported from movie folder';
case 'downloadFolderImported':
return 'Movie downloaded successfully and picked up from download client';
case 'downloadFailed':
return 'Movie download failed';
case 'movieFileDeleted':
return 'Movie file deleted';
case 'movieFileRenamed':
return 'Movie file renamed';
case 'downloadIgnored':
return 'Movie Download Ignored';
case 'indexerQuery':
return `Query "${data.query}" sent to ${indexer.name}`;
default:
return 'Unknown event';
}
}
function HistoryEventTypeCell({ eventType, data }) {
function HistoryEventTypeCell({ eventType, data, indexer }) {
const iconName = getIconName(eventType);
const iconKind = getIconKind(eventType);
const tooltip = getTooltip(eventType, data);
const tooltip = getTooltip(eventType, data, indexer);
return (
<TableRowCell
@@ -76,7 +52,8 @@ function HistoryEventTypeCell({ eventType, data }) {
HistoryEventTypeCell.propTypes = {
eventType: PropTypes.string.isRequired,
data: PropTypes.object
data: PropTypes.object,
indexer: PropTypes.object
};
HistoryEventTypeCell.defaultProps = {

View File

@@ -1,4 +1,4 @@
.downloadClient {
.query {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 120px;

View File

@@ -48,9 +48,8 @@ class HistoryRow extends Component {
render() {
const {
movie,
indexer,
eventType,
sourceTitle,
date,
data,
isMarkingAsFailed,
@@ -60,7 +59,7 @@ class HistoryRow extends Component {
onMarkAsFailedPress
} = this.props;
if (!movie) {
if (!indexer) {
return null;
}
@@ -81,6 +80,7 @@ class HistoryRow extends Component {
return (
<HistoryEventTypeCell
key={name}
indexer={indexer}
eventType={eventType}
data={data}
/>
@@ -93,7 +93,40 @@ class HistoryRow extends Component {
key={name}
className={styles.indexer}
>
{movie.name}
{indexer.name}
</TableRowCell>
);
}
if (name === 'successful') {
return (
<TableRowCell
key={name}
className={styles.indexer}
>
{data.successful}
</TableRowCell>
);
}
if (name === 'elapsedTime') {
return (
<TableRowCell
key={name}
className={styles.indexer}
>
{`${data.elapsedTime}ms`}
</TableRowCell>
);
}
if (name === 'query') {
return (
<TableRowCell
key={name}
className={styles.query}
>
{data.query}
</TableRowCell>
);
}
@@ -128,8 +161,8 @@ class HistoryRow extends Component {
<HistoryDetailsModal
isOpen={this.state.isDetailsModalOpen}
eventType={eventType}
sourceTitle={sourceTitle}
data={data}
indexer={indexer}
isMarkingAsFailed={isMarkingAsFailed}
shortDateFormat={shortDateFormat}
timeFormat={timeFormat}
@@ -143,10 +176,9 @@ class HistoryRow extends Component {
}
HistoryRow.propTypes = {
movieId: PropTypes.number,
movie: PropTypes.object.isRequired,
indexerId: PropTypes.number,
indexer: PropTypes.object.isRequired,
eventType: PropTypes.string.isRequired,
sourceTitle: PropTypes.string.isRequired,
date: PropTypes.string.isRequired,
data: PropTypes.object.isRequired,
isMarkingAsFailed: PropTypes.bool,

View File

@@ -11,9 +11,9 @@ function createMapStateToProps() {
return createSelector(
createIndexerSelector(),
createUISettingsSelector(),
(movie, uiSettings) => {
(indexer, uiSettings) => {
return {
movie,
indexer,
shortDateFormat: uiSettings.shortDateFormat,
timeFormat: uiSettings.timeFormat
};