simpleTableChart.tsx 2.5 KB

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