2020-06-09 05:51:23 +00:00
|
|
|
import _ from 'lodash';
|
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import React, { Component } from 'react';
|
|
|
|
import AvailabilitySelectInput from 'Components/Form/AvailabilitySelectInput';
|
2020-07-30 03:51:24 +00:00
|
|
|
import CheckInput from 'Components/Form/CheckInput';
|
2020-06-09 05:51:23 +00:00
|
|
|
import QualityProfileSelectInputConnector from 'Components/Form/QualityProfileSelectInputConnector';
|
|
|
|
import RootFolderSelectInputConnector from 'Components/Form/RootFolderSelectInputConnector';
|
2020-07-28 18:47:25 +00:00
|
|
|
import SelectInput from 'Components/Form/SelectInput';
|
2020-06-09 05:51:23 +00:00
|
|
|
import SpinnerButton from 'Components/Link/SpinnerButton';
|
|
|
|
import PageContentFooter from 'Components/Page/PageContentFooter';
|
2020-07-28 18:47:25 +00:00
|
|
|
import { kinds } from 'Helpers/Props';
|
2020-07-08 14:40:53 +00:00
|
|
|
import translate from 'Utilities/String/translate';
|
2020-07-28 18:47:25 +00:00
|
|
|
import DiscoverMovieFooterLabel from './DiscoverMovieFooterLabel';
|
|
|
|
import ExcludeMovieModal from './Exclusion/ExcludeMovieModal';
|
2020-06-09 05:51:23 +00:00
|
|
|
import styles from './DiscoverMovieFooter.css';
|
|
|
|
|
|
|
|
class DiscoverMovieFooter extends Component {
|
|
|
|
|
|
|
|
//
|
|
|
|
// Lifecycle
|
|
|
|
|
|
|
|
constructor(props, context) {
|
|
|
|
super(props, context);
|
|
|
|
|
|
|
|
const {
|
|
|
|
defaultMonitor,
|
|
|
|
defaultQualityProfileId,
|
|
|
|
defaultMinimumAvailability,
|
2020-07-30 03:51:24 +00:00
|
|
|
defaultRootFolderPath,
|
|
|
|
defaultSearchForMovie
|
2020-06-09 05:51:23 +00:00
|
|
|
} = props;
|
|
|
|
|
|
|
|
this.state = {
|
|
|
|
monitor: defaultMonitor,
|
|
|
|
qualityProfileId: defaultQualityProfileId,
|
|
|
|
minimumAvailability: defaultMinimumAvailability,
|
|
|
|
rootFolderPath: defaultRootFolderPath,
|
2020-07-30 03:51:24 +00:00
|
|
|
searchForMovie: defaultSearchForMovie,
|
2020-06-09 05:51:23 +00:00
|
|
|
isExcludeMovieModalOpen: false,
|
|
|
|
destinationRootFolder: null
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
componentDidUpdate(prevProps) {
|
|
|
|
const {
|
|
|
|
defaultMonitor,
|
|
|
|
defaultQualityProfileId,
|
|
|
|
defaultMinimumAvailability,
|
2020-07-30 03:51:24 +00:00
|
|
|
defaultRootFolderPath,
|
|
|
|
defaultSearchForMovie
|
2020-06-09 05:51:23 +00:00
|
|
|
} = this.props;
|
|
|
|
|
|
|
|
const {
|
|
|
|
monitor,
|
|
|
|
qualityProfileId,
|
|
|
|
minimumAvailability,
|
2020-07-30 03:51:24 +00:00
|
|
|
rootFolderPath,
|
|
|
|
searchForMovie
|
2020-06-09 05:51:23 +00:00
|
|
|
} = this.state;
|
|
|
|
|
|
|
|
const newState = {};
|
|
|
|
|
|
|
|
if (monitor !== defaultMonitor) {
|
|
|
|
newState.monitor = defaultMonitor;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (qualityProfileId !== defaultQualityProfileId) {
|
|
|
|
newState.qualityProfileId = defaultQualityProfileId;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (minimumAvailability !== defaultMinimumAvailability) {
|
|
|
|
newState.minimumAvailability = defaultMinimumAvailability;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rootFolderPath !== defaultRootFolderPath) {
|
|
|
|
newState.rootFolderPath = defaultRootFolderPath;
|
|
|
|
}
|
|
|
|
|
2020-07-30 03:51:24 +00:00
|
|
|
if (searchForMovie !== defaultSearchForMovie) {
|
|
|
|
newState.searchForMovie = defaultSearchForMovie;
|
|
|
|
}
|
|
|
|
|
2020-06-09 05:51:23 +00:00
|
|
|
if (!_.isEmpty(newState)) {
|
|
|
|
this.setState(newState);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Listeners
|
|
|
|
|
|
|
|
onExcludeSelectedPress = () => {
|
|
|
|
this.setState({ isExcludeMovieModalOpen: true });
|
|
|
|
}
|
|
|
|
|
|
|
|
onExcludeMovieModalClose = () => {
|
|
|
|
this.setState({ isExcludeMovieModalOpen: false });
|
|
|
|
}
|
|
|
|
|
|
|
|
onAddMoviesPress = () => {
|
|
|
|
const {
|
|
|
|
monitor,
|
|
|
|
qualityProfileId,
|
|
|
|
minimumAvailability,
|
2020-07-30 03:51:24 +00:00
|
|
|
rootFolderPath,
|
|
|
|
searchForMovie
|
2020-06-09 05:51:23 +00:00
|
|
|
} = this.state;
|
|
|
|
|
|
|
|
const addOptions = {
|
|
|
|
monitor,
|
|
|
|
qualityProfileId,
|
|
|
|
minimumAvailability,
|
2020-07-30 03:51:24 +00:00
|
|
|
rootFolderPath,
|
|
|
|
searchForMovie
|
2020-06-09 05:51:23 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
this.props.onAddMoviesPress({ addOptions });
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Render
|
|
|
|
|
|
|
|
render() {
|
|
|
|
const {
|
|
|
|
selectedIds,
|
|
|
|
selectedCount,
|
|
|
|
isAdding,
|
|
|
|
isExcluding,
|
|
|
|
onInputChange
|
|
|
|
} = this.props;
|
|
|
|
|
|
|
|
const {
|
|
|
|
monitor,
|
|
|
|
qualityProfileId,
|
|
|
|
minimumAvailability,
|
|
|
|
rootFolderPath,
|
2020-07-30 03:51:24 +00:00
|
|
|
searchForMovie,
|
2020-06-09 05:51:23 +00:00
|
|
|
isExcludeMovieModalOpen
|
|
|
|
} = this.state;
|
|
|
|
|
|
|
|
const monitoredOptions = [
|
2020-11-23 03:34:51 +00:00
|
|
|
{ key: true, value: translate('Monitored') },
|
|
|
|
{ key: false, value: translate('Unmonitored') }
|
2020-06-09 05:51:23 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
return (
|
|
|
|
<PageContentFooter>
|
|
|
|
<div className={styles.inputContainer}>
|
|
|
|
<DiscoverMovieFooterLabel
|
2020-08-20 03:32:49 +00:00
|
|
|
label={translate('MonitorMovie')}
|
2020-06-09 05:51:23 +00:00
|
|
|
isSaving={isAdding}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<SelectInput
|
|
|
|
name="monitor"
|
|
|
|
value={monitor}
|
|
|
|
values={monitoredOptions}
|
|
|
|
isDisabled={!selectedCount}
|
|
|
|
onChange={onInputChange}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className={styles.inputContainer}>
|
|
|
|
<DiscoverMovieFooterLabel
|
2020-08-20 03:32:49 +00:00
|
|
|
label={translate('QualityProfile')}
|
2020-06-09 05:51:23 +00:00
|
|
|
isSaving={isAdding}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<QualityProfileSelectInputConnector
|
|
|
|
name="qualityProfileId"
|
|
|
|
value={qualityProfileId}
|
|
|
|
isDisabled={!selectedCount}
|
|
|
|
onChange={onInputChange}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className={styles.inputContainer}>
|
|
|
|
<DiscoverMovieFooterLabel
|
2020-08-20 03:32:49 +00:00
|
|
|
label={translate('MinimumAvailability')}
|
2020-06-09 05:51:23 +00:00
|
|
|
isSaving={isAdding}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<AvailabilitySelectInput
|
|
|
|
name="minimumAvailability"
|
|
|
|
value={minimumAvailability}
|
|
|
|
isDisabled={!selectedCount}
|
|
|
|
onChange={onInputChange}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className={styles.inputContainer}>
|
|
|
|
<DiscoverMovieFooterLabel
|
2020-08-20 03:32:49 +00:00
|
|
|
label={translate('RootFolder')}
|
2020-06-09 05:51:23 +00:00
|
|
|
isSaving={isAdding}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<RootFolderSelectInputConnector
|
|
|
|
name="rootFolderPath"
|
|
|
|
value={rootFolderPath}
|
|
|
|
isDisabled={!selectedCount}
|
|
|
|
selectedValueOptions={{ includeFreeSpace: false }}
|
|
|
|
onChange={onInputChange}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
2020-07-30 03:51:24 +00:00
|
|
|
<div className={styles.inputContainer}>
|
|
|
|
<DiscoverMovieFooterLabel
|
2020-08-20 03:32:49 +00:00
|
|
|
label={translate('SearchOnAdd')}
|
2020-07-30 03:51:24 +00:00
|
|
|
isSaving={isAdding}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<CheckInput
|
|
|
|
name="searchForMovie"
|
|
|
|
isDisabled={!selectedCount}
|
|
|
|
value={searchForMovie}
|
|
|
|
onChange={onInputChange}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
2020-06-09 05:51:23 +00:00
|
|
|
<div className={styles.buttonContainer}>
|
|
|
|
<div className={styles.buttonContainerContent}>
|
|
|
|
<DiscoverMovieFooterLabel
|
2020-09-01 03:41:20 +00:00
|
|
|
label={translate('MoviesSelectedInterp', [selectedCount])}
|
2020-06-09 05:51:23 +00:00
|
|
|
isSaving={false}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<div className={styles.buttons}>
|
|
|
|
<div>
|
|
|
|
<SpinnerButton
|
|
|
|
className={styles.addSelectedButton}
|
|
|
|
kind={kinds.PRIMARY}
|
|
|
|
isSpinning={isAdding}
|
|
|
|
isDisabled={!selectedCount || isAdding}
|
|
|
|
onPress={this.onAddMoviesPress}
|
|
|
|
>
|
2020-07-08 14:40:53 +00:00
|
|
|
{translate('AddMovies')}
|
2020-06-09 05:51:23 +00:00
|
|
|
</SpinnerButton>
|
|
|
|
|
2020-07-30 03:51:24 +00:00
|
|
|
<SpinnerButton
|
|
|
|
className={styles.excludeSelectedButton}
|
|
|
|
kind={kinds.DANGER}
|
|
|
|
isSpinning={isExcluding}
|
|
|
|
isDisabled={!selectedCount || isExcluding}
|
|
|
|
onPress={this.props.onExcludeMoviesPress}
|
|
|
|
>
|
|
|
|
{translate('AddExclusion')}
|
|
|
|
</SpinnerButton>
|
|
|
|
</div>
|
2020-06-09 05:51:23 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<ExcludeMovieModal
|
|
|
|
isOpen={isExcludeMovieModalOpen}
|
|
|
|
movieIds={selectedIds}
|
|
|
|
onModalClose={this.onExcludeMovieModalClose}
|
|
|
|
/>
|
|
|
|
</PageContentFooter>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
DiscoverMovieFooter.propTypes = {
|
|
|
|
selectedIds: PropTypes.arrayOf(PropTypes.number).isRequired,
|
|
|
|
selectedCount: PropTypes.number.isRequired,
|
|
|
|
isAdding: PropTypes.bool.isRequired,
|
|
|
|
isExcluding: PropTypes.bool.isRequired,
|
|
|
|
defaultMonitor: PropTypes.string.isRequired,
|
|
|
|
defaultQualityProfileId: PropTypes.number,
|
|
|
|
defaultMinimumAvailability: PropTypes.string,
|
|
|
|
defaultRootFolderPath: PropTypes.string,
|
2020-07-30 03:51:24 +00:00
|
|
|
defaultSearchForMovie: PropTypes.bool,
|
2020-06-09 05:51:23 +00:00
|
|
|
onInputChange: PropTypes.func.isRequired,
|
|
|
|
onAddMoviesPress: PropTypes.func.isRequired,
|
|
|
|
onExcludeMoviesPress: PropTypes.func.isRequired
|
|
|
|
};
|
|
|
|
|
|
|
|
export default DiscoverMovieFooter;
|