diff --git a/packages/react-core/src/helpers/Popper/Popper.tsx b/packages/react-core/src/helpers/Popper/Popper.tsx index e1b5677bf80..0a259de0e76 100644 --- a/packages/react-core/src/helpers/Popper/Popper.tsx +++ b/packages/react-core/src/helpers/Popper/Popper.tsx @@ -376,12 +376,16 @@ export const Popper: React.FunctionComponent = ({ return ( <> - {!triggerRef && trigger && React.isValidElement(trigger) && ( + + {!reference && trigger && React.isValidElement(trigger) && ( +
setTriggerElement(node?.firstElementChild as HTMLElement)}> {trigger}
)} - {triggerRef && trigger && React.isValidElement(trigger) && trigger} + + {reference && trigger && React.isValidElement(trigger) && trigger} + {ready && isVisible && getPopper()} ); diff --git a/packages/react-table/src/components/Table/HeaderCell.tsx b/packages/react-table/src/components/Table/HeaderCell.tsx index fc6c77d6bec..5199247d484 100644 --- a/packages/react-table/src/components/Table/HeaderCell.tsx +++ b/packages/react-table/src/components/Table/HeaderCell.tsx @@ -33,6 +33,7 @@ export const HeaderCell: React.FunctionComponent = ({ scope={scope} tooltip={tooltip} onMouseEnter={onMouseEnter} + focusable={false} textCenter={textCenter} component={component} className={className} diff --git a/packages/react-table/src/components/Table/SortColumn.tsx b/packages/react-table/src/components/Table/SortColumn.tsx index 93f0a16a417..1526a533aee 100644 --- a/packages/react-table/src/components/Table/SortColumn.tsx +++ b/packages/react-table/src/components/Table/SortColumn.tsx @@ -29,6 +29,7 @@ export const SortColumn: React.FunctionComponent = ({ ...props }: SortColumnProps) => { let SortedByIcon; + const [focused, setFocused] = React.useState(false); if (isSortedBy) { SortedByIcon = sortDirection === SortByDirection.asc ? LongArrowAltUpIcon : LongArrowAltDownIcon; } else { @@ -39,10 +40,12 @@ export const SortColumn: React.FunctionComponent = ({ {...props} type={type} className={css(className, styles.tableButton)} - onClick={event => onSort && onSort(event)} + onClick={(event) => onSort && onSort(event)} + onFocus={() => setFocused(true)} + onBlur={() => setFocused(false)} >
- {children} + {children} diff --git a/packages/react-table/src/components/Table/TableText.tsx b/packages/react-table/src/components/Table/TableText.tsx index 993ad35ea58..194e96839db 100644 --- a/packages/react-table/src/components/Table/TableText.tsx +++ b/packages/react-table/src/components/Table/TableText.tsx @@ -31,6 +31,8 @@ export interface TableTextProps extends React.HTMLProps { tooltipProps?: Omit; /** callback used to create the tooltip if text is truncated */ onMouseEnter?: (event: any) => void; + + focused?: boolean; } export const TableText: React.FunctionComponent = ({ @@ -41,10 +43,13 @@ export const TableText: React.FunctionComponent = ({ tooltip: tooltipProp = '', tooltipProps = {}, onMouseEnter: onMouseEnterProp = () => {}, + focused = false, ...props }: TableTextProps) => { const Component: TableTextVariant | 'span' | 'div' = variant; - const textRef = React.createRef(); + + const textRef = React.createRef(); + const [tooltip, setTooltip] = React.useState(''); const onMouseEnter = (event: any) => { @@ -56,10 +61,22 @@ export const TableText: React.FunctionComponent = ({ onMouseEnterProp(event); }; + const onFocus = (element: HTMLElement) => { + if (element.offsetWidth < element.scrollWidth) { + setTooltip(tooltipProp || element.innerText); + } else { + setTooltip(''); + } + }; + const text = ( } + + onMouseEnter={onMouseEnter} + className={css(className, wrapModifier && styles.modifiers[wrapModifier], styles.tableText)} {...props} > @@ -67,8 +84,18 @@ export const TableText: React.FunctionComponent = ({ ); + React.useEffect(() => { + if (focused) { + onFocus(textRef.current); + } else { + setTooltip(''); + } + }, [focused]); + return tooltip !== '' ? ( - + + + {text} ) : ( diff --git a/packages/react-table/src/components/TableComposable/Td.tsx b/packages/react-table/src/components/TableComposable/Td.tsx index f38a586966c..d436e0764fe 100644 --- a/packages/react-table/src/components/TableComposable/Td.tsx +++ b/packages/react-table/src/components/TableComposable/Td.tsx @@ -96,14 +96,18 @@ const TdBase: React.FunctionComponent = ({ ...props }: TdProps) => { const [showTooltip, setShowTooltip] = React.useState(false); + + const [truncated, setTruncated] = React.useState(false); const cellRef = innerRef ? innerRef : React.createRef(); + const onMouseEnter = (event: any) => { if (event.target.offsetWidth < event.target.scrollWidth) { !showTooltip && setShowTooltip(true); } else { showTooltip && setShowTooltip(false); } + onMouseEnterProp(event); }; @@ -246,9 +250,19 @@ const TdBase: React.FunctionComponent = ({ (className && className.includes('pf-c-table__tree-view-title-cell')) || (mergedClassName && mergedClassName.includes('pf-c-table__tree-view-title-cell')); + React.useEffect(() => { + setTruncated( + (cellRef as React.RefObject).current.offsetWidth < + (cellRef as React.RefObject).current.scrollWidth + ); + }, [cellRef]); + const cell = ( setShowTooltip(false)} onMouseEnter={tooltip !== null ? onMouseEnter : onMouseEnterProp} className={css( className, @@ -278,9 +292,16 @@ const TdBase: React.FunctionComponent = ({ const canMakeDefaultTooltip = tooltip === '' ? typeof children === 'string' : true; return tooltip !== null && canMakeDefaultTooltip && showTooltip ? ( - } content={tooltip || (tooltip === '' && children)} isVisible> + + <> + {cell} - + } + content={tooltip || (tooltip === '' && children)} + isVisible + /> + ) : ( cell ); diff --git a/packages/react-table/src/components/TableComposable/Th.tsx b/packages/react-table/src/components/TableComposable/Th.tsx index 8b768c6da1f..298f752975b 100644 --- a/packages/react-table/src/components/TableComposable/Th.tsx +++ b/packages/react-table/src/components/TableComposable/Th.tsx @@ -52,6 +52,8 @@ export interface ThProps stickyLeftOffset?: string; /** Indicates the is part of a subheader of a nested header */ isSubheader?: boolean; + + focusable?: boolean; } const ThBase: React.FunctionComponent = ({ @@ -76,9 +78,13 @@ const ThBase: React.FunctionComponent = ({ stickyMinWidth = '120px', stickyLeftOffset, isSubheader = false, + focusable = true, ...props }: ThProps) => { const [showTooltip, setShowTooltip] = React.useState(false); + + const [truncated, setTruncated] = React.useState(false); + const cellRef = innerRef ? innerRef : React.createRef(); const onMouseEnter = (event: any) => { if (event.target.offsetWidth < event.target.scrollWidth) { @@ -160,8 +166,18 @@ const ThBase: React.FunctionComponent = ({ ...mergedProps } = merged; + React.useEffect(() => { + setTruncated( + (cellRef as React.RefObject).current.offsetWidth < + (cellRef as React.RefObject).current.scrollWidth + ); + }, [cellRef]); + const cell = ( setShowTooltip(false)} data-label={dataLabel} onMouseEnter={tooltip !== null ? onMouseEnter : onMouseEnterProp} scope={component === 'th' && children ? scope : null} @@ -191,9 +207,16 @@ const ThBase: React.FunctionComponent = ({ const canMakeDefaultTooltip = tooltip === '' ? typeof transformedChildren === 'string' : true; return tooltip !== null && canMakeDefaultTooltip && showTooltip ? ( - } content={tooltip || (tooltip === '' && children)} isVisible> + + <> + {cell} - + } + content={tooltip || (tooltip === '' && children)} + isVisible + /> + ) : ( cell );