diff --git a/ui/src/album/AlbumGridView.jsx b/ui/src/album/AlbumGridView.jsx index 58732bbde..b7db39730 100644 --- a/ui/src/album/AlbumGridView.jsx +++ b/ui/src/album/AlbumGridView.jsx @@ -13,7 +13,12 @@ import { linkToRecord, useListContext, Loading } from 'react-admin' import { withContentRect } from 'react-measure' import { useDrag } from 'react-dnd' import subsonic from '../subsonic' -import { AlbumContextMenu, PlayButton, ArtistLinkField } from '../common' +import { + AlbumContextMenu, + PlayButton, + ArtistLinkField, + OverflowTooltip, +} from '../common' import { DraggableTypes } from '../consts' import clsx from 'clsx' import { AlbumDatesField } from './AlbumDatesField.jsx' @@ -198,7 +203,9 @@ const AlbumGridTile = ({ showArtist, record, basePath, ...props }) => { to={linkToRecord(basePath, record.id, 'show')} > - {record.name} + + {record.name} + {record.tags && record.tags['albumversion'] && ( {record.tags['albumversion']} diff --git a/ui/src/common/OverflowTooltip.jsx b/ui/src/common/OverflowTooltip.jsx new file mode 100644 index 000000000..1d05c9077 --- /dev/null +++ b/ui/src/common/OverflowTooltip.jsx @@ -0,0 +1,46 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { Tooltip } from '@material-ui/core' +import useMenuTooltipStyles from './useMenuTooltipStyles' + +export const OverflowTooltip = ({ + children, + title, + placement = 'bottom-start', +}) => { + const classes = useMenuTooltipStyles() + const textRef = React.useRef(null) + const [isOverflowing, setIsOverflowing] = React.useState(false) + + React.useLayoutEffect(() => { + const el = textRef.current + if (!el) return + + const checkOverflow = () => + setIsOverflowing(el.scrollWidth > el.clientWidth) + + checkOverflow() + window.addEventListener('resize', checkOverflow) + + return () => window.removeEventListener('resize', checkOverflow) + }, [title, children]) + + return ( + + {React.cloneElement(children, { ref: textRef })} + + ) +} + +OverflowTooltip.propTypes = { + children: PropTypes.element.isRequired, + title: PropTypes.string.isRequired, + placement: PropTypes.string, +} diff --git a/ui/src/common/index.js b/ui/src/common/index.js index f64d4fe0c..9bba49ec5 100644 --- a/ui/src/common/index.js +++ b/ui/src/common/index.js @@ -41,3 +41,4 @@ export * from './formatRange.js' export * from './playlistUtils.js' export * from './PathField.jsx' export * from './ParticipantsInfo' +export * from './OverflowTooltip' diff --git a/ui/src/common/useMenuTooltipStyles.js b/ui/src/common/useMenuTooltipStyles.js new file mode 100644 index 000000000..46b89ba68 --- /dev/null +++ b/ui/src/common/useMenuTooltipStyles.js @@ -0,0 +1,20 @@ +import { makeStyles } from '@material-ui/core/styles' + +const useMenuTooltipStyles = makeStyles((theme) => { + const paperRoot = theme.overrides?.MuiPaper?.root || {} + + return { + tooltip: { + backgroundColor: + paperRoot.backgroundColor || theme.palette.background.paper, + color: paperRoot.color || theme.palette.text.primary, + boxShadow: theme.shadows[8], + borderRadius: theme.shape.borderRadius, + ...theme.typography.body1, + padding: theme.spacing(1, 2), + maxWidth: '30vw', + }, + } +}) + +export default useMenuTooltipStyles diff --git a/ui/src/layout/PlaylistsSubMenu.jsx b/ui/src/layout/PlaylistsSubMenu.jsx index a9f70b875..b94bebf86 100644 --- a/ui/src/layout/PlaylistsSubMenu.jsx +++ b/ui/src/layout/PlaylistsSubMenu.jsx @@ -12,7 +12,7 @@ import QueueMusicOutlinedIcon from '@material-ui/icons/QueueMusicOutlined' import { BiCog } from 'react-icons/bi' import { useDrop } from 'react-dnd' import SubMenu from './SubMenu' -import { canChangeTracks } from '../common' +import { canChangeTracks, OverflowTooltip } from '../common' import { DraggableTypes } from '../consts' import config from '../config' @@ -39,9 +39,11 @@ const PlaylistMenuItemLink = ({ pls, sidebarIsOpen }) => { - {pls.name} - + + + {pls.name} + + } sidebarIsOpen={sidebarIsOpen} dense={false}