import React, { ReactNode, useEffect, useRef, useState } from 'react'; import HoverInfo from '../../../components/hoverInfo/hoverInfo'; import cx from 'classnames'; import { Alignment, ColumnHeader, DataTableRow } from './dataTable.types'; import * as Cells from './dataTableCells'; import AutoDataTableService, { columnWidth } from './dataTable.helper'; import * as Text from 'app/shared/components/text/text'; interface StandardContainerProps { children: ReactNode; extraClass?: string; } const ScrollableContainer = ({ children, extraClass }: StandardContainerProps) => { const [ isScrollIndicatorVisible, setScrollIndicatorVisibility ] = useState(false); const scrollContainerRef = useRef(null); const [ isScrollIndicatorIconVisible, setScrollIndicatorIconVisibility ] = useState(true); const subContainerClassName = 'c-data-table-container__responsive-size--xl'; const containerClassName = cx('c-data-table-container', 'c-data-table-container--scrollable', 'c-data-table-container__scroll-indicator--padded', extraClass ); useEffect(() => { if (scrollContainerRef.current?.scrollWidth !== scrollContainerRef.current?.clientWidth) { setScrollIndicatorVisibility(true); } }, [ scrollContainerRef ]); const handleScroll = (event) => { if (event.target.scrollLeft === 0 && !isScrollIndicatorIconVisible) { setScrollIndicatorIconVisibility(true); } else if (isScrollIndicatorIconVisible) { setScrollIndicatorIconVisibility(false); } if (event.target.scrollWidth - event.target.clientWidth === event.target.scrollLeft && isScrollIndicatorVisible) { setScrollIndicatorVisibility(false); } else if (!isScrollIndicatorVisible) { setScrollIndicatorVisibility(true); } }; return
{children}
{isScrollIndicatorVisible &&
{isScrollIndicatorIconVisible &&
}
}
; }; const HeaderRow = ({ children }: StandardContainerProps) => (
{children}
); interface HeaderRowColumnProps { text: string; subtext?: string; width?: number; description?: string; align?: Alignment; onClick?: () => void; isColumnSorted: boolean; defaultColumnWidth: number; isAscendingOrder: boolean; } const HeaderRowColumn = ({ text, subtext, isColumnSorted, defaultColumnWidth, isAscendingOrder, width, description, align = 'left', onClick, }: HeaderRowColumnProps) => { return (
{text} {Boolean(onClick) && } { subtext && {subtext} } { description && {description} }
); }; const DataRow = ({ children, onClick, item, clickable = false, extraClass }: DataTableRow) => { return (
onClick ? onClick(item!) : null}> {children}
); }; interface ColumnsHeaderProps { headers: ColumnHeader[]; } const ColumnsHeader = ({ headers }: ColumnsHeaderProps) => (
{ headers.map((item, index) => (
{item.text}
)) }
); export { ScrollableContainer, HeaderRow, HeaderRowColumn, DataRow, Cells, ColumnsHeader, };