import { useLayoutEffect, useRef, useState } from 'react'; import { Table, Thead, Tr, Th, Tbody, Td, InnerScrollContainer } from '@patternfly/react-table'; import RhUiBlueprintIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-blueprint-icon'; interface Fact { name: string; state: string; detail1: string; detail2: string; detail3: string; detail4: string; detail5: string; detail6: string; detail7: string; } const useIsStuckFromScrollParent = ({ shouldTrack, scrollParentRef }: { /** Indicates whether to track the scroll top position of the scroll parent element */ shouldTrack: boolean; /** Reference to the scroll parent element */ scrollParentRef: React.RefObject; }): boolean => { const [isStuck, setIsStuck] = useState(false); useLayoutEffect(() => { if (!shouldTrack) { setIsStuck(false); return; } const scrollElement = scrollParentRef.current; if (!scrollElement) { setIsStuck(false); return; } const syncFromScroll = () => { setIsStuck(scrollElement.scrollTop > 0); }; syncFromScroll(); scrollElement.addEventListener('scroll', syncFromScroll, { passive: true }); return () => scrollElement.removeEventListener('scroll', syncFromScroll); }, [shouldTrack, scrollParentRef]); return isStuck; }; export const TableStickyHeaderDynamic: React.FunctionComponent = () => { const scrollContainerRef = useRef(null); const isStuck = useIsStuckFromScrollParent({ shouldTrack: true, scrollParentRef: scrollContainerRef }); // In real usage, this data would come from some external source like an API via props. const facts: Fact[] = Array.from({ length: 9 }, (_, index) => ({ name: `Fact ${index + 1}`, state: `State ${index + 1}`, detail1: `Test cell ${index + 1}-3`, detail2: `Test cell ${index + 1}-4`, detail3: `Test cell ${index + 1}-5`, detail4: `Test cell ${index + 1}-6`, detail5: `Test cell ${index + 1}-7`, detail6: `Test cell ${index + 1}-8`, detail7: `Test cell ${index + 1}-9` })); const columnNames = { name: 'Fact', state: 'State', header3: 'Header 3', header4: 'Header 4', header5: 'Header 5', header6: 'Header 6', header7: 'Header 7', header8: 'Header 8', header9: 'Header 9' }; return (
{facts.map((fact) => ( ))}
{columnNames.name} {columnNames.state} {columnNames.header3} {columnNames.header4} {columnNames.header5} {columnNames.header6} {columnNames.header7} {columnNames.header8} {columnNames.header9}
{fact.name} {` ${fact.state}`} {fact.detail1} {fact.detail2} {fact.detail3} {fact.detail4} {fact.detail5} {fact.detail6} {fact.detail7}
); };