index.tsx 3.0 KB

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