mirror of
https://github.com/navidrome/navidrome.git
synced 2025-04-13 10:47:19 +03:00
* feat: create vite project * feat: it's alive! * feat: `make dev` working! * feat: replace custom serviceWorker with vite plugin * test: replace Jest with Vitest * fix: run prettier * fix: skip eslint for now. * chore: remove ui.old folder * refactor: replace lodash.pick with simple destructuring * fix: eslint errors (wip) * fix: eslint errors (wip) * fix: display-name eslint errors (wip) * fix: no-console eslint errors (wip) * fix: react-refresh/only-export-components eslint errors (wip) * fix: react-refresh/only-export-components eslint errors (wip) * fix: react-refresh/only-export-components eslint errors (wip) * fix: react-refresh/only-export-components eslint errors (wip) * fix: build * fix: pwa manifest * refactor: pwa manifest * refactor: simplify PORT configuration * refactor: rename simple JS files * test: cover playlistUtils * fix: react-image-lightbox * feat(ui): add sourcemaps to help debug issues
133 lines
3.7 KiB
JavaScript
133 lines
3.7 KiB
JavaScript
import React from 'react'
|
|
import PropTypes from 'prop-types'
|
|
import List from '@material-ui/core/List'
|
|
import ListItem from '@material-ui/core/ListItem'
|
|
import ListItemIcon from '@material-ui/core/ListItemIcon'
|
|
import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'
|
|
import ListItemText from '@material-ui/core/ListItemText'
|
|
import { makeStyles } from '@material-ui/core/styles'
|
|
import { sanitizeListRestProps } from 'react-admin'
|
|
import { DurationField, SongContextMenu, RatingField } from './index'
|
|
import { setTrack } from '../actions'
|
|
import { useDispatch } from 'react-redux'
|
|
import config from '../config'
|
|
|
|
const useStyles = makeStyles(
|
|
{
|
|
link: {
|
|
textDecoration: 'none',
|
|
color: 'inherit',
|
|
},
|
|
listItem: {
|
|
padding: '10px',
|
|
},
|
|
title: {
|
|
paddingRight: '10px',
|
|
width: '80%',
|
|
},
|
|
secondary: {
|
|
marginTop: '-3px',
|
|
width: '96%',
|
|
display: 'flex',
|
|
alignItems: 'flex-start',
|
|
justifyContent: 'space-between',
|
|
},
|
|
artist: {
|
|
paddingRight: '30px',
|
|
},
|
|
timeStamp: {
|
|
float: 'right',
|
|
color: '#fff',
|
|
fontWeight: '200',
|
|
opacity: 0.6,
|
|
fontSize: '12px',
|
|
padding: '2px',
|
|
},
|
|
rightIcon: {
|
|
top: '26px',
|
|
},
|
|
},
|
|
{ name: 'RaSongSimpleList' },
|
|
)
|
|
|
|
export const SongSimpleList = ({
|
|
basePath,
|
|
className,
|
|
classes: classesOverride,
|
|
data,
|
|
hasBulkActions,
|
|
ids,
|
|
loading,
|
|
onToggleItem,
|
|
selectedIds,
|
|
total,
|
|
...rest
|
|
}) => {
|
|
const dispatch = useDispatch()
|
|
const classes = useStyles({ classes: classesOverride })
|
|
return (
|
|
(loading || total > 0) && (
|
|
<List className={className} {...sanitizeListRestProps(rest)}>
|
|
{ids.map(
|
|
(id) =>
|
|
data[id] && (
|
|
<span key={id} onClick={() => dispatch(setTrack(data[id]))}>
|
|
<ListItem className={classes.listItem} button={true}>
|
|
<ListItemText
|
|
primary={
|
|
<div className={classes.title}>{data[id].title}</div>
|
|
}
|
|
secondary={
|
|
<>
|
|
<span className={classes.secondary}>
|
|
<span className={classes.artist}>
|
|
{data[id].artist}
|
|
</span>
|
|
<span className={classes.timeStamp}>
|
|
<DurationField
|
|
record={data[id]}
|
|
source={'duration'}
|
|
/>
|
|
</span>
|
|
</span>
|
|
{config.enableStarRating && (
|
|
<RatingField
|
|
record={data[id]}
|
|
source={'rating'}
|
|
resource={'song'}
|
|
size={'small'}
|
|
/>
|
|
)}
|
|
</>
|
|
}
|
|
/>
|
|
<ListItemSecondaryAction className={classes.rightIcon}>
|
|
<ListItemIcon>
|
|
<SongContextMenu record={data[id]} visible={true} />
|
|
</ListItemIcon>
|
|
</ListItemSecondaryAction>
|
|
</ListItem>
|
|
</span>
|
|
),
|
|
)}
|
|
</List>
|
|
)
|
|
)
|
|
}
|
|
|
|
SongSimpleList.propTypes = {
|
|
basePath: PropTypes.string,
|
|
className: PropTypes.string,
|
|
classes: PropTypes.object,
|
|
data: PropTypes.object,
|
|
hasBulkActions: PropTypes.bool.isRequired,
|
|
ids: PropTypes.array,
|
|
onToggleItem: PropTypes.func,
|
|
selectedIds: PropTypes.arrayOf(PropTypes.any).isRequired,
|
|
}
|
|
|
|
SongSimpleList.defaultProps = {
|
|
hasBulkActions: false,
|
|
selectedIds: [],
|
|
}
|