UNPKG

@workday/canvas-kit-docs

Version:

Documentation components of Canvas Kit components

56 lines (55 loc) 2.37 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import * as React from 'react'; import { getTransformFromPlacement, Popper } from '@workday/canvas-kit-react/popup'; import { mergeCallback } from '@workday/canvas-kit-react/common'; import { TooltipContainer, useTooltip } from '@workday/canvas-kit-react/tooltip'; const isOverflowed = (element) => { return (element.textContent || '').includes('more'); }; function mergeCallbacks(elemProps, componentProps, keys = Object.keys(componentProps)) { return keys.reduce((mergedProps, key) => { if (typeof elemProps[key] === 'function') { mergedProps[key] = mergeCallback(componentProps[key], elemProps[key]); } else { mergedProps[key] = componentProps[key]; } return mergedProps; }, {}); } function getTooltipContents(title) { if (title instanceof Array) { if (title.length && title[0].value) { return title.map(v => v.value).join(', '); } } return ''; } export const MoreTooltip = ({ placement = 'top', children, title, ...elemProps }) => { const [titleText, setTitleText] = React.useState(''); const { targetProps, popperProps, tooltipProps } = useTooltip({ type: 'describe' }); const onMouseEnter = (event) => { const target = event.currentTarget; setTitleText(getTooltipContents(title)); if (isOverflowed(target)) { targetProps.onMouseEnter(event); } }; const onFocus = (event) => { const target = event.currentTarget; setTitleText(getTooltipContents(title)); if (isOverflowed(target)) { targetProps.onFocus(event); } }; return (_jsxs(React.Fragment, { children: [React.cloneElement(children, { ...targetProps, onMouseEnter, onFocus, 'aria-label': undefined, ...mergeCallbacks({ ...targetProps, onMouseEnter, onFocus }, children.props), }), _jsx(Popper, { placement: placement, ...popperProps, children: ({ placement }) => { const transformOrigin = getTransformFromPlacement(placement); return (_jsx(TooltipContainer, { transformOrigin: transformOrigin, ...tooltipProps, ...elemProps, children: titleText })); } })] })); };