import _ from 'lodash'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import SelectInput from 'Components/Form/SelectInput'; import Button from 'Components/Link/Button'; import SpinnerButton from 'Components/Link/SpinnerButton'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import ConfirmModal from 'Components/Modal/ConfirmModal'; 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 Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import { kinds } from 'Helpers/Props'; import hasDifferentItems from 'Utilities/Object/hasDifferentItems'; import translate from 'Utilities/String/translate'; 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 TrackFileEditorRow from './TrackFileEditorRow'; import styles from './TrackFileEditorModalContent.css'; const columns = [ { name: 'trackNumber', label: () => translate('Track'), isVisible: true }, { name: 'path', label: () => translate('Path'), isVisible: true }, { name: 'quality', label: () => translate('Quality'), isVisible: true } ]; class TrackFileEditorModalContent extends Component { // // Lifecycle constructor(props, context) { super(props, context); this.state = { allSelected: false, allUnselected: false, lastToggled: null, selectedState: {}, isConfirmDeleteModalOpen: false }; } componentDidUpdate(prevProps) { if (hasDifferentItems(prevProps.items, this.props.items)) { this.setState((state) => { return removeOldSelectedState(state, prevProps.items); }); } } // // Control getSelectedIds = () => { const selectedIds = getSelectedIds(this.state.selectedState); return selectedIds.reduce((acc, id) => { const matchingItem = this.props.items.find((item) => item.id === id); if (matchingItem && !acc.includes(matchingItem.trackFileId)) { acc.push(matchingItem.trackFileId); } return acc; }, []); }; // // 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); }); }; onDeletePress = () => { this.setState({ isConfirmDeleteModalOpen: true }); }; onConfirmDelete = () => { this.setState({ isConfirmDeleteModalOpen: false }); this.props.onDeletePress(this.getSelectedIds()); }; onConfirmDeleteModalClose = () => { this.setState({ isConfirmDeleteModalOpen: false }); }; onQualityChange = ({ value }) => { const selectedIds = this.getSelectedIds(); if (!selectedIds.length) { return; } this.props.onQualityChange(selectedIds, parseInt(value)); }; // // Render render() { const { isDeleting, isFetching, isPopulated, error, items, qualities, onModalClose } = this.props; const { allSelected, allUnselected, selectedState, isConfirmDeleteModalOpen } = this.state; const qualityOptions = _.reduceRight(qualities, (acc, quality) => { acc.push({ key: quality.id, value: quality.name }); return acc; }, [{ key: 'selectQuality', value: 'Select Quality', disabled: true }]); const hasSelectedFiles = this.getSelectedIds().length > 0; return ( Manage Tracks { isFetching && !isPopulated ? : null } { !isFetching && error ?
{error}
: null } { isPopulated && !items.length ?
No track files to manage.
: null } { isPopulated && items.length ? { items.map((item) => { return ( ); }) }
: null }
Delete
); } } TrackFileEditorModalContent.propTypes = { isDeleting: PropTypes.bool.isRequired, isFetching: PropTypes.bool.isRequired, isPopulated: PropTypes.bool.isRequired, error: PropTypes.object, items: PropTypes.arrayOf(PropTypes.object).isRequired, qualities: PropTypes.arrayOf(PropTypes.object).isRequired, onDeletePress: PropTypes.func.isRequired, onQualityChange: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired }; export default TrackFileEditorModalContent;