Allow playing one disc of a set, by clicking on its number/name

This commit is contained in:
Deluan
2020-05-27 21:07:51 -04:00
parent 432fe10a5e
commit 498e196d48
+27 -11
View File
@@ -1,9 +1,11 @@
import React, { useState, isValidElement, cloneElement } from 'react' import React, { useState, isValidElement, cloneElement } from 'react'
import { useDispatch } from 'react-redux'
import { Datagrid, DatagridBody, DatagridRow } from 'react-admin' import { Datagrid, DatagridBody, DatagridRow } from 'react-admin'
import { TableCell, TableRow, Typography } from '@material-ui/core' import { TableCell, TableRow, Typography } from '@material-ui/core'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import { makeStyles } from '@material-ui/core/styles' import { makeStyles } from '@material-ui/core/styles'
import AlbumIcon from '@material-ui/icons/Album' import AlbumIcon from '@material-ui/icons/Album'
import { playTracks } from '../audioplayer'
const useStyles = makeStyles({ const useStyles = makeStyles({
subtitle: { subtitle: {
@@ -11,6 +13,7 @@ const useStyles = makeStyles({
overflow: 'hidden', overflow: 'hidden',
textOverflow: 'ellipsis', textOverflow: 'ellipsis',
verticalAlign: 'middle', verticalAlign: 'middle',
cursor: 'pointer',
}, },
discIcon: { discIcon: {
verticalAlign: 'text-top', verticalAlign: 'text-top',
@@ -24,24 +27,26 @@ export const SongDatagridRow = ({
multiDisc, multiDisc,
contextAlwaysVisible, contextAlwaysVisible,
contextMenu, contextMenu,
onClickDiscSubtitle,
...rest ...rest
}) => { }) => {
const classes = useStyles() const classes = useStyles()
const [visible, setVisible] = useState(false) const [visible, setVisible] = useState(false)
const childCount = React.Children.count(children) const childCount = React.Children.count(children)
const handlePlayDisc = (discNumber) => () => {
onClickDiscSubtitle(discNumber)
}
return ( return (
<> <>
{multiDisc && ( {multiDisc && record.trackNumber === 1 && (
<TableRow> <TableRow hover onClick={handlePlayDisc(record.discNumber)}>
{record.trackNumber === 1 && ( <TableCell colSpan={childCount + 1}>
<TableCell colSpan={children.length + 2}> <Typography variant="h6" className={classes.subtitle}>
<Typography variant="h6" className={classes.subtitle}> <AlbumIcon className={classes.discIcon} fontSize={'small'} />
<AlbumIcon className={classes.discIcon} fontSize={'small'} /> {record.discNumber}
{record.discNumber} {record.discSubtitle && `: ${record.discSubtitle}`}
{record.discSubtitle && `: ${record.discSubtitle}`} </Typography>
</Typography> </TableCell>
</TableCell>
)}
</TableRow> </TableRow>
)} )}
<DatagridRow <DatagridRow
@@ -72,9 +77,19 @@ SongDatagridRow.propTypes = {
children: PropTypes.node, children: PropTypes.node,
multiDisc: PropTypes.bool, multiDisc: PropTypes.bool,
contextAlwaysVisible: PropTypes.bool, contextAlwaysVisible: PropTypes.bool,
onClickDiscSubtitle: PropTypes.func,
}
SongDatagridRow.defaultProps = {
onClickDiscSubtitle: () => {},
} }
export const SongDatagrid = ({ multiDisc, contextAlwaysVisible, ...rest }) => { export const SongDatagrid = ({ multiDisc, contextAlwaysVisible, ...rest }) => {
const dispatch = useDispatch()
const playDisc = (discNumber) => {
const ids = rest.ids.filter((id) => rest.data[id].discNumber === discNumber)
dispatch(playTracks(rest.data, ids))
}
const SongDatagridBody = (props) => ( const SongDatagridBody = (props) => (
<DatagridBody <DatagridBody
{...props} {...props}
@@ -82,6 +97,7 @@ export const SongDatagrid = ({ multiDisc, contextAlwaysVisible, ...rest }) => {
<SongDatagridRow <SongDatagridRow
multiDisc={multiDisc} multiDisc={multiDisc}
contextAlwaysVisible={contextAlwaysVisible} contextAlwaysVisible={contextAlwaysVisible}
onClickDiscSubtitle={playDisc}
/> />
} }
/> />