import styled from 'styled-components'; import { useChartLegend } from './ChartLegendWrapper'; import { Text, TextVariant } from '../../text/Text.component'; import { chartColors, CoreUITheme } from '../../../style/theme'; import { useCallback } from 'react'; type ChartLegendProps = { shape: 'line' | 'rectangle'; disabled?: boolean; direction?: 'horizontal' | 'vertical'; legendSize?: TextVariant; legendColor?: keyof CoreUITheme; }; const Legend = styled.div<{ direction: 'horizontal' | 'vertical' }>` display: flex; flex-direction: ${({ direction }) => direction === 'horizontal' ? 'row' : 'column'}; gap: ${({ direction }) => (direction === 'horizontal' ? '16px' : '8px')}; flex-wrap: wrap; `; export const LegendItem = styled.div<{ disabled?: boolean; selected?: boolean; }>` display: flex; align-items: center; gap: 8px; cursor: ${({ disabled }) => (disabled ? 'not-allowed' : 'pointer')}; opacity: ${({ selected, disabled }) => (disabled ? 0.5 : selected ? 1 : 0.7)}; transition: opacity 0.2s ease; &:hover { opacity: ${({ disabled }) => (disabled ? 0.5 : 1)}; } `; export const LegendShape = styled.div<{ color?: string; shape: 'line' | 'rectangle'; chartColors: Record; }>` ${({ shape, color, chartColors }) => { if (shape === 'line') { return ` width: 20px; height: 2px; background-color: ${chartColors[color as keyof typeof chartColors] || color}; `; } else if (shape === 'rectangle') { return ` width: 12px; height: 12px; background-color: ${chartColors[color as keyof typeof chartColors] || color}; border-radius: 2px; `; } else { console.error( 'The shape is not valid. Please use "line" or "rectangle".', ); } }} `; export const ChartLegend = ({ shape, disabled = false, direction = 'horizontal', legendSize = 'Basic', legendColor, }: ChartLegendProps) => { const { listResources, getColor, getLabel, isSelected, addSelectedResource, removeSelectedResource, selectAllResources, selectOnlyResource, isOnlyOneSelected, } = useChartLegend(); const resources = listResources(); const handleLegendClick = useCallback( (resource: string, event: React.MouseEvent) => { if (disabled) return; const isModifierClick = event.metaKey || event.ctrlKey; const itemIsSelected = isSelected(resource); if (isModifierClick) { if (itemIsSelected) { if (isOnlyOneSelected()) { selectAllResources(); } else { removeSelectedResource(resource); } } else { addSelectedResource(resource); } } else if (itemIsSelected && isOnlyOneSelected()) { selectAllResources(); } else { selectOnlyResource(resource); } }, [ disabled, isSelected, addSelectedResource, removeSelectedResource, selectAllResources, selectOnlyResource, isOnlyOneSelected, ], ); return ( {resources.map((resource) => { const color = getColor(resource); const selected = isSelected(resource); return ( handleLegendClick(resource, event)} > {getLabel(resource)} ); })} ); };