import React, { useMemo } from 'react' import { Datagrid, EditButton, Filter, NullableBooleanInput, NumberField, ReferenceInput, SearchInput, SelectInput, TextField, useUpdate, useNotify, useRecordContext, BulkDeleteButton, usePermissions, } from 'react-admin' import Switch from '@material-ui/core/Switch' import { makeStyles } from '@material-ui/core/styles' import { useMediaQuery } from '@material-ui/core' import { DateField, ArtworkAvatar, DurationField, List, LoveButton, Writable, isWritable, useSelectedFields, useResourceRefresh, } from '../common' import FavoriteIcon from '@material-ui/icons/Favorite' import config from '../config' import PlaylistListActions from './PlaylistListActions' import ChangePublicStatusButton from './ChangePublicStatusButton' const useStyles = makeStyles((theme) => ({ button: { color: theme.palette.type === 'dark' ? 'white' : undefined, }, // RA's layout root is min-width: fit-content; capping the card keeps the page width content: { [theme.breakpoints.down('xs')]: { overflowX: 'auto', maxWidth: '100vw', }, }, name: { [theme.breakpoints.down('xs')]: { overflowWrap: 'anywhere', }, }, })) const PlaylistFilter = (props) => { const { permissions } = usePermissions() return ( {permissions === 'admin' && ( )} {config.enableFavourites && ( } /> )} ) } export const ToggleField = ({ resource, source }) => { const record = useRecordContext() const notify = useNotify() const [toggle] = useUpdate( resource, record?.id, { ...record, [source]: !record?.[source], }, { undoable: false, onFailure: (error) => { notify('ra.page.error', 'warning') }, }, ) const handleClick = (e) => { toggle() e.stopPropagation() } if (!record) return null return ( ) } export const ToggleAutoImport = (props) => { const record = useRecordContext() return record?.path ? : null } const PlaylistListBulkActions = (props) => { const classes = useStyles() return ( <> ) } // Datagrid reads `source`/`sortable`/`label` off this element for the column // header; only record/resource are forwarded so they never leak onto the button. export const PlaylistLove = ({ record, className }) => ( ) PlaylistLove.defaultProps = { source: 'starred', sortable: false } const PlaylistList = (props) => { const classes = useStyles() const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs')) const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md')) useResourceRefresh('playlist') const toggleableFields = useMemo( () => ({ ownerName: isDesktop && , songCount: !isXsmall && , duration: , updatedAt: isDesktop && ( ), public: !isXsmall && , comment: , sync: !isXsmall && ( ), starred: config.enableFavourites && , }), [isDesktop, isXsmall], ) const columns = useSelectedFields({ resource: 'playlist', columns: toggleableFields, defaultOff: ['comment'], }) return ( } actions={} bulkActionButtons={!isXsmall && } > isWritable(r?.ownerId)}> {columns} ) } export default PlaylistList