ReportSettings.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { Settings } from 'lucide-react'
  2. import { useState } from 'react'
  3. import { cn, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, Label, Switch } from 'ui'
  4. import { useChartHoverState } from './useChartHoverState'
  5. import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
  6. interface ReportSettingsProps {
  7. chartId: string
  8. }
  9. export const ReportSettings = ({ chartId }: ReportSettingsProps) => {
  10. const [isOpen, setIsOpen] = useState(false)
  11. const { syncHover, syncTooltip, setSyncHover, setSyncTooltip } = useChartHoverState(chartId)
  12. return (
  13. <DropdownMenu open={isOpen} onOpenChange={setIsOpen}>
  14. <DropdownMenuTrigger asChild>
  15. <ButtonTooltip
  16. type="default"
  17. icon={<Settings />}
  18. className="w-7"
  19. tooltip={{ content: { side: 'bottom', text: 'Report settings' } }}
  20. />
  21. </DropdownMenuTrigger>
  22. <DropdownMenuContent align="start" side="bottom" className="w-64 p-3">
  23. <div className="space-y-4">
  24. <Label htmlFor="sync-hover" className="text-sm font-normal">
  25. <div className="flex items-center justify-between space-x-2">
  26. Sync chart headers
  27. <Switch id="sync-hover" checked={syncHover} onCheckedChange={setSyncHover} />
  28. </div>
  29. <p className="text-xs text-foreground-light mt-1">
  30. When enabled, hovering over any chart will update headers across all charts
  31. </p>
  32. </Label>
  33. <Label htmlFor="sync-tooltips" className="text-sm font-normal flex flex-col">
  34. <div className="flex items-center justify-between space-x-2">
  35. Sync tooltips
  36. <Switch
  37. id="sync-tooltips"
  38. checked={syncTooltip}
  39. disabled={!syncHover}
  40. onCheckedChange={setSyncTooltip}
  41. />
  42. </div>
  43. <p className="text-xs text-foreground-light mt-1">
  44. When enabled, also shows tooltips on all charts.{' '}
  45. <span className={cn(syncHover ? 'text-foreground-light' : 'text-foreground')}>
  46. Requires header sync.
  47. </span>
  48. </p>
  49. </Label>
  50. </div>
  51. </DropdownMenuContent>
  52. </DropdownMenu>
  53. )
  54. }