import { useMemo } from 'react' import { useHistory } from 'react-router-dom' import { Datagrid, DatagridBody, DatagridRow, Filter, FunctionField, NumberField, SearchInput, SelectInput, TextField, useTranslate, NullableBooleanInput, usePermissions, } from 'react-admin' import { useMediaQuery, withWidth } from '@material-ui/core' import FavoriteIcon from '@material-ui/icons/Favorite' import FavoriteBorderIcon from '@material-ui/icons/FavoriteBorder' import { makeStyles } from '@material-ui/core/styles' import { useDrag } from 'react-dnd' import clsx from 'clsx' import { ArtistContextMenu, ArtworkAvatar, List, useGetHandleArtistClick, RatingField, useSelectedFields, useResourceRefresh, } from '../common' import config from '../config' import ArtistListActions from './ArtistListActions' import ArtistSimpleList from './ArtistSimpleList' import { DraggableTypes } from '../consts' import en from '../i18n/en.json' import { formatBytes } from '../utils/index.js' const useStyles = makeStyles({ contextHeader: { marginLeft: '3px', marginTop: '-2px', verticalAlign: 'text-top', }, row: { '& td': { paddingTop: '4px !important', paddingBottom: '4px !important', }, '&:hover': { '& $contextMenu': { visibility: 'visible', }, '& $ratingField': { visibility: 'visible', }, }, }, missingRow: { opacity: 0.3, }, contextMenu: { visibility: 'hidden', }, ratingField: { visibility: 'hidden', }, }) const ArtistFilter = (props) => { const translate = useTranslate() const { permissions } = usePermissions() const isAdmin = permissions === 'admin' const rolesObj = en?.resources?.artist?.roles const roles = Object.keys(rolesObj).reduce((acc, role) => { acc.push({ id: role, name: translate(`resources.artist.roles.${role}`, { smart_count: 2, }), }) return acc }, []) roles?.sort((a, b) => a.name.localeCompare(b.name)) return ( {config.enableFavourites && ( } /> )} {isAdmin && } ) } const ArtistDatagridRow = (props) => { const { record } = props const [, dragArtistRef] = useDrag( () => ({ type: DraggableTypes.ARTIST, item: { artistIds: [record?.id] }, options: { dropEffect: 'copy' }, }), [record], ) const classes = useStyles() const computedClasses = clsx( props.className, classes.row, record?.missing && classes.missingRow, ) return ( ) } const ArtistDatagridBody = (props) => ( } /> ) const ArtistDatagrid = (props) => ( } /> ) const ArtistListView = ({ hasShow, hasEdit, hasList, width, ...rest }) => { const { filterValues } = rest const classes = useStyles() const handleArtistLink = useGetHandleArtistClick(width) const history = useHistory() const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs')) useResourceRefresh('artist') const role = filterValues?.role const getCounter = (record, counter) => { if (!record) return undefined return role ? record?.stats?.[role]?.[counter] : record?.[counter] } const getAlbumCount = (record) => getCounter(record, 'albumCount') const getSongCount = (record) => getCounter(record, 'songCount') const getSize = (record) => { const size = getCounter(record, 'size') return size ? formatBytes(size) : '0 MB' } const toggleableFields = useMemo( () => ({ playCount: , rating: config.enableStarRating && ( ), }), [classes.ratingField], ) const columns = useSelectedFields({ resource: 'artist', columns: toggleableFields, }) return isXsmall ? ( history.push(handleArtistLink(id))} {...rest} /> ) : ( {columns} ) } /> ) } const ArtistList = (props) => { return ( <> } filterDefaultValues={{ role: 'albumartist' }} actions={} > ) } const ArtistListWithWidth = withWidth()(ArtistList) export default ArtistListWithWidth