ResultCell.tsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { Expand } from 'lucide-react'
  2. import { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui'
  3. import { formatCellValue, isLargeValue } from './Results.utils'
  4. interface ResultCellProps {
  5. column: string
  6. value: unknown
  7. onContextMenu: (e: React.MouseEvent, column: string, value: unknown) => void
  8. onExpand: (column: string, value: unknown) => void
  9. }
  10. export const ResultCell = ({ column, value, onContextMenu, onExpand }: ResultCellProps) => {
  11. const showExpand = isLargeValue(value)
  12. return (
  13. <div
  14. className={cn(
  15. 'group/cell relative flex items-center h-full font-mono text-xs w-full whitespace-pre',
  16. value === null && 'text-foreground-lighter'
  17. )}
  18. onContextMenu={(e) => {
  19. e.preventDefault()
  20. onContextMenu(e, column, value)
  21. }}
  22. >
  23. {formatCellValue(value)}
  24. {showExpand && (
  25. <Tooltip>
  26. <TooltipTrigger asChild>
  27. <Button
  28. type="default"
  29. size="tiny"
  30. className="absolute right-1 top-1/2 -translate-y-1/2 px-1 opacity-0 group-hover/cell:opacity-100 focus-visible:opacity-100"
  31. icon={<Expand size={10} />}
  32. aria-label="View full cell content"
  33. onClick={(e) => {
  34. e.stopPropagation()
  35. onExpand(column, value)
  36. }}
  37. />
  38. </TooltipTrigger>
  39. <TooltipContent side="left">View full cell content</TooltipContent>
  40. </Tooltip>
  41. )}
  42. </div>
  43. )
  44. }