Skip to content

Commit

Permalink
Fixed: Manual Import Reprocessing
Browse files Browse the repository at this point in the history
  • Loading branch information
Qstick committed Jan 24, 2023
1 parent bc63587 commit 3825ecd
Show file tree
Hide file tree
Showing 20 changed files with 422 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class SelectAuthorModalContentConnector extends Component {
});
});

this.props.saveInteractiveImportItem({ id: ids });
this.props.saveInteractiveImportItem({ ids });

this.props.onModalClose(true);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class SelectBookModalContentConnector extends Component {
});
});

this.props.saveInteractiveImportItem({ id: ids });
this.props.saveInteractiveImportItem({ ids });

this.props.onModalClose(true);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class SelectEditionModalContentConnector extends Component {
});
});

this.props.saveInteractiveImportItem({ id: ids });
this.props.saveInteractiveImportItem({ ids });

this.props.onModalClose(true);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ import SelectBookModal from 'InteractiveImport/Book/SelectBookModal';
import ConfirmImportModal from 'InteractiveImport/Confirmation/ConfirmImportModal';
import SelectEditionModal from 'InteractiveImport/Edition/SelectEditionModal';
import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal';
import SelectReleaseGroupModal from 'InteractiveImport/ReleaseGroup/SelectReleaseGroupModal';
import getErrorMessage from 'Utilities/Object/getErrorMessage';
import translate from 'Utilities/String/translate';
import getSelectedIds from 'Utilities/Table/getSelectedIds';
import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected';
Expand All @@ -46,6 +48,11 @@ const columns = [
label: 'Book',
isVisible: true
},
{
name: 'releaseGroup',
label: 'Release Group',
isVisible: true
},
{
name: 'quality',
label: 'Quality',
Expand Down Expand Up @@ -75,14 +82,16 @@ const filterExistingFilesOptions = {
};

const importModeOptions = [
{ key: 'move', value: 'Move Files' },
{ key: 'copy', value: 'Hardlink/Copy Files' }
{ key: 'chooseImportMode', value: translate('ChooseImportMethod'), disabled: true },
{ key: 'move', value: translate('MoveFiles') },
{ key: 'copy', value: translate('HardlinkCopyFiles') }
];

const SELECT = 'select';
const AUTHOR = 'author';
const BOOK = 'book';
const EDITION = 'edition';
const RELEASE_GROUP = 'releaseGroup';
const QUALITY = 'quality';

const replaceExistingFilesOptions = {
Expand Down Expand Up @@ -280,7 +289,8 @@ class InteractiveImportModalContent extends Component {
{ key: SELECT, value: 'Select...', disabled: true },
{ key: BOOK, value: 'Select Book' },
{ key: EDITION, value: 'Select Edition' },
{ key: QUALITY, value: 'Select Quality' }
{ key: QUALITY, value: 'Select Quality' },
{ key: RELEASE_GROUP, value: 'Select ReleaseGroup' }
];

if (allowAuthorChange) {
Expand Down Expand Up @@ -483,6 +493,13 @@ class InteractiveImportModalContent extends Component {
onModalClose={this.onSelectModalClose}
/>

<SelectReleaseGroupModal
isOpen={selectModalOpen === RELEASE_GROUP}
ids={selectedIds}
releaseGroup=""
onModalClose={this.onSelectModalClose}
/>

<SelectQualityModal
isOpen={selectModalOpen === QUALITY}
ids={selectedIds}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ class InteractiveImportModalContentConnector extends Component {
onImportSelectedPress = (selected, importMode) => {
const files = [];

if (importMode === 'chooseImportMethod') {
this.setState({ interactiveImportErrorMessage: 'An import mode must be selected' });
return;
}

_.forEach(this.props.items, (item) => {
const isSelected = selected.indexOf(item.id) > -1;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@
cursor: pointer;
}

.loading {
.reprocessing {
composes: loading from '~Components/Loading/LoadingIndicator.css';

margin-top: 0;
text-align: start;
}

.additionalFile {
Expand Down
52 changes: 39 additions & 13 deletions frontend/src/InteractiveImport/Interactive/InteractiveImportRow.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import React, { Component } from 'react';
import BookQuality from 'Book/BookQuality';
import FileDetails from 'BookFile/FileDetails';
import Icon from 'Components/Icon';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRowCellButton from 'Components/Table/Cells/TableRowCellButton';
Expand All @@ -15,6 +14,7 @@ import { icons, kinds, sizes, tooltipPositions } from 'Helpers/Props';
import SelectAuthorModal from 'InteractiveImport/Author/SelectAuthorModal';
import SelectBookModal from 'InteractiveImport/Book/SelectBookModal';
import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal';
import SelectReleaseGroupModal from 'InteractiveImport/ReleaseGroup/SelectReleaseGroupModal';
import formatBytes from 'Utilities/Number/formatBytes';
import translate from 'Utilities/String/translate';
import InteractiveImportRowCellPlaceholder from './InteractiveImportRowCellPlaceholder';
Expand All @@ -32,6 +32,7 @@ class InteractiveImportRow extends Component {
isDetailsModalOpen: false,
isSelectAuthorModalOpen: false,
isSelectBookModalOpen: false,
isSelectReleaseGroupModalOpen: false,
isSelectQualityModalOpen: false
};
}
Expand Down Expand Up @@ -123,6 +124,10 @@ class InteractiveImportRow extends Component {
this.setState({ isSelectBookModalOpen: true });
};

onSelectReleaseGroupPress = () => {
this.setState({ isSelectReleaseGroupModalOpen: true });
};

onSelectQualityPress = () => {
this.setState({ isSelectQualityModalOpen: true });
};
Expand All @@ -137,6 +142,11 @@ class InteractiveImportRow extends Component {
this.selectRowAfterChange(changed);
};

onSelectReleaseGroupModalClose = (changed) => {
this.setState({ isSelectReleaseGroupModalOpen: false });
this.selectRowAfterChange(changed);
};

onSelectQualityModalClose = (changed) => {
this.setState({ isSelectQualityModalOpen: false });
this.selectRowAfterChange(changed);
Expand All @@ -153,19 +163,21 @@ class InteractiveImportRow extends Component {
author,
book,
quality,
releaseGroup,
size,
rejections,
additionalFile,
isSelected,
isReprocessing,
onSelectedChange,
audioTags,
isSaving
audioTags
} = this.props;

const {
isDetailsModalOpen,
isSelectAuthorModalOpen,
isSelectBookModalOpen,
isSelectReleaseGroupModalOpen,
isSelectQualityModalOpen
} = this.state;

Expand All @@ -176,7 +188,8 @@ class InteractiveImportRow extends Component {
}

const showAuthorPlaceholder = isSelected && !author;
const showBookNumberPlaceholder = isSelected && !!author && !book;
const showBookNumberPlaceholder = !isReprocessing && isSelected && !!author && !book;
const showReleaseGroupPlaceholder = isSelected && !releaseGroup;
const showQualityPlaceholder = isSelected && !quality;

const pathCellContents = (
Expand Down Expand Up @@ -237,6 +250,17 @@ class InteractiveImportRow extends Component {
}
</TableRowCellButton>

<TableRowCellButton
title={translate('ClickToChangeReleaseGroup')}
onPress={this.onSelectReleaseGroupPress}
>
{
showReleaseGroupPlaceholder ?
<InteractiveImportRowCellPlaceholder /> :
releaseGroup
}
</TableRowCellButton>

<TableRowCellButton
className={styles.quality}
title={translate('ClickToChangeQuality')}
Expand All @@ -262,14 +286,7 @@ class InteractiveImportRow extends Component {

<TableRowCell>
{
isSaving &&
<LoadingIndicator
className={styles.loading}
size={20}
/>
}
{
!isSaving && rejections && rejections.length ?
rejections && rejections.length ?
<Popover
anchor={
<Icon
Expand All @@ -292,6 +309,7 @@ class InteractiveImportRow extends Component {
</ul>
}
position={tooltipPositions.LEFT}
canFlip={false}
/> :
null
}
Expand Down Expand Up @@ -322,6 +340,13 @@ class InteractiveImportRow extends Component {
onModalClose={this.onSelectBookModalClose}
/>

<SelectReleaseGroupModal
isOpen={isSelectReleaseGroupModalOpen}
ids={[id]}
releaseGroup={releaseGroup ?? ''}
onModalClose={this.onSelectReleaseGroupModalClose}
/>

<SelectQualityModal
isOpen={isSelectQualityModalOpen}
ids={[id]}
Expand All @@ -343,13 +368,14 @@ InteractiveImportRow.propTypes = {
author: PropTypes.object,
book: PropTypes.object,
foreignEditionId: PropTypes.string,
releaseGroup: PropTypes.string,
quality: PropTypes.object,
size: PropTypes.number.isRequired,
rejections: PropTypes.arrayOf(PropTypes.object).isRequired,
audioTags: PropTypes.object.isRequired,
additionalFile: PropTypes.bool.isRequired,
isReprocessing: PropTypes.bool,
isSelected: PropTypes.bool,
isSaving: PropTypes.bool.isRequired,
onSelectedChange: PropTypes.func.isRequired,
onValidRowChange: PropTypes.func.isRequired
};
Expand Down
7 changes: 7 additions & 0 deletions frontend/src/InteractiveImport/InteractiveImportModal.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Modal from 'Components/Modal/Modal';
import { sizes } from 'Helpers/Props';
import InteractiveImportSelectFolderModalContentConnector from './Folder/InteractiveImportSelectFolderModalContentConnector';
import InteractiveImportModalContentConnector from './Interactive/InteractiveImportModalContentConnector';

Expand Down Expand Up @@ -47,6 +48,7 @@ class InteractiveImportModal extends Component {
return (
<Modal
isOpen={isOpen}
size={sizes.EXTRA_LARGE}
closeOnBackgroundClick={false}
onModalClose={onModalClose}
>
Expand All @@ -73,7 +75,12 @@ InteractiveImportModal.propTypes = {
isOpen: PropTypes.bool.isRequired,
folder: PropTypes.string,
downloadId: PropTypes.string,
modalTitle: PropTypes.string.isRequired,
onModalClose: PropTypes.func.isRequired
};

InteractiveImportModal.defaultProps = {
modalTitle: 'Manual Import'
};

export default InteractiveImportModal;
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { updateInteractiveImportItems } from 'Store/Actions/interactiveImportActions';
import { saveInteractiveImportItem, updateInteractiveImportItems } from 'Store/Actions/interactiveImportActions';
import { fetchQualityProfileSchema } from 'Store/Actions/settingsActions';
import getQualities from 'Utilities/Quality/getQualities';
import SelectQualityModalContent from './SelectQualityModalContent';
Expand Down Expand Up @@ -31,7 +31,8 @@ function createMapStateToProps() {

const mapDispatchToProps = {
dispatchFetchQualityProfileSchema: fetchQualityProfileSchema,
dispatchUpdateInteractiveImportItems: updateInteractiveImportItems
dispatchUpdateInteractiveImportItems: updateInteractiveImportItems,
dispatchSaveInteractiveImportItems: saveInteractiveImportItem
};

class SelectQualityModalContentConnector extends Component {
Expand All @@ -49,6 +50,12 @@ class SelectQualityModalContentConnector extends Component {
// Listeners

onQualitySelect = ({ qualityId, proper, real }) => {
const {
ids,
dispatchUpdateInteractiveImportItems,
dispatchSaveInteractiveImportItems
} = this.props;

const quality = _.find(this.props.items,
(item) => item.id === qualityId);

Expand All @@ -57,14 +64,16 @@ class SelectQualityModalContentConnector extends Component {
real: real ? 1 : 0
};

this.props.dispatchUpdateInteractiveImportItems({
ids: this.props.ids,
dispatchUpdateInteractiveImportItems({
ids,
quality: {
quality,
revision
}
});

dispatchSaveInteractiveImportItems({ ids });

this.props.onModalClose(true);
};

Expand All @@ -89,6 +98,7 @@ SelectQualityModalContentConnector.propTypes = {
items: PropTypes.arrayOf(PropTypes.object).isRequired,
dispatchFetchQualityProfileSchema: PropTypes.func.isRequired,
dispatchUpdateInteractiveImportItems: PropTypes.func.isRequired,
dispatchSaveInteractiveImportItems: PropTypes.func.isRequired,
onModalClose: PropTypes.func.isRequired
};

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Modal from 'Components/Modal/Modal';
import SelectReleaseGroupModalContentConnector from './SelectReleaseGroupModalContentConnector';

class SelectReleaseGroupModal extends Component {

//
// Render

render() {
const {
isOpen,
onModalClose,
...otherProps
} = this.props;

return (
<Modal
isOpen={isOpen}
onModalClose={onModalClose}
>
<SelectReleaseGroupModalContentConnector
{...otherProps}
onModalClose={onModalClose}
/>
</Modal>
);
}
}

SelectReleaseGroupModal.propTypes = {
isOpen: PropTypes.bool.isRequired,
onModalClose: PropTypes.func.isRequired
};

export default SelectReleaseGroupModal;

0 comments on commit 3825ecd

Please sign in to comment.