import PropTypes from 'prop-types'; import React, { Component } from 'react'; import TextInput from 'Components/Form/TextInput'; import Button from 'Components/Link/Button'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import Scroller from 'Components/Scroller/Scroller'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import { kinds, scrollDirections } from 'Helpers/Props'; import getErrorMessage from 'Utilities/Object/getErrorMessage'; import getSelectedIds from 'Utilities/Table/getSelectedIds'; import selectAll from 'Utilities/Table/selectAll'; import toggleSelected from 'Utilities/Table/toggleSelected'; import SelectEpisodeRow from './SelectEpisodeRow'; import styles from './SelectEpisodeModalContent.css'; const columns = [ { name: 'episodeNumber', label: '#', isSortable: true, isVisible: true }, { name: 'title', label: 'Title', isVisible: true }, { name: 'airDate', label: 'Air Date', isVisible: true } ]; class SelectEpisodeModalContent extends Component { // // Lifecycle constructor(props, context) { super(props, context); this.state = { allSelected: false, allUnselected: false, filter: '', lastToggled: null, selectedState: {} }; } // // Control getSelectedIds = () => { return getSelectedIds(this.state.selectedState); }; // // Listeners onFilterChange = ({ value }) => { this.setState({ filter: value.toLowerCase() }); }; onSelectAllChange = ({ value }) => { this.setState(selectAll(this.state.selectedState, value)); }; onSelectedChange = ({ id, value, shiftKey = false }) => { this.setState((state) => { return toggleSelected(state, this.props.items, id, value, shiftKey); }); }; onEpisodesSelect = () => { this.props.onEpisodesSelect(this.getSelectedIds()); }; // // Render render() { const { ids, isFetching, isPopulated, error, items, relativePath, isAnime, sortKey, sortDirection, modalTitle, onSortPress, onModalClose } = this.props; const { allSelected, allUnselected, filter, selectedState } = this.state; const filterEpisodeNumber = parseInt(filter); const errorMessage = getErrorMessage(error, 'Unable to load episodes'); const selectedFilesCount = ids.length; const selectedCount = this.getSelectedIds().length; const selectionIsValid = ( selectedCount > 0 && selectedCount % selectedFilesCount === 0 ); return (
{modalTitle} - Select Episode(s)
{ isFetching ? : null } { error ?
{errorMessage}
: null } { isPopulated && !!items.length ? { items.map((item) => { return item.title.toLowerCase().includes(filter) || item.episodeNumber === filterEpisodeNumber ? ( ) : null; }) }
: null } { isPopulated && !items.length ? 'No episodes were found for the selected season' : null }
{ relativePath ? relativePath : `${selectedFilesCount} selected files` }
); } } SelectEpisodeModalContent.propTypes = { ids: PropTypes.arrayOf(PropTypes.number).isRequired, isFetching: PropTypes.bool.isRequired, isPopulated: PropTypes.bool.isRequired, error: PropTypes.object, items: PropTypes.arrayOf(PropTypes.object).isRequired, relativePath: PropTypes.string, isAnime: PropTypes.bool.isRequired, sortKey: PropTypes.string, sortDirection: PropTypes.string, modalTitle: PropTypes.string, onSortPress: PropTypes.func.isRequired, onEpisodesSelect: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired }; export default SelectEpisodeModalContent;