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,CoverArtAvatar,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?.rolesconst 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 (<Filter {...props} variant={'outlined'}><SearchInput id="search" source="name" alwaysOn /><SelectInput source="role" choices={roles} alwaysOn />{config.enableFavourites && (<NullableBooleanInputsource="starred"label={<FavoriteIcon fontSize={'small'} />}/>)}{isAdmin && <NullableBooleanInput source="missing" />}</Filter>)}const ArtistDatagridRow = (props) => {const { record } = propsconst [, 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 (<DatagridRow ref={dragArtistRef} {...props} className={computedClasses} />)}const ArtistDatagridBody = (props) => (<DatagridBody {...props} row={<ArtistDatagridRow />} />)const ArtistDatagrid = (props) => (<Datagrid {...props} body={<ArtistDatagridBody />} />)const ArtistListView = ({ hasShow, hasEdit, hasList, width, ...rest }) => {const { filterValues } = restconst classes = useStyles()const handleArtistLink = useGetHandleArtistClick(width)const history = useHistory()const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))useResourceRefresh('artist')const role = filterValues?.roleconst getCounter = (record, counter) => {if (!record) return undefinedreturn 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: <NumberField source="playCount" sortByOrder={'DESC'} />,rating: config.enableStarRating && (<RatingFieldsource="rating"sortByOrder={'DESC'}resource={'artist'}className={classes.ratingField}/>),}),[classes.ratingField],)const columns = useSelectedFields({resource: 'artist',columns: toggleableFields,})return isXsmall ? (<ArtistSimpleListlinkType={(id) => history.push(handleArtistLink(id))}{...rest}/>) : (<ArtistDatagrid rowClick={handleArtistLink} classes={{ row: classes.row }}><CoverArtAvatar source="id" /><TextField source="name" /><FunctionFieldsource="albumCount"sortByOrder={'DESC'}render={getAlbumCount}/><FunctionFieldsource="songCount"sortByOrder={'DESC'}render={getSongCount}/><FunctionField source="size" sortByOrder={'DESC'} render={getSize} />{columns}<ArtistContextMenusource={'starred_at'}sortByOrder={'DESC'}sortable={config.enableFavourites}className={classes.contextMenu}label={config.enableFavourites && (<FavoriteBorderIconfontSize={'small'}className={classes.contextHeader}/>)}/></ArtistDatagrid>)}const ArtistList = (props) => {return (<><List{...props}sort={{ field: 'name', order: 'ASC' }}exporter={false}bulkActionButtons={false}filters={<ArtistFilter />}filterDefaultValues={{ role: 'albumartist' }}actions={<ArtistListActions />}><ArtistListView {...props} /></List></>)}const ArtistListWithWidth = withWidth()(ArtistList)export default ArtistListWithWidth