Add context menu to playlist songs
This commit is contained in:
@@ -22,7 +22,7 @@ export const addAlbumToPlaylist = (dataProvider, albumId, playlistId) =>
|
|||||||
.then((ids) => addTracksToPlaylist(dataProvider, ids, playlistId))
|
.then((ids) => addTracksToPlaylist(dataProvider, ids, playlistId))
|
||||||
|
|
||||||
const AddToPlaylistMenu = React.forwardRef(
|
const AddToPlaylistMenu = React.forwardRef(
|
||||||
({ selectedIds, albumId, onClose }, ref) => {
|
({ selectedIds, albumId, onClose, onItemAdded }, ref) => {
|
||||||
const notify = useNotify()
|
const notify = useNotify()
|
||||||
const dataProvider = useDataProvider()
|
const dataProvider = useDataProvider()
|
||||||
const { ids, data, loaded } = useGetList(
|
const { ids, data, loaded } = useGetList(
|
||||||
@@ -38,22 +38,23 @@ const AddToPlaylistMenu = React.forwardRef(
|
|||||||
|
|
||||||
const handleItemClick = (e) => {
|
const handleItemClick = (e) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
const value = e.target.getAttribute('value')
|
const playlistId = e.target.getAttribute('value')
|
||||||
if (value !== '') {
|
if (playlistId !== '') {
|
||||||
const add = albumId
|
const add = albumId
|
||||||
? addAlbumToPlaylist(dataProvider, albumId, value)
|
? addAlbumToPlaylist(dataProvider, albumId, playlistId)
|
||||||
: addTracksToPlaylist(dataProvider, selectedIds, value)
|
: addTracksToPlaylist(dataProvider, selectedIds, playlistId)
|
||||||
|
|
||||||
add
|
add
|
||||||
.then((len) => {
|
.then((len) => {
|
||||||
notify('message.songsAddedToPlaylist', 'info', { smart_count: len })
|
notify('message.songsAddedToPlaylist', 'info', { smart_count: len })
|
||||||
|
onItemAdded && onItemAdded(playlistId, selectedIds)
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
notify('ra.page.error', 'warning')
|
notify('ra.page.error', 'warning')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
onClose && onClose()
|
onClose && onClose(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -71,6 +72,8 @@ const AddToPlaylistMenu = React.forwardRef(
|
|||||||
AddToPlaylistMenu.propTypes = {
|
AddToPlaylistMenu.propTypes = {
|
||||||
selectedIds: PropTypes.arrayOf(PropTypes.any).isRequired,
|
selectedIds: PropTypes.arrayOf(PropTypes.any).isRequired,
|
||||||
albumId: PropTypes.string,
|
albumId: PropTypes.string,
|
||||||
|
onClose: PropTypes.func,
|
||||||
|
onItemAdded: PropTypes.func,
|
||||||
}
|
}
|
||||||
|
|
||||||
AddToPlaylistMenu.defaultProps = {
|
AddToPlaylistMenu.defaultProps = {
|
||||||
|
|||||||
@@ -6,11 +6,13 @@ import {
|
|||||||
ListToolbar,
|
ListToolbar,
|
||||||
TextField,
|
TextField,
|
||||||
useListController,
|
useListController,
|
||||||
|
useRefresh,
|
||||||
} from 'react-admin'
|
} from 'react-admin'
|
||||||
import classnames from 'classnames'
|
import classnames from 'classnames'
|
||||||
import { Card, useMediaQuery } from '@material-ui/core'
|
import { Card, useMediaQuery } from '@material-ui/core'
|
||||||
import { makeStyles } from '@material-ui/core/styles'
|
import { makeStyles } from '@material-ui/core/styles'
|
||||||
import { DurationField, SongDetails } from '../common'
|
import { DurationField, SongDetails } from '../common'
|
||||||
|
import { SongContextMenu } from '../song/SongContextMenu'
|
||||||
|
|
||||||
const useStyles = makeStyles(
|
const useStyles = makeStyles(
|
||||||
(theme) => ({
|
(theme) => ({
|
||||||
@@ -54,6 +56,7 @@ const PlaylistSongs = (props) => {
|
|||||||
const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))
|
const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))
|
||||||
// const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))
|
// const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))
|
||||||
const controllerProps = useListController(props)
|
const controllerProps = useListController(props)
|
||||||
|
const refresh = useRefresh()
|
||||||
const { bulkActionButtons, expand, className, playlistId } = props
|
const { bulkActionButtons, expand, className, playlistId } = props
|
||||||
const { data, ids, version, loaded } = controllerProps
|
const { data, ids, version, loaded } = controllerProps
|
||||||
|
|
||||||
@@ -65,6 +68,12 @@ const PlaylistSongs = (props) => {
|
|||||||
return <div />
|
return <div />
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const onAddToPlaylist = (playlistId) => {
|
||||||
|
if (playlistId === props.id) {
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<ListToolbar
|
<ListToolbar
|
||||||
@@ -106,6 +115,7 @@ const PlaylistSongs = (props) => {
|
|||||||
<TextField source="title" sortable={false} />
|
<TextField source="title" sortable={false} />
|
||||||
<TextField source="artist" sortable={false} />
|
<TextField source="artist" sortable={false} />
|
||||||
<DurationField source="duration" sortable={false} />
|
<DurationField source="duration" sortable={false} />
|
||||||
|
<SongContextMenu onAddToPlaylist={onAddToPlaylist} />
|
||||||
</Datagrid>
|
</Datagrid>
|
||||||
)}
|
)}
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { Menu } from '@material-ui/core'
|
|||||||
import PlaylistAddIcon from '@material-ui/icons/PlaylistAdd'
|
import PlaylistAddIcon from '@material-ui/icons/PlaylistAdd'
|
||||||
import { AddToPlaylistMenu } from '../common'
|
import { AddToPlaylistMenu } from '../common'
|
||||||
|
|
||||||
const AddToPlaylistButton = ({ resource, selectedIds }) => {
|
const AddToPlaylistButton = ({ resource, selectedIds, onAddToPlaylist }) => {
|
||||||
const [anchorEl, setAnchorEl] = React.useState(null)
|
const [anchorEl, setAnchorEl] = React.useState(null)
|
||||||
const translate = useTranslate()
|
const translate = useTranslate()
|
||||||
const unselectAll = useUnselectAll()
|
const unselectAll = useUnselectAll()
|
||||||
@@ -40,6 +40,7 @@ const AddToPlaylistButton = ({ resource, selectedIds }) => {
|
|||||||
selectedIds={selectedIds}
|
selectedIds={selectedIds}
|
||||||
menuOpen={Boolean(anchorEl)}
|
menuOpen={Boolean(anchorEl)}
|
||||||
onClose={handleClose}
|
onClose={handleClose}
|
||||||
|
onItemAdded={onAddToPlaylist}
|
||||||
/>
|
/>
|
||||||
</Menu>
|
</Menu>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -6,8 +6,9 @@ import MoreVertIcon from '@material-ui/icons/MoreVert'
|
|||||||
import { addTracks, setTrack } from '../audioplayer'
|
import { addTracks, setTrack } from '../audioplayer'
|
||||||
import { AddToPlaylistMenu } from '../common'
|
import { AddToPlaylistMenu } from '../common'
|
||||||
import NestedMenuItem from 'material-ui-nested-menu-item'
|
import NestedMenuItem from 'material-ui-nested-menu-item'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
|
||||||
export const SongContextMenu = ({ record }) => {
|
export const SongContextMenu = ({ record, onAddToPlaylist }) => {
|
||||||
const dispatch = useDispatch()
|
const dispatch = useDispatch()
|
||||||
const translate = useTranslate()
|
const translate = useTranslate()
|
||||||
const [anchorEl, setAnchorEl] = useState(null)
|
const [anchorEl, setAnchorEl] = useState(null)
|
||||||
@@ -63,11 +64,17 @@ export const SongContextMenu = ({ record }) => {
|
|||||||
parentMenuOpen={open}
|
parentMenuOpen={open}
|
||||||
>
|
>
|
||||||
<AddToPlaylistMenu
|
<AddToPlaylistMenu
|
||||||
selectedIds={[record.id]}
|
selectedIds={[record.mediaFileId || record.id]}
|
||||||
onClose={() => setAnchorEl(null)}
|
onClose={handleClose}
|
||||||
|
onItemAdded={onAddToPlaylist}
|
||||||
/>
|
/>
|
||||||
</NestedMenuItem>
|
</NestedMenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SongContextMenu.propTypes = {
|
||||||
|
record: PropTypes.object,
|
||||||
|
onAddToPlaylist: PropTypes.func,
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user