simpleTableChart.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import {Component, Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import {Location} from 'history';
  4. import PanelTable, {PanelTableHeader} from 'app/components/panels/panelTable';
  5. import space from 'app/styles/space';
  6. import {Organization} from 'app/types';
  7. import {TableData, TableDataRow} from 'app/utils/discover/discoverQuery';
  8. import {getFieldRenderer} from 'app/utils/discover/fieldRenderers';
  9. import {fieldAlignment} from 'app/utils/discover/fields';
  10. import withOrganization from 'app/utils/withOrganization';
  11. import {decodeColumnOrder} from 'app/views/eventsV2/utils';
  12. type Props = {
  13. organization: Organization;
  14. location: Location;
  15. loading: boolean;
  16. fields: string[];
  17. title: string;
  18. metadata: TableData['meta'] | undefined;
  19. data: TableData['data'] | undefined;
  20. className?: string;
  21. };
  22. class SimpleTableChart extends Component<Props> {
  23. renderRow(
  24. index: number,
  25. row: TableDataRow,
  26. tableMeta: NonNullable<TableData['meta']>,
  27. columns: ReturnType<typeof decodeColumnOrder>
  28. ) {
  29. const {location, organization} = this.props;
  30. return columns.map(column => {
  31. const fieldRenderer = getFieldRenderer(column.name, tableMeta);
  32. const rendered = fieldRenderer(row, {organization, location});
  33. return <TableCell key={`${index}:${column.name}`}>{rendered}</TableCell>;
  34. });
  35. }
  36. render() {
  37. const {className, loading, fields, metadata, data, title} = this.props;
  38. const meta = metadata ?? {};
  39. const columns = decodeColumnOrder(fields.map(field => ({field})));
  40. return (
  41. <Fragment>
  42. {title && <h4>{title}</h4>}
  43. <StyledPanelTable
  44. className={className}
  45. isLoading={loading}
  46. headers={columns.map((column, index) => {
  47. const align = fieldAlignment(column.name, column.type, meta);
  48. return (
  49. <HeadCell key={index} align={align}>
  50. {column.name}
  51. </HeadCell>
  52. );
  53. })}
  54. isEmpty={!data?.length}
  55. disablePadding
  56. >
  57. {data?.map((row, index) => this.renderRow(index, row, meta, columns))}
  58. </StyledPanelTable>
  59. </Fragment>
  60. );
  61. }
  62. }
  63. const StyledPanelTable = styled(PanelTable)`
  64. border-radius: 0;
  65. border-left: 0;
  66. border-right: 0;
  67. border-bottom: 0;
  68. margin: 0;
  69. ${/* sc-selector */ PanelTableHeader} {
  70. height: min-content;
  71. }
  72. `;
  73. type HeadCellProps = {
  74. align: string | undefined;
  75. };
  76. const HeadCell = styled('div')<HeadCellProps>`
  77. ${(p: HeadCellProps) => (p.align ? `text-align: ${p.align};` : '')}
  78. padding: ${space(1)} ${space(3)};
  79. `;
  80. const TableCell = styled('div')`
  81. padding: ${space(1)} ${space(3)};
  82. `;
  83. export default withOrganization(SimpleTableChart);