import _ from 'lodash'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import hasDifferentItems from 'Utilities/Object/hasDifferentItems'; import getSelectedIds from 'Utilities/Table/getSelectedIds'; import selectAll from 'Utilities/Table/selectAll'; import toggleSelected from 'Utilities/Table/toggleSelected'; import { icons } from 'Helpers/Props'; import episodeEntities from 'Episode/episodeEntities'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import TablePager from 'Components/Table/TablePager'; import PageContent from 'Components/Page/PageContent'; import PageContentBodyConnector from 'Components/Page/PageContentBodyConnector'; import PageToolbar from 'Components/Page/Toolbar/PageToolbar'; import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection'; import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton'; import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator'; import RemoveQueueItemsModal from './RemoveQueueItemsModal'; import QueueRowConnector from './QueueRowConnector'; class Queue extends Component { // // Lifecycle constructor(props, context) { super(props, context); this.state = { allSelected: false, allUnselected: false, lastToggled: null, selectedState: {}, isPendingSelected: false, isConfirmRemoveModalOpen: false }; } componentDidUpdate(prevProps) { if (hasDifferentItems(prevProps.items, this.props.items)) { this.setState({ selectedState: {} }); return; } const selectedIds = this.getSelectedIds(); const isPendingSelected = _.some(this.props.items, (item) => { return selectedIds.indexOf(item.id) > -1 && item.status === 'Delay'; }); if (isPendingSelected !== this.state.isPendingSelected) { this.setState({ isPendingSelected }); } } // // Control getSelectedIds = () => { return getSelectedIds(this.state.selectedState); } // // Listeners 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); }); } onGrabSelectedPress = () => { this.props.onGrabSelectedPress(this.getSelectedIds()); } onRemoveSelectedPress = () => { this.setState({ isConfirmRemoveModalOpen: true }); } onRemoveSelectedConfirmed = (blacklist) => { this.props.onRemoveSelectedPress(this.getSelectedIds(), blacklist); this.setState({ isConfirmRemoveModalOpen: false }); } onConfirmRemoveModalClose = () => { this.setState({ isConfirmRemoveModalOpen: false }); } // // Render render() { const { isFetching, isPopulated, error, items, isEpisodesPopulated, columns, totalRecords, isGrabbing, isRemoving, isCheckForFinishedDownloadExecuting, onRefreshPress, ...otherProps } = this.props; const { allSelected, allUnselected, selectedState, isConfirmRemoveModalOpen, isPendingSelected } = this.state; const isRefreshing = isFetching || isCheckForFinishedDownloadExecuting; const isAllPopulated = isPopulated && (isEpisodesPopulated || !items.length); const selectedCount = this.getSelectedIds().length; const disableSelectedActions = selectedCount === 0; return ( { isRefreshing && !isAllPopulated && } { !isRefreshing && error &&
Failed to load Queue
} { isAllPopulated && !error && !items.length &&
Queue is empty
} { isAllPopulated && !error && !!items.length &&
{ items.map((item) => { return ( ); }) }
}
); } } Queue.propTypes = { isFetching: PropTypes.bool.isRequired, isPopulated: PropTypes.bool.isRequired, error: PropTypes.object, items: PropTypes.arrayOf(PropTypes.object).isRequired, isEpisodesPopulated: PropTypes.bool.isRequired, columns: PropTypes.arrayOf(PropTypes.object).isRequired, totalRecords: PropTypes.number, isGrabbing: PropTypes.bool.isRequired, isRemoving: PropTypes.bool.isRequired, isCheckForFinishedDownloadExecuting: PropTypes.bool.isRequired, onRefreshPress: PropTypes.func.isRequired, onGrabSelectedPress: PropTypes.func.isRequired, onRemoveSelectedPress: PropTypes.func.isRequired }; export default Queue;