GraphLegendItem.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import React, { useContext } from 'react';
  2. import { css, cx } from 'emotion';
  3. import { LegendSeriesIcon } from '../Legend/LegendSeriesIcon';
  4. import { LegendItem } from '../Legend/Legend';
  5. import { SeriesColorChangeHandler } from './GraphWithLegend';
  6. import { LegendStatsList } from '../Legend/LegendStatsList';
  7. import { ThemeContext } from '../../themes/ThemeContext';
  8. export interface GraphLegendItemProps {
  9. key?: React.Key;
  10. item: LegendItem;
  11. className?: string;
  12. onLabelClick: (item: LegendItem, event: React.MouseEvent<HTMLDivElement>) => void;
  13. onSeriesColorChange: SeriesColorChangeHandler;
  14. onToggleAxis: () => void;
  15. }
  16. export const GraphLegendListItem: React.FunctionComponent<GraphLegendItemProps> = ({
  17. item,
  18. onSeriesColorChange,
  19. onToggleAxis,
  20. onLabelClick,
  21. }) => {
  22. return (
  23. <>
  24. <LegendSeriesIcon
  25. color={item.color}
  26. onColorChange={color => onSeriesColorChange(item.label, color)}
  27. onToggleAxis={onToggleAxis}
  28. yAxis={item.yAxis}
  29. />
  30. <div
  31. onClick={event => onLabelClick(item, event)}
  32. className={css`
  33. cursor: pointer;
  34. white-space: nowrap;
  35. `}
  36. >
  37. {item.label}
  38. </div>
  39. {item.displayValues && <LegendStatsList stats={item.displayValues} />}
  40. </>
  41. );
  42. };
  43. export const GraphLegendTableRow: React.FunctionComponent<GraphLegendItemProps> = ({
  44. item,
  45. onSeriesColorChange,
  46. onToggleAxis,
  47. onLabelClick,
  48. className,
  49. }) => {
  50. const theme = useContext(ThemeContext);
  51. return (
  52. <tr
  53. className={cx(
  54. css`
  55. font-size: ${theme.typography.size.sm};
  56. td {
  57. padding: ${theme.spacing.xxs} ${theme.spacing.sm};
  58. white-space: nowrap;
  59. }
  60. `,
  61. className
  62. )}
  63. >
  64. <td>
  65. <span
  66. className={css`
  67. display: flex;
  68. white-space: nowrap;
  69. `}
  70. >
  71. <LegendSeriesIcon
  72. color={item.color}
  73. onColorChange={color => onSeriesColorChange(item.label, color)}
  74. onToggleAxis={onToggleAxis}
  75. yAxis={item.yAxis}
  76. />
  77. <div
  78. onClick={event => onLabelClick(item, event)}
  79. className={css`
  80. cursor: pointer;
  81. white-space: nowrap;
  82. `}
  83. >
  84. {item.label}{' '}
  85. {item.yAxis === 2 && (
  86. <span
  87. className={css`
  88. color: ${theme.colors.gray2};
  89. `}
  90. >
  91. (right y-axis)
  92. </span>
  93. )}
  94. </div>
  95. </span>
  96. </td>
  97. {item.displayValues &&
  98. item.displayValues.map((stat, index) => {
  99. return (
  100. <td
  101. className={css`
  102. text-align: right;
  103. `}
  104. key={`${stat.title}-${index}`}
  105. >
  106. {stat.text}
  107. </td>
  108. );
  109. })}
  110. </tr>
  111. );
  112. };