index.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import {Fragment, useCallback} from 'react';
  2. import styled from '@emotion/styled';
  3. import {openModal} from 'sentry/actionCreators/modal';
  4. import {Button} from 'sentry/components/button';
  5. import {TabList, Tabs} from 'sentry/components/tabs';
  6. import {IconTable} from 'sentry/icons/iconTable';
  7. import {t} from 'sentry/locale';
  8. import {space} from 'sentry/styles/space';
  9. import type {Confidence} from 'sentry/types/organization';
  10. import {
  11. useExploreFields,
  12. useExploreMode,
  13. useSetExploreFields,
  14. } from 'sentry/views/explore/contexts/pageParamsContext';
  15. import {Mode} from 'sentry/views/explore/contexts/pageParamsContext/mode';
  16. import {useSpanTags} from 'sentry/views/explore/contexts/spanTagsContext';
  17. import type {AggregatesTableResult} from 'sentry/views/explore/hooks/useExploreAggregatesTable';
  18. import type {SpansTableResult} from 'sentry/views/explore/hooks/useExploreSpansTable';
  19. import type {TracesTableResult} from 'sentry/views/explore/hooks/useExploreTracesTable';
  20. import {Tab} from 'sentry/views/explore/hooks/useTab';
  21. import {AggregatesTable} from 'sentry/views/explore/tables/aggregatesTable';
  22. import {ColumnEditorModal} from 'sentry/views/explore/tables/columnEditorModal';
  23. import {SpansTable} from 'sentry/views/explore/tables/spansTable';
  24. import {TracesTable} from 'sentry/views/explore/tables/tracesTable/index';
  25. interface BaseExploreTablesProps {
  26. confidences: Confidence[];
  27. samplesTab: Tab;
  28. setSamplesTab: (tab: Tab) => void;
  29. }
  30. interface ExploreTablesProps extends BaseExploreTablesProps {
  31. aggregatesTableResult: AggregatesTableResult;
  32. spansTableResult: SpansTableResult;
  33. tracesTableResult: TracesTableResult;
  34. }
  35. export function ExploreTables(props: ExploreTablesProps) {
  36. const mode = useExploreMode();
  37. return (
  38. <Fragment>
  39. {mode === Mode.AGGREGATE && <ExploreAggregatesTable {...props} />}
  40. {mode === Mode.SAMPLES && <ExploreSamplesTable {...props} />}
  41. </Fragment>
  42. );
  43. }
  44. interface AggregatesExploreTablesProps extends BaseExploreTablesProps {
  45. aggregatesTableResult: AggregatesTableResult;
  46. }
  47. function ExploreAggregatesTable(props: AggregatesExploreTablesProps) {
  48. return <AggregatesTable {...props} />;
  49. }
  50. interface SamplesExploreTablesProps extends BaseExploreTablesProps {
  51. spansTableResult: SpansTableResult;
  52. tracesTableResult: TracesTableResult;
  53. }
  54. function ExploreSamplesTable(props: SamplesExploreTablesProps) {
  55. const fields = useExploreFields();
  56. const setFields = useSetExploreFields();
  57. const numberTags = useSpanTags('number');
  58. const stringTags = useSpanTags('string');
  59. const openColumnEditor = useCallback(() => {
  60. openModal(
  61. modalProps => (
  62. <ColumnEditorModal
  63. {...modalProps}
  64. columns={fields}
  65. onColumnsChange={setFields}
  66. stringTags={stringTags}
  67. numberTags={numberTags}
  68. />
  69. ),
  70. {closeEvents: 'escape-key'}
  71. );
  72. }, [fields, setFields, stringTags, numberTags]);
  73. return (
  74. <Fragment>
  75. <SamplesTableHeader>
  76. <Tabs value={props.samplesTab} onChange={props.setSamplesTab}>
  77. <TabList hideBorder>
  78. <TabList.Item key={Tab.SPAN}>{t('Span Samples')}</TabList.Item>
  79. <TabList.Item key={Tab.TRACE}>{t('Trace Samples')}</TabList.Item>
  80. </TabList>
  81. </Tabs>
  82. <Button
  83. disabled={props.samplesTab !== Tab.SPAN}
  84. onClick={openColumnEditor}
  85. icon={<IconTable />}
  86. >
  87. {t('Edit Table')}
  88. </Button>
  89. </SamplesTableHeader>
  90. {props.samplesTab === Tab.SPAN && <SpansTable {...props} />}
  91. {props.samplesTab === Tab.TRACE && <TracesTable {...props} />}
  92. </Fragment>
  93. );
  94. }
  95. const SamplesTableHeader = styled('div')`
  96. display: flex;
  97. flex-direction: row;
  98. justify-content: space-between;
  99. margin-bottom: ${space(2)};
  100. `;