You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Sonarr/frontend/src/Episode/Summary/EpisodeSummary.js

185 lines
4.2 KiB

import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Label from 'Components/Label';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import { kinds, sizes } from 'Helpers/Props';
import QualityProfileNameConnector from 'Settings/Profiles/Quality/QualityProfileNameConnector';
import EpisodeAiringConnector from './EpisodeAiringConnector';
import EpisodeFileRow from './EpisodeFileRow';
import styles from './EpisodeSummary.css';
const columns = [
{
name: 'path',
label: 'Path',
isSortable: false,
isVisible: true
},
{
name: 'size',
label: 'Size',
isSortable: false,
isVisible: true
},
{
name: 'languages',
label: 'Languages',
isSortable: false,
isVisible: true
},
{
name: 'quality',
label: 'Quality',
isSortable: false,
isVisible: true
},
{
name: 'customFormats',
label: 'Formats',
isSortable: false,
isVisible: true
},
{
name: 'actions',
label: '',
isSortable: false,
isVisible: true
}
];
class EpisodeSummary extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
isRemoveEpisodeFileModalOpen: false
};
}
//
// Listeners
onRemoveEpisodeFilePress = () => {
this.setState({ isRemoveEpisodeFileModalOpen: true });
};
onConfirmRemoveEpisodeFile = () => {
this.props.onDeleteEpisodeFile();
this.setState({ isRemoveEpisodeFileModalOpen: false });
};
onRemoveEpisodeFileModalClose = () => {
this.setState({ isRemoveEpisodeFileModalOpen: false });
};
//
// Render
render() {
const {
qualityProfileId,
network,
overview,
airDateUtc,
mediaInfo,
path,
size,
languages,
quality,
customFormats,
qualityCutoffNotMet,
onDeleteEpisodeFile
} = this.props;
const hasOverview = !!overview;
return (
<div>
<div>
<span className={styles.infoTitle}>Airs</span>
<EpisodeAiringConnector
airDateUtc={airDateUtc}
network={network}
/>
</div>
<div>
<span className={styles.infoTitle}>Quality Profile</span>
<Label
kind={kinds.PRIMARY}
size={sizes.MEDIUM}
>
<QualityProfileNameConnector
qualityProfileId={qualityProfileId}
/>
</Label>
</div>
<div className={styles.overview}>
{
hasOverview ?
overview :
'No episode overview.'
}
</div>
{
path ?
<Table columns={columns}>
<TableBody>
<EpisodeFileRow
path={path}
size={size}
languages={languages}
quality={quality}
qualityCutoffNotMet={qualityCutoffNotMet}
customFormats={customFormats}
mediaInfo={mediaInfo}
columns={columns}
onDeleteEpisodeFile={onDeleteEpisodeFile}
/>
</TableBody>
</Table> :
null
}
<ConfirmModal
isOpen={this.state.isRemoveEpisodeFileModalOpen}
kind={kinds.DANGER}
title="Delete Episode File"
message={`Are you sure you want to delete '${path}'?`}
confirmLabel="Delete"
onConfirm={this.onConfirmRemoveEpisodeFile}
onCancel={this.onRemoveEpisodeFileModalClose}
/>
</div>
);
}
}
EpisodeSummary.propTypes = {
episodeFileId: PropTypes.number.isRequired,
qualityProfileId: PropTypes.number.isRequired,
network: PropTypes.string.isRequired,
overview: PropTypes.string,
airDateUtc: PropTypes.string.isRequired,
mediaInfo: PropTypes.object,
path: PropTypes.string,
size: PropTypes.number,
languages: PropTypes.arrayOf(PropTypes.object),
quality: PropTypes.object,
qualityCutoffNotMet: PropTypes.bool,
customFormats: PropTypes.arrayOf(PropTypes.object),
onDeleteEpisodeFile: PropTypes.func.isRequired
};
export default EpisodeSummary;