/*! * Copyright (c) Microsoft. All rights reserved. * Licensed under the MIT license. See LICENSE file in the project. */ import { Sparkbar } from '@essex/charts-react' import { TooltipHost, useTheme } from '@fluentui/react' import { memo, useCallback, useMemo, useState } from 'react' import { EMPTY_ARRAY } from '../../../empty.js' import { useCellDimensions } from '../hooks/index.js' import { useCalloutProps, useCategories, useHandleBarHoverHandler, useLegend, useStyles, useTooltip, } from './HistogramColumnHeader.hooks.js' import type { RichHeaderProps } from './types.js' /** * Renders a histogram for column values in the header. * For numbers it will use the bin partitioning. * For strings it will be the unique counts (if categories exist). */ export const HistogramColumnHeader: React.FC = memo( function HistogramColumnHeader({ field, metadata, color, ...props }) { const { column, onSelect, disabled } = props const dimensions = useCellDimensions(column, false) const theme = useTheme() const _color = useMemo((): string | undefined => { return disabled ? theme.palette.neutralTertiary : color }, [color, disabled, theme]) const categorical = field.type === 'string' const bins = categorical ? metadata?.categories : metadata?.bins const values = useMemo( () => (bins ?? EMPTY_ARRAY).map((b) => b.count), [bins], ) const categories = useCategories(metadata, categorical) const title = useTooltip(categories) const legend = useLegend(categories) const [hover, setHover] = useState() const [id, setId] = useState() const handleBarHover = useHandleBarHoverHandler(legend, setId, setHover) const styles = useStyles(dimensions, Boolean(onSelect)) const enough = metadata?.distinct || 0 const calloutProps = useCalloutProps(id) const handleOnClick = useCallback( (e: React.MouseEvent) => !disabled && onSelect?.(e, column), [column, onSelect, disabled], ) return (
{enough > 1 && bins ? (
) : null}
) }, )