import classNames from 'classnames'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import AuthorNameLink from 'Author/AuthorNameLink'; import DeleteAuthorModal from 'Author/Delete/DeleteAuthorModal'; import EditAuthorModalConnector from 'Author/Edit/EditAuthorModalConnector'; import BookNameLink from 'Book/BookNameLink'; import EditBookModalConnector from 'Book/Edit/EditBookModalConnector'; import HeartRating from 'Components/HeartRating'; import IconButton from 'Components/Link/IconButton'; import SpinnerIconButton from 'Components/Link/SpinnerIconButton'; import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector'; import VirtualTableRowCell from 'Components/Table/Cells/VirtualTableRowCell'; import VirtualTableSelectCell from 'Components/Table/Cells/VirtualTableSelectCell'; import TagListConnector from 'Components/TagListConnector'; import { icons } from 'Helpers/Props'; import formatBytes from 'Utilities/Number/formatBytes'; import translate from 'Utilities/String/translate'; import BookStatusCell from './BookStatusCell'; import styles from './BookIndexRow.css'; class BookIndexRow extends Component { // // Lifecycle constructor(props, context) { super(props, context); this.state = { hasBannerError: false, isEditAuthorModalOpen: false, isDeleteAuthorModalOpen: false, isEditBookModalOpen: false }; } onEditAuthorPress = () => { this.setState({ isEditAuthorModalOpen: true }); }; onEditAuthorModalClose = () => { this.setState({ isEditAuthorModalOpen: false }); }; onDeleteAuthorPress = () => { this.setState({ isEditAuthorModalOpen: false, isDeleteAuthorModalOpen: true }); }; onDeleteAuthorModalClose = () => { this.setState({ isDeleteAuthorModalOpen: false }); }; onEditBookPress = () => { this.setState({ isEditBookModalOpen: true }); }; onEditBookModalClose = () => { this.setState({ isEditBookModalOpen: false }); }; onUseSceneNumberingChange = () => { // Mock handler to satisfy `onChange` being required for `CheckInput`. // }; onBannerLoad = () => { if (this.state.hasBannerError) { this.setState({ hasBannerError: false }); } }; onBannerLoadError = () => { if (!this.state.hasBannerError) { this.setState({ hasBannerError: true }); } }; // // Render render() { const { id, authorId, monitored, title, author, titleSlug, qualityProfile, releaseDate, added, statistics, genres, ratings, tags, showSearchAction, columns, isRefreshingBook, isSearchingBook, isEditorActive, isSelected, onRefreshBookPress, onSearchPress, onSelectedChange } = this.props; const { bookFileCount, sizeOnDisk } = statistics; const { isEditAuthorModalOpen, isDeleteAuthorModalOpen, isEditBookModalOpen } = this.state; return ( <> { columns.map((column) => { const { name, isVisible } = column; if (!isVisible) { return null; } if (isEditorActive && name === 'select') { return ( ); } if (name === 'status') { return ( ); } if (name === 'title') { return ( ); } if (name === 'authorName') { return ( ); } if (name === 'qualityProfileId') { return ( {qualityProfile.name} ); } if (name === 'releaseDate') { return ( ); } if (name === 'added') { return ( ); } if (name === 'bookFileCount') { return ( {bookFileCount} ); } if (name === 'path') { return ( {author.path} ); } if (name === 'sizeOnDisk') { return ( {formatBytes(sizeOnDisk)} ); } if (name === 'genres') { const joinedGenres = genres.join(', '); return ( {joinedGenres} ); } if (name === 'ratings') { return ( ); } if (name === 'tags') { return ( ); } if (name === 'actions') { return ( { showSearchAction && } ); } return null; }) } ); } } BookIndexRow.propTypes = { id: PropTypes.number.isRequired, authorId: PropTypes.number.isRequired, monitored: PropTypes.bool.isRequired, title: PropTypes.string.isRequired, titleSlug: PropTypes.string.isRequired, author: PropTypes.object.isRequired, qualityProfile: PropTypes.object.isRequired, releaseDate: PropTypes.string, added: PropTypes.string, statistics: PropTypes.object.isRequired, genres: PropTypes.arrayOf(PropTypes.string).isRequired, ratings: PropTypes.object.isRequired, tags: PropTypes.arrayOf(PropTypes.number).isRequired, images: PropTypes.arrayOf(PropTypes.object).isRequired, showSearchAction: PropTypes.bool.isRequired, columns: PropTypes.arrayOf(PropTypes.object).isRequired, isRefreshingBook: PropTypes.bool.isRequired, isSearchingBook: PropTypes.bool.isRequired, onRefreshBookPress: PropTypes.func.isRequired, onSearchPress: PropTypes.func.isRequired, isEditorActive: PropTypes.bool.isRequired, isSelected: PropTypes.bool, onSelectedChange: PropTypes.func.isRequired }; BookIndexRow.defaultProps = { statistics: { bookCount: 0, bookFileCount: 0, totalBookCount: 0 }, genres: [], tags: [] }; export default BookIndexRow;