mirror of
https://github.com/Radarr/Radarr.git
synced 2025-04-24 22:47:05 -04:00
New: Remember add import list exclusion when removing movie
Closes #7949 Closes #7950
This commit is contained in:
parent
7f71caaf7f
commit
c61735cde2
5 changed files with 54 additions and 73 deletions
|
@ -23,8 +23,7 @@ class DeleteMovieModalContent extends Component {
|
||||||
super(props, context);
|
super(props, context);
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
deleteFiles: false,
|
deleteFiles: false
|
||||||
addImportExclusion: false
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,15 +34,11 @@ class DeleteMovieModalContent extends Component {
|
||||||
this.setState({ deleteFiles: value });
|
this.setState({ deleteFiles: value });
|
||||||
};
|
};
|
||||||
|
|
||||||
onAddImportExclusionChange = ({ value }) => {
|
|
||||||
this.setState({ addImportExclusion: value });
|
|
||||||
};
|
|
||||||
|
|
||||||
onDeleteMovieConfirmed = () => {
|
onDeleteMovieConfirmed = () => {
|
||||||
const deleteFiles = this.state.deleteFiles;
|
const deleteFiles = this.state.deleteFiles;
|
||||||
const addImportExclusion = this.state.addImportExclusion;
|
const addImportExclusion = this.props.deleteOptions.addImportExclusion;
|
||||||
|
|
||||||
this.setState({ deleteFiles: false, addImportExclusion: false });
|
this.setState({ deleteFiles: false });
|
||||||
this.props.onDeletePress(deleteFiles, addImportExclusion);
|
this.props.onDeletePress(deleteFiles, addImportExclusion);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -55,12 +50,14 @@ class DeleteMovieModalContent extends Component {
|
||||||
title,
|
title,
|
||||||
path,
|
path,
|
||||||
hasFile,
|
hasFile,
|
||||||
|
deleteOptions,
|
||||||
sizeOnDisk,
|
sizeOnDisk,
|
||||||
onModalClose
|
onModalClose,
|
||||||
|
onDeleteOptionChange
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
const deleteFiles = this.state.deleteFiles;
|
const deleteFiles = this.state.deleteFiles;
|
||||||
const addImportExclusion = this.state.addImportExclusion;
|
const addImportExclusion = deleteOptions.addImportExclusion;
|
||||||
|
|
||||||
let deleteFilesLabel = hasFile ? translate('DeleteFileLabel', [1]) : translate('DeleteFilesLabel', [0]);
|
let deleteFilesLabel = hasFile ? translate('DeleteFileLabel', [1]) : translate('DeleteFilesLabel', [0]);
|
||||||
let deleteFilesHelpText = translate('DeleteFilesHelpText');
|
let deleteFilesHelpText = translate('DeleteFilesHelpText');
|
||||||
|
@ -99,7 +96,7 @@ class DeleteMovieModalContent extends Component {
|
||||||
value={addImportExclusion}
|
value={addImportExclusion}
|
||||||
helpText={translate('AddImportExclusionHelpText')}
|
helpText={translate('AddImportExclusionHelpText')}
|
||||||
kind={kinds.DANGER}
|
kind={kinds.DANGER}
|
||||||
onChange={this.onAddImportExclusionChange}
|
onChange={onDeleteOptionChange}
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
|
@ -156,6 +153,8 @@ DeleteMovieModalContent.propTypes = {
|
||||||
path: PropTypes.string.isRequired,
|
path: PropTypes.string.isRequired,
|
||||||
hasFile: PropTypes.bool.isRequired,
|
hasFile: PropTypes.bool.isRequired,
|
||||||
sizeOnDisk: PropTypes.number.isRequired,
|
sizeOnDisk: PropTypes.number.isRequired,
|
||||||
|
deleteOptions: PropTypes.object.isRequired,
|
||||||
|
onDeleteOptionChange: PropTypes.func.isRequired,
|
||||||
onDeletePress: PropTypes.func.isRequired,
|
onDeletePress: PropTypes.func.isRequired,
|
||||||
onModalClose: PropTypes.func.isRequired
|
onModalClose: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,64 +1,44 @@
|
||||||
import { push } from 'connected-react-router';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import React, { Component } from 'react';
|
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
import { deleteMovie } from 'Store/Actions/movieActions';
|
import { deleteMovie, setDeleteOption } from 'Store/Actions/movieActions';
|
||||||
import createMovieSelector from 'Store/Selectors/createMovieSelector';
|
import createMovieSelector from 'Store/Selectors/createMovieSelector';
|
||||||
import DeleteMovieModalContent from './DeleteMovieModalContent';
|
import DeleteMovieModalContent from './DeleteMovieModalContent';
|
||||||
|
|
||||||
function createMapStateToProps() {
|
function createMapStateToProps() {
|
||||||
return createSelector(
|
return createSelector(
|
||||||
|
(state) => state.movies.deleteOptions,
|
||||||
createMovieSelector(),
|
createMovieSelector(),
|
||||||
(movie) => {
|
(deleteOptions, movie) => {
|
||||||
return movie;
|
return {
|
||||||
|
...movie,
|
||||||
|
deleteOptions
|
||||||
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapDispatchToProps = {
|
function createMapDispatchToProps(dispatch, props) {
|
||||||
deleteMovie,
|
return {
|
||||||
push
|
onDeleteOptionChange(option) {
|
||||||
};
|
dispatch(
|
||||||
|
setDeleteOption({
|
||||||
|
[option.name]: option.value
|
||||||
|
})
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
class DeleteMovieModalContentConnector extends Component {
|
onDeletePress(deleteFiles, addImportExclusion) {
|
||||||
|
dispatch(
|
||||||
|
deleteMovie({
|
||||||
|
id: props.movieId,
|
||||||
|
deleteFiles,
|
||||||
|
addImportExclusion
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
//
|
props.onModalClose(true);
|
||||||
// Listeners
|
|
||||||
|
|
||||||
onDeletePress = (deleteFiles, addImportExclusion) => {
|
|
||||||
this.props.deleteMovie({
|
|
||||||
id: this.props.movieId,
|
|
||||||
deleteFiles,
|
|
||||||
addImportExclusion
|
|
||||||
});
|
|
||||||
|
|
||||||
this.props.onModalClose(true);
|
|
||||||
|
|
||||||
if (this.props.nextMovieRelativePath) {
|
|
||||||
this.props.push(window.Radarr.urlBase + this.props.nextMovieRelativePath);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
|
||||||
// Render
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<DeleteMovieModalContent
|
|
||||||
{...this.props}
|
|
||||||
onDeletePress={this.onDeletePress}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteMovieModalContentConnector.propTypes = {
|
export default connect(createMapStateToProps, createMapDispatchToProps)(DeleteMovieModalContent);
|
||||||
movieId: PropTypes.number.isRequired,
|
|
||||||
onModalClose: PropTypes.func.isRequired,
|
|
||||||
deleteMovie: PropTypes.func.isRequired,
|
|
||||||
push: PropTypes.func.isRequired,
|
|
||||||
nextMovieRelativePath: PropTypes.string
|
|
||||||
};
|
|
||||||
|
|
||||||
export default connect(createMapStateToProps, mapDispatchToProps)(DeleteMovieModalContentConnector);
|
|
||||||
|
|
|
@ -22,14 +22,14 @@ interface DeleteMovieModalContentProps {
|
||||||
}
|
}
|
||||||
|
|
||||||
const selectDeleteOptions = createSelector(
|
const selectDeleteOptions = createSelector(
|
||||||
(state) => state.movie.deleteOptions,
|
(state) => state.movies.deleteOptions,
|
||||||
(deleteOptions) => deleteOptions
|
(deleteOptions) => deleteOptions
|
||||||
);
|
);
|
||||||
|
|
||||||
function DeleteMovieModalContent(props: DeleteMovieModalContentProps) {
|
function DeleteMovieModalContent(props: DeleteMovieModalContentProps) {
|
||||||
const { movieIds, onModalClose } = props;
|
const { movieIds, onModalClose } = props;
|
||||||
|
|
||||||
const { addImportListExclusion } = useSelector(selectDeleteOptions);
|
const { addImportExclusion } = useSelector(selectDeleteOptions);
|
||||||
const allMovies = useSelector(createAllMoviesSelector());
|
const allMovies = useSelector(createAllMoviesSelector());
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ function DeleteMovieModalContent(props: DeleteMovieModalContentProps) {
|
||||||
bulkDeleteMovie({
|
bulkDeleteMovie({
|
||||||
movieIds,
|
movieIds,
|
||||||
deleteFiles,
|
deleteFiles,
|
||||||
addImportListExclusion,
|
addImportExclusion,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ function DeleteMovieModalContent(props: DeleteMovieModalContentProps) {
|
||||||
}, [
|
}, [
|
||||||
movieIds,
|
movieIds,
|
||||||
deleteFiles,
|
deleteFiles,
|
||||||
addImportListExclusion,
|
addImportExclusion,
|
||||||
setDeleteFiles,
|
setDeleteFiles,
|
||||||
dispatch,
|
dispatch,
|
||||||
onModalClose,
|
onModalClose,
|
||||||
|
@ -93,8 +93,8 @@ function DeleteMovieModalContent(props: DeleteMovieModalContentProps) {
|
||||||
|
|
||||||
<FormInputGroup
|
<FormInputGroup
|
||||||
type={inputTypes.CHECK}
|
type={inputTypes.CHECK}
|
||||||
name="addImportListExclusion"
|
name="addImportExclusion"
|
||||||
value={addImportListExclusion}
|
value={addImportExclusion}
|
||||||
helpText={translate('AddImportExclusionHelpText')}
|
helpText={translate('AddImportExclusionHelpText')}
|
||||||
onChange={onDeleteOptionChange}
|
onChange={onDeleteOptionChange}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -70,6 +70,9 @@ function MovieIndexRow(props: MovieIndexRowProps) {
|
||||||
tags = [],
|
tags = [],
|
||||||
tmdbId,
|
tmdbId,
|
||||||
imdbId,
|
imdbId,
|
||||||
|
isAvailable,
|
||||||
|
grabbed,
|
||||||
|
movieFile,
|
||||||
youTubeTrailerId,
|
youTubeTrailerId,
|
||||||
isSaving = false,
|
isSaving = false,
|
||||||
movieRuntimeFormat,
|
movieRuntimeFormat,
|
||||||
|
@ -310,7 +313,10 @@ function MovieIndexRow(props: MovieIndexRowProps) {
|
||||||
return (
|
return (
|
||||||
<VirtualTableRowCell key={name} className={styles[name]}>
|
<VirtualTableRowCell key={name} className={styles[name]}>
|
||||||
<MovieFileStatusConnector
|
<MovieFileStatusConnector
|
||||||
movieId={movieId}
|
isAvailable={isAvailable}
|
||||||
|
monitored={monitored}
|
||||||
|
grabbed={grabbed}
|
||||||
|
movieFile={movieFile}
|
||||||
queueStatus={queueStatus}
|
queueStatus={queueStatus}
|
||||||
queueState={queueState}
|
queueState={queueState}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -2,21 +2,14 @@ import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
import createMovieSelector from 'Store/Selectors/createMovieSelector';
|
|
||||||
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
|
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
|
||||||
import MovieFileStatus from './MovieFileStatus';
|
import MovieFileStatus from './MovieFileStatus';
|
||||||
|
|
||||||
function createMapStateToProps() {
|
function createMapStateToProps() {
|
||||||
return createSelector(
|
return createSelector(
|
||||||
createMovieSelector(),
|
|
||||||
createUISettingsSelector(),
|
createUISettingsSelector(),
|
||||||
(movie, uiSettings) => {
|
(uiSettings) => {
|
||||||
return {
|
return {
|
||||||
inCinemas: movie.inCinemas,
|
|
||||||
isAvailable: movie.isAvailable,
|
|
||||||
monitored: movie.monitored,
|
|
||||||
grabbed: movie.grabbed,
|
|
||||||
movieFile: movie.movieFile,
|
|
||||||
colorImpairedMode: uiSettings.enableColorImpairedMode
|
colorImpairedMode: uiSettings.enableColorImpairedMode
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -41,7 +34,10 @@ class MovieFileStatusConnector extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
MovieFileStatusConnector.propTypes = {
|
MovieFileStatusConnector.propTypes = {
|
||||||
movieId: PropTypes.number.isRequired,
|
isAvailable: PropTypes.bool,
|
||||||
|
monitored: PropTypes.bool,
|
||||||
|
grabbed: PropTypes.bool,
|
||||||
|
movieFile: PropTypes.object,
|
||||||
queueStatus: PropTypes.string,
|
queueStatus: PropTypes.string,
|
||||||
queueState: PropTypes.string
|
queueState: PropTypes.string
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue