diff --git a/ui/src/album/AlbumDetails.js b/ui/src/album/AlbumDetails.js
index b4b3f4ae5..23284d436 100644
--- a/ui/src/album/AlbumDetails.js
+++ b/ui/src/album/AlbumDetails.js
@@ -6,6 +6,7 @@ import 'react-image-lightbox/style.css'
import subsonic from '../subsonic'
import { DurationField, formatRange, StarButton, SizeField } from '../common'
import { ArtistLinkField } from '../common'
+import { AlbumContextMenu, PlayButton } from '../common'
const AlbumDetails = ({ classes, record }) => {
const [isLightboxOpen, setLightboxOpen] = React.useState(false)
@@ -36,7 +37,9 @@ const AlbumDetails = ({ classes, record }) => {
image={imageUrl}
className={classes.albumCover}
onClick={handleOpenLightbox}
- />
+ >
+
+
{record.name}
diff --git a/ui/src/album/AlbumGridView.js b/ui/src/album/AlbumGridView.js
index 5beed23fa..a951649c9 100644
--- a/ui/src/album/AlbumGridView.js
+++ b/ui/src/album/AlbumGridView.js
@@ -11,18 +11,25 @@ import { Link } from 'react-router-dom'
import { linkToRecord, Loading } from 'react-admin'
import { withContentRect } from 'react-measure'
import subsonic from '../subsonic'
-import { ArtistLinkField, RangeField } from '../common'
-import { AlbumContextMenu } from '../common'
+import { AlbumContextMenu, PlayButton } from '../common'
const useStyles = makeStyles((theme) => ({
root: {
margin: '20px',
},
tileBar: {
+ transition:'all 150ms ease-out',
+ opacity:0,
textAlign: 'left',
marginBottom: '3px',
background:
- 'linear-gradient(to top, rgba(0,0,0,1) 0%,rgba(0,0,0,0.4) 70%,rgba(0,0,0,0) 100%)',
+ 'linear-gradient(to top, rgba(0,0,0,0.7) 0%,rgba(0,0,0,0.4) 70%,rgba(0,0,0,0) 100%)',
+ },
+ tileBarMobile: {
+ textAlign: 'left',
+ marginBottom: '3px',
+ background:
+ 'linear-gradient(to top, rgba(0,0,0,0.7) 0%,rgba(0,0,0,0.4) 70%,rgba(0,0,0,0) 100%)',
},
albumArtistName: {
whiteSpace: 'nowrap',
@@ -51,8 +58,16 @@ const useStyles = makeStyles((theme) => ({
link: {
position:'relative',
display: 'block',
- textDecoration:'none'
- }
+ textDecoration:'none',
+ "&:hover $tileBar": {
+ opacity:1,
+ }
+ },
+ albumLlink: {
+ position:'relative',
+ display: 'block',
+ textDecoration:'none',
+ },
}))
const useCoverStyles = makeStyles({
@@ -106,14 +121,15 @@ const AlbumGridTile = ({ showArtist, record, basePath }) => {
>
- {(!isDesktop || visible) && (
+ }
actionIcon={}
/>
- )}
-
+
{record.name}
{record.albumArtist}
diff --git a/ui/src/album/styles.js b/ui/src/album/styles.js
index 08119d7a1..1b7b7edaf 100644
--- a/ui/src/album/styles.js
+++ b/ui/src/album/styles.js
@@ -11,9 +11,16 @@ export const useStyles = makeStyles((theme) => ({
minWidth: '32em',
},
},
+ playButton: {
+ opacity:0,
+ transition:'all 150ms ease-out'
+ },
albumCover: {
- display: 'inline-block',
+ display: 'inline-flex',
+ justifyContent:'center',
+ alignItems:'center',
cursor: 'pointer',
+
[theme.breakpoints.down('xs')]: {
height: '8em',
width: '8em',
@@ -26,6 +33,9 @@ export const useStyles = makeStyles((theme) => ({
height: '15em',
width: '15em',
},
+ '&:hover $playButton': {
+ opacity:1,
+ }
},
albumDetails: {
display: 'inline-block',
diff --git a/ui/src/common/PlayButton.js b/ui/src/common/PlayButton.js
index 433c6a01a..78d42bf5a 100644
--- a/ui/src/common/PlayButton.js
+++ b/ui/src/common/PlayButton.js
@@ -3,28 +3,50 @@ import PropTypes from 'prop-types'
import PlayArrowIcon from '@material-ui/icons/PlayArrow'
import { IconButton } from '@material-ui/core'
import { useDispatch } from 'react-redux'
+import { useDataProvider } from 'react-admin'
+import { playTracks } from '../audioplayer'
-const defaultIcon =
-
-const PlayButton = ({ icon = defaultIcon, action, ...rest }) => {
+const PlayButton = ({ record, size = 'small', ...rest }) => {
+ let extractSongsData = function (response) {
+ const data = response.data.reduce(
+ (acc, cur) => ({ ...acc, [cur.id]: cur }),
+ {}
+ )
+ const ids = response.data.map((r) => r.id)
+ return { data, ids }
+ }
+ const dataProvider = useDataProvider()
const dispatch = useDispatch()
+ const playAlbum = record => {
+ dataProvider
+ .getList('albumSong', {
+ pagination: { page: 1, perPage: -1 },
+ sort: { field: 'discNumber, trackNumber', order: 'ASC' },
+ filter: { album_id: record.id, disc_number: record.discNumber },
+ })
+ .then((response) => {
+ let { data, ids } = extractSongsData(response)
+ dispatch(playTracks(data, ids))
+ })
+ }
return (
{
e.stopPropagation()
- dispatch(action)
+ e.preventDefault()
+ playAlbum(record)
}}
{...rest}
- size={'small'}
+ size={size}
>
- {icon}
+
)
}
PlayButton.propTypes = {
icon: PropTypes.element,
- action: PropTypes.object,
+ record: PropTypes.object,
}
export default PlayButton