import React, { useMemo } from 'react'import {BulkActionsToolbar,FunctionField,ListToolbar,NumberField,TextField,useListContext,useVersion,} from 'react-admin'import clsx from 'clsx'import { useDispatch } from 'react-redux'import { Card, useMediaQuery } from '@material-ui/core'import { makeStyles } from '@material-ui/core/styles'import FavoriteBorderIcon from '@material-ui/icons/FavoriteBorder'import { playTracks } from '../actions'import {ArtistLinkField,DateField,DurationField,QualityInfo,RatingField,SizeField,SongBulkActions,SongContextMenu,SongDatagrid,SongInfo,SongTitleField,useResourceRefresh,useSelectedFields,} from '../common'import config from '../config'import ExpandInfoDialog from '../dialogs/ExpandInfoDialog'import { removeAlbumCommentsFromSongs } from './utils.js'const useStyles = makeStyles((theme) => ({root: {},main: {display: 'flex',},content: {marginTop: 0,transition: theme.transitions.create('margin-top'),position: 'relative',flex: '1 1 auto',[theme.breakpoints.down('xs')]: {boxShadow: 'none',},},bulkActionsDisplayed: {marginTop: -theme.spacing(8),transition: theme.transitions.create('margin-top'),},actions: {zIndex: 2,display: 'flex',justifyContent: 'flex-end',flexWrap: 'wrap',},noResults: { padding: 20 },columnIcon: {marginLeft: '3px',marginTop: '-2px',verticalAlign: 'text-top',},toolbar: {justifyContent: 'flex-start',},row: {'&:hover': {'& $contextMenu': {visibility: 'visible',},'& $ratingField': {visibility: 'visible',},},},contextMenu: {visibility: (props) => (props.isDesktop ? 'hidden' : 'visible'),},ratingField: {visibility: 'hidden',},}),{ name: 'RaList' },)const AlbumSongs = (props) => {const { data, ids } = propsconst isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))const classes = useStyles({ isDesktop })const dispatch = useDispatch()const version = useVersion()useResourceRefresh('song', 'album')const toggleableFields = useMemo(() => {return {trackNumber: isDesktop && (<TextField source="trackNumber" label="#" sortable={false} />),title: (<SongTitleFieldsource="title"sortable={false}showTrackNumbers={!isDesktop}/>),artist: isDesktop && <ArtistLinkField source="artist" sortable={false} />,composer: isDesktop && (<ArtistLinkField source="composer" sortable={false} />),duration: <DurationField source="duration" sortable={false} />,year: isDesktop && (<FunctionFieldsource="year"render={(r) => r.year || ''}sortable={false}/>),playCount: isDesktop && (<NumberField source="playCount" sortable={false} />),playDate: <DateField source="playDate" sortable={false} showTime />,quality: isDesktop && <QualityInfo source="quality" sortable={false} />,size: isDesktop && <SizeField source="size" sortable={false} />,channels: isDesktop && <NumberField source="channels" sortable={false} />,bpm: isDesktop && <NumberField source="bpm" sortable={false} />,genre: <TextField source="genre" sortable={false} />,mood: isDesktop && (<FunctionFieldsource="mood"render={(r) => r.tags?.mood?.[0] ?? ''}sortable={false}/>),rating: isDesktop && config.enableStarRating && (<RatingFieldresource={'song'}source="rating"sortable={false}className={classes.ratingField}/>),}}, [isDesktop, classes.ratingField])const columns = useSelectedFields({resource: 'albumSong',columns: toggleableFields,omittedColumns: ['title'],defaultOff: ['composer','channels','bpm','year','playCount','playDate','size','mood','genre',],})const bulkActionsLabel = isDesktop? 'ra.action.bulk_actions': 'ra.action.bulk_actions_mobile'return (<><ListToolbarclasses={{ toolbar: classes.toolbar }}actions={props.actions}{...props}/><div className={classes.main}><CardclassName={clsx(classes.content, {[classes.bulkActionsDisplayed]: props.selectedIds.length > 0,})}key={version}><BulkActionsToolbar {...props} label={bulkActionsLabel}><SongBulkActions /></BulkActionsToolbar><SongDatagridrowClick={(id) => dispatch(playTracks(data, ids, id))}{...props}hasBulkActions={true}showDiscSubtitles={true}contextAlwaysVisible={!isDesktop}classes={{ row: classes.row }}>{columns}<SongContextMenusource={'starred'}sortable={false}className={classes.contextMenu}label={config.enableFavourites && (<FavoriteBorderIconfontSize={'small'}className={classes.columnIcon}/>)}/></SongDatagrid></Card></div><ExpandInfoDialog content={<SongInfo />} /></>)}const SanitizedAlbumSongs = (props) => {removeAlbumCommentsFromSongs(props)const { loaded, loading, total, ...rest } = useListContext(props)return <>{loaded && <AlbumSongs {...rest} actions={props.actions} />}</>}export default SanitizedAlbumSongs