From 4a2eb1d3e463ce2c00a51de212bc56a2a1ad475b Mon Sep 17 00:00:00 2001 From: Vishwam Talnikar <131583570+visz11@users.noreply.github.com> Date: Mon, 10 Nov 2025 11:56:41 +0530 Subject: [PATCH] Add CustomLegend component for interactive legend --- index.tsx | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 index.tsx diff --git a/index.tsx b/index.tsx new file mode 100644 index 0000000..efbaffc --- /dev/null +++ b/index.tsx @@ -0,0 +1,161 @@ +import { Box, Flex, Text, Tooltip } from '@chakra-ui/react'; +import { useEffect, useState } from 'react'; + +export default function CustomLegend({ + barProps, + setBarProps, + keys, + w, + ...props +}: any) { + const showReset = !keys.every((item: any) => barProps[item.key]); + const [hasShownTooltip, setHasShownTooltip] = useState(false); + const [showTooltip, setShowTooltip] = useState(false); + + const resetSelected = () => { + setBarProps( + keys?.reduce( + (a: any, { key }: any) => { + a[key] = true; + return a; + }, + { + hover: null, + } + ) + ); + }; + + return ( + + + { + if (!showReset) { + return; + } + resetSelected(); + }} + visibility={showReset ? 'visible' : 'hidden'} + cursor={'pointer'} + > + Reset + + + {keys?.map((entry: any) => { + const isLine = ['line_chart', 'dashed_line_chart'].includes( + entry?.chartType + ); + return ( + { + setBarProps( + keys?.reduce( + (a: any, { key }: any) => { + a[key] = entry?.key === key ? true : false; + return a; + }, + { + hover: null, + } + ) + ); + }} + onClick={() => { + if (!hasShownTooltip) { + setHasShownTooltip(true); + setShowTooltip(true); + setTimeout(() => { + setShowTooltip(false); + }, 1500); + } + + setBarProps((barProps: any) => { + return { + ...barProps, + [entry?.key]: !barProps[entry?.key], + hover: null, + }; + }); + }} + onMouseEnter={() => { + if (!barProps[entry?.key]) { + return; + } + setBarProps((barProps: any) => { + return { ...barProps, hover: entry.key }; + }); + }} + onMouseLeave={() => { + setBarProps((barProps: any) => { + return { ...barProps, hover: null }; + }); + }} + > + {isLine ? ( + + + + ) : ( + + + + )} + + {entry?.name} + + + ); + })} + + ); +}