New: Remember add import list exclusion when removing movie

Closes #7949
Closes #7950
This commit is contained in:
Qstick 2023-04-29 22:09:51 -05:00
parent 7f71caaf7f
commit c61735cde2
5 changed files with 54 additions and 73 deletions

View file

@ -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
}; };

View file

@ -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);

View file

@ -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}
/> />

View file

@ -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}
/> />

View file

@ -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
}; };