import PropTypes from 'prop-types'; import React, { Component } from 'react'; import BookFormats from 'Book/BookFormats'; import BookQuality from 'Book/BookQuality'; import IndexerFlags from 'Book/IndexerFlags'; import FileDetails from 'BookFile/FileDetails'; import Icon from 'Components/Icon'; import ConfirmModal from 'Components/Modal/ConfirmModal'; import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableRowCellButton from 'Components/Table/Cells/TableRowCellButton'; import TableSelectCell from 'Components/Table/Cells/TableSelectCell'; import TableRow from 'Components/Table/TableRow'; import Popover from 'Components/Tooltip/Popover'; import Tooltip from 'Components/Tooltip/Tooltip'; import { icons, kinds, sizes, tooltipPositions } from 'Helpers/Props'; import SelectAuthorModal from 'InteractiveImport/Author/SelectAuthorModal'; import SelectBookModal from 'InteractiveImport/Book/SelectBookModal'; import SelectIndexerFlagsModal from 'InteractiveImport/IndexerFlags/SelectIndexerFlagsModal'; 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'; import styles from './InteractiveImportRow.css'; class InteractiveImportRow extends Component { // // Lifecycle constructor(props, context) { super(props, context); this.state = { isDetailsModalOpen: false, isSelectAuthorModalOpen: false, isSelectBookModalOpen: false, isSelectReleaseGroupModalOpen: false, isSelectQualityModalOpen: false, isSelectIndexerFlagsModalOpen: false }; } componentDidMount() { const { id, author, book, foreignEditionId, quality } = this.props; if ( author && book != null && foreignEditionId && quality ) { this.props.onSelectedChange({ id, value: true }); } } componentDidUpdate(prevProps) { const { id, author, book, foreignEditionId, quality, isSelected, onValidRowChange } = this.props; if ( prevProps.author === author && prevProps.book === book && prevProps.foreignEditionId === foreignEditionId && prevProps.quality === quality && prevProps.isSelected === isSelected ) { return; } const isValid = !!( author && book && foreignEditionId && quality ); if (isSelected && !isValid) { onValidRowChange(id, false); } else { onValidRowChange(id, true); } } // // Control selectRowAfterChange = (value) => { const { id, isSelected } = this.props; if (!isSelected && value === true) { this.props.onSelectedChange({ id, value }); } }; // // Listeners onDetailsPress = () => { this.setState({ isDetailsModalOpen: true }); }; onDetailsModalClose = () => { this.setState({ isDetailsModalOpen: false }); }; onSelectAuthorPress = () => { this.setState({ isSelectAuthorModalOpen: true }); }; onSelectBookPress = () => { this.setState({ isSelectBookModalOpen: true }); }; onSelectReleaseGroupPress = () => { this.setState({ isSelectReleaseGroupModalOpen: true }); }; onSelectQualityPress = () => { this.setState({ isSelectQualityModalOpen: true }); }; onSelectIndexerFlagsPress = () => { this.setState({ isSelectIndexerFlagsModalOpen: true }); }; onSelectAuthorModalClose = (changed) => { this.setState({ isSelectAuthorModalOpen: false }); this.selectRowAfterChange(changed); }; onSelectBookModalClose = (changed) => { this.setState({ isSelectBookModalOpen: false }); this.selectRowAfterChange(changed); }; onSelectReleaseGroupModalClose = (changed) => { this.setState({ isSelectReleaseGroupModalOpen: false }); this.selectRowAfterChange(changed); }; onSelectQualityModalClose = (changed) => { this.setState({ isSelectQualityModalOpen: false }); this.selectRowAfterChange(changed); }; onSelectIndexerFlagsModalClose = (changed) => { this.setState({ isSelectIndexerFlagsModalOpen: false }); this.selectRowAfterChange(changed); }; // // Render render() { const { id, allowAuthorChange, path, author, book, quality, releaseGroup, size, customFormats, indexerFlags, rejections, columns, additionalFile, isSelected, isReprocessing, onSelectedChange, audioTags } = this.props; const { isDetailsModalOpen, isSelectAuthorModalOpen, isSelectBookModalOpen, isSelectReleaseGroupModalOpen, isSelectQualityModalOpen, isSelectIndexerFlagsModalOpen } = this.state; const authorName = author ? author.authorName : ''; let bookTitle = ''; if (book) { bookTitle = book.disambiguation ? `${book.title} (${book.disambiguation})` : book.title; } const showAuthorPlaceholder = isSelected && !author; const showBookNumberPlaceholder = !isReprocessing && isSelected && !!author && !book; const showReleaseGroupPlaceholder = isSelected && !releaseGroup; const showQualityPlaceholder = isSelected && !quality; const showIndexerFlagsPlaceholder = isSelected && !indexerFlags; const pathCellContents = (
{path}
); const pathCell = additionalFile ? ( ) : pathCellContents; const fileDetails = ( ); const isIndexerFlagsColumnVisible = columns.find((c) => c.name === 'indexerFlags')?.isVisible ?? false; return ( {pathCell} { showAuthorPlaceholder ? : authorName } { showBookNumberPlaceholder ? : bookTitle } { showReleaseGroupPlaceholder ? : releaseGroup } { showQualityPlaceholder && } { !showQualityPlaceholder && !!quality && } {formatBytes(size)} { customFormats?.length ? } title={translate('Formats')} body={
} position={tooltipPositions.LEFT} /> : null }
{isIndexerFlagsColumnVisible ? ( {showIndexerFlagsPlaceholder ? ( ) : ( <> {indexerFlags ? ( } title={translate('IndexerFlags')} body={} position={tooltipPositions.LEFT} /> ) : null} )} ) : null} { rejections.length ? } title={translate('ReleaseRejected')} body={
    { rejections.map((rejection, index) => { return (
  • {rejection.reason}
  • ); }) }
} position={tooltipPositions.LEFT} canFlip={false} /> : null }
1 : false} real={quality ? quality.revision.real > 0 : false} onModalClose={this.onSelectQualityModalClose} />
); } } InteractiveImportRow.propTypes = { id: PropTypes.number.isRequired, allowAuthorChange: PropTypes.bool.isRequired, path: PropTypes.string.isRequired, author: PropTypes.object, book: PropTypes.object, foreignEditionId: PropTypes.string, releaseGroup: PropTypes.string, quality: PropTypes.object, size: PropTypes.number.isRequired, customFormats: PropTypes.arrayOf(PropTypes.object), indexerFlags: PropTypes.number.isRequired, rejections: PropTypes.arrayOf(PropTypes.object).isRequired, columns: PropTypes.arrayOf(PropTypes.object).isRequired, audioTags: PropTypes.object.isRequired, additionalFile: PropTypes.bool.isRequired, isReprocessing: PropTypes.bool, isSelected: PropTypes.bool, onSelectedChange: PropTypes.func.isRequired, onValidRowChange: PropTypes.func.isRequired }; export default InteractiveImportRow;