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 removeOldSelectedState from 'Utilities/Table/removeOldSelectedState'; import selectAll from 'Utilities/Table/selectAll'; import toggleSelected from 'Utilities/Table/toggleSelected'; import { align, icons } from 'Helpers/Props'; 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 TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper'; import RemoveQueueItemsModal from './RemoveQueueItemsModal'; import QueueOptionsConnector from './QueueOptionsConnector'; 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 }; } shouldComponentUpdate(nextProps) { // Don't update when fetching has completed if items have changed, // before albums start fetching or when albums start fetching. if ( this.props.isFetching && nextProps.isPopulated && hasDifferentItems(this.props.items, nextProps.items) && nextProps.items.some((e) => e.bookId) ) { return false; } if (!this.props.isAlbumsFetching && nextProps.isAlbumsFetching) { return false; } return true; } componentDidUpdate(prevProps) { if (hasDifferentItems(prevProps.items, this.props.items)) { this.setState((state) => { return removeOldSelectedState(state, prevProps.items); }); 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 = (payload) => { this.props.onRemoveSelectedPress({ ids: this.getSelectedIds(), ...payload }); this.setState({ isConfirmRemoveModalOpen: false }); } onConfirmRemoveModalClose = () => { this.setState({ isConfirmRemoveModalOpen: false }); } // // Render render() { const { isFetching, isPopulated, error, items, isAlbumsFetching, isAlbumsPopulated, albumsError, columns, totalRecords, isGrabbing, isRemoving, isRefreshMonitoredDownloadsExecuting, onRefreshPress, ...otherProps } = this.props; const { allSelected, allUnselected, selectedState, isConfirmRemoveModalOpen, isPendingSelected } = this.state; const isRefreshing = isFetching || isAlbumsFetching || isRefreshMonitoredDownloadsExecuting; const isAllPopulated = isPopulated && (isAlbumsPopulated || !items.length || items.every((e) => !e.bookId)); const hasError = error || albumsError; const selectedIds = this.getSelectedIds(); const selectedCount = selectedIds.length; const disableSelectedActions = selectedCount === 0; return ( { isRefreshing && !isAllPopulated && } { !isRefreshing && hasError &&
Failed to load Queue
} { isPopulated && !hasError && !items.length &&
Queue is empty
} { isAllPopulated && !hasError && !!items.length &&
{ items.map((item) => { return ( ); }) }
}
{ const item = items.find((i) => i.id === id); return !!(item && item.authorId && item.bookId); }) )} onRemovePress={this.onRemoveSelectedConfirmed} onModalClose={this.onConfirmRemoveModalClose} />
); } } Queue.propTypes = { isFetching: PropTypes.bool.isRequired, isPopulated: PropTypes.bool.isRequired, error: PropTypes.object, items: PropTypes.arrayOf(PropTypes.object).isRequired, isAlbumsFetching: PropTypes.bool.isRequired, isAlbumsPopulated: PropTypes.bool.isRequired, albumsError: PropTypes.object, columns: PropTypes.arrayOf(PropTypes.object).isRequired, totalRecords: PropTypes.number, isGrabbing: PropTypes.bool.isRequired, isRemoving: PropTypes.bool.isRequired, isRefreshMonitoredDownloadsExecuting: PropTypes.bool.isRequired, onRefreshPress: PropTypes.func.isRequired, onGrabSelectedPress: PropTypes.func.isRequired, onRemoveSelectedPress: PropTypes.func.isRequired }; export default Queue;