feat: make song list more responsive
This commit is contained in:
@@ -12,7 +12,7 @@ const mapToAudioLists = (item) => ({
|
|||||||
cover: `/rest/getCoverArt?u=admin&p=enc:73756e6461&f=json&v=1.8.0&c=NavidromeUI&size=300&id=${item.id}`,
|
cover: `/rest/getCoverArt?u=admin&p=enc:73756e6461&f=json&v=1.8.0&c=NavidromeUI&size=300&id=${item.id}`,
|
||||||
musicSrc: `/rest/stream?u=admin&p=enc:73756e6461&f=json&v=1.8.0&c=NavidromeUI&id=${
|
musicSrc: `/rest/stream?u=admin&p=enc:73756e6461&f=json&v=1.8.0&c=NavidromeUI&id=${
|
||||||
item.id
|
item.id
|
||||||
}&ts=${new Date().getTime()}`
|
}&_=${new Date().getTime()}`
|
||||||
})
|
})
|
||||||
|
|
||||||
const addTrack = (data) => ({
|
const addTrack = (data) => ({
|
||||||
@@ -52,7 +52,7 @@ const playQueueReducer = (
|
|||||||
const newQueue = previousState.queue.map((item) => {
|
const newQueue = previousState.queue.map((item) => {
|
||||||
return {
|
return {
|
||||||
...item,
|
...item,
|
||||||
scrobbled: item.scrobbled || (item.id === data)
|
scrobbled: item.scrobbled || item.id === data
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return { queue: newQueue, clear: false }
|
return { queue: newQueue, clear: false }
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ import React from 'react'
|
|||||||
import { Button, useDataProvider, useUnselectAll } from 'react-admin'
|
import { Button, useDataProvider, useUnselectAll } from 'react-admin'
|
||||||
import { useDispatch } from 'react-redux'
|
import { useDispatch } from 'react-redux'
|
||||||
import { addTrack } from '../player'
|
import { addTrack } from '../player'
|
||||||
|
import AddToQueueIcon from '@material-ui/icons/AddToQueue'
|
||||||
|
|
||||||
|
import Tooltip from '@material-ui/core/Tooltip'
|
||||||
|
|
||||||
const AddToQueueButton = ({ selectedIds }) => {
|
const AddToQueueButton = ({ selectedIds }) => {
|
||||||
const dispatch = useDispatch()
|
const dispatch = useDispatch()
|
||||||
@@ -16,7 +19,17 @@ const AddToQueueButton = ({ selectedIds }) => {
|
|||||||
unselectAll('song')
|
unselectAll('song')
|
||||||
}
|
}
|
||||||
|
|
||||||
return <Button color="secondary" label="Add To Queue" onClick={addToQueue} />
|
return (
|
||||||
|
<Button
|
||||||
|
color="secondary"
|
||||||
|
label={
|
||||||
|
<Tooltip title={'Play Later'} placement="right">
|
||||||
|
<AddToQueueIcon />
|
||||||
|
</Tooltip>
|
||||||
|
}
|
||||||
|
onClick={addToQueue}
|
||||||
|
/>
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default AddToQueueButton
|
export default AddToQueueButton
|
||||||
|
|||||||
+21
-8
@@ -17,6 +17,9 @@ import { useMediaQuery } from '@material-ui/core'
|
|||||||
import { BitrateField, DurationField, Pagination, Title } from '../common'
|
import { BitrateField, DurationField, Pagination, Title } from '../common'
|
||||||
import AddToQueueButton from './AddToQueueButton'
|
import AddToQueueButton from './AddToQueueButton'
|
||||||
import PlayButton from './PlayButton'
|
import PlayButton from './PlayButton'
|
||||||
|
import { useDispatch } from 'react-redux'
|
||||||
|
import { setTrack, addTrack } from '../player'
|
||||||
|
import AddIcon from '@material-ui/icons/Add'
|
||||||
|
|
||||||
const SongFilter = (props) => (
|
const SongFilter = (props) => (
|
||||||
<Filter {...props}>
|
<Filter {...props}>
|
||||||
@@ -48,7 +51,9 @@ const SongDetails = (props) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const SongList = (props) => {
|
const SongList = (props) => {
|
||||||
|
const dispatch = useDispatch()
|
||||||
const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))
|
const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))
|
||||||
|
const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))
|
||||||
return (
|
return (
|
||||||
<List
|
<List
|
||||||
{...props}
|
{...props}
|
||||||
@@ -57,7 +62,7 @@ const SongList = (props) => {
|
|||||||
exporter={false}
|
exporter={false}
|
||||||
bulkActionButtons={<SongBulkActionButtons />}
|
bulkActionButtons={<SongBulkActionButtons />}
|
||||||
filters={<SongFilter />}
|
filters={<SongFilter />}
|
||||||
perPage={15}
|
perPage={isXsmall ? 50 : 15}
|
||||||
pagination={<Pagination />}
|
pagination={<Pagination />}
|
||||||
>
|
>
|
||||||
{isXsmall ? (
|
{isXsmall ? (
|
||||||
@@ -65,24 +70,32 @@ const SongList = (props) => {
|
|||||||
primaryText={(record) => (
|
primaryText={(record) => (
|
||||||
<>
|
<>
|
||||||
<PlayButton record={record} />
|
<PlayButton record={record} />
|
||||||
|
<PlayButton
|
||||||
|
record={record}
|
||||||
|
action={addTrack}
|
||||||
|
icon={<AddIcon />}
|
||||||
|
/>
|
||||||
{record.title}
|
{record.title}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
secondaryText={(record) => record.artist}
|
secondaryText={(record) => record.artist}
|
||||||
tertiaryText={(record) => (
|
tertiaryText={(record) => (
|
||||||
<DurationField record={record} source={'duration'} />
|
<>
|
||||||
|
<DurationField record={record} source={'duration'} />
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
linkType={false}
|
linkType={false}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<Datagrid expand={<SongDetails />}>
|
<Datagrid
|
||||||
<PlayButton {...props} />
|
expand={<SongDetails />}
|
||||||
|
rowClick={(id, basePath, record) => dispatch(setTrack(record))}
|
||||||
|
>
|
||||||
<TextField source="title" />
|
<TextField source="title" />
|
||||||
<TextField source="album" />
|
{isDesktop && <TextField source="album" />}
|
||||||
<TextField source="artist" />
|
<TextField source="artist" />
|
||||||
<NumberField label="Track #" source="trackNumber" />
|
{isDesktop && <NumberField label="Track #" source="trackNumber" />}
|
||||||
<NumberField label="Disc #" source="discNumber" />
|
{isDesktop && <TextField source="year" />}
|
||||||
<TextField source="year" />
|
|
||||||
<DurationField label="Time" source="duration" />
|
<DurationField label="Time" source="duration" />
|
||||||
</Datagrid>
|
</Datagrid>
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in New Issue
Block a user