deadRageClickList.tsx 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import styled from '@emotion/styled';
  2. import * as Layout from 'sentry/components/layouts/thirds';
  3. import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
  4. import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
  5. import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
  6. import PageFiltersContainer from 'sentry/components/organizations/pageFilters/container';
  7. import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
  8. import {PageHeadingQuestionTooltip} from 'sentry/components/pageHeadingQuestionTooltip';
  9. import Pagination from 'sentry/components/pagination';
  10. import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
  11. import {t} from 'sentry/locale';
  12. import {space} from 'sentry/styles/space';
  13. import useDeadRageSelectors from 'sentry/utils/replays/hooks/useDeadRageSelectors';
  14. import {useLocation} from 'sentry/utils/useLocation';
  15. import {useNavigate} from 'sentry/utils/useNavigate';
  16. import useOrganization from 'sentry/utils/useOrganization';
  17. import SelectorTable from 'sentry/views/replays/deadRageClick/selectorTable';
  18. import ReplayTabs from 'sentry/views/replays/tabs';
  19. export default function DeadRageClickList() {
  20. const organization = useOrganization();
  21. const location = useLocation();
  22. const navigate = useNavigate();
  23. const {isLoading, isError, data, pageLinks} = useDeadRageSelectors({
  24. per_page: 50,
  25. sort: '-count_dead_clicks',
  26. cursor: location.query.cursor,
  27. prefix: '',
  28. isWidgetData: false,
  29. });
  30. return (
  31. <SentryDocumentTitle
  32. title={t('Top Selectors with Dead Clicks')}
  33. orgSlug={organization.slug}
  34. >
  35. <Layout.Header>
  36. <Layout.HeaderContent>
  37. <Layout.Title>
  38. {t('Top Selectors with Dead and Rage Clicks')}
  39. <PageHeadingQuestionTooltip
  40. title={t('See the top selectors your users have dead and rage clicked on.')}
  41. docsUrl="https://docs.sentry.io/product/session-replay/replay-page-and-filters/"
  42. />
  43. </Layout.Title>
  44. </Layout.HeaderContent>
  45. <div /> {/* wraps the tabs below the page title */}
  46. <ReplayTabs selected="selectors" />
  47. </Layout.Header>
  48. <PageFiltersContainer>
  49. <Layout.Body>
  50. <Layout.Main fullWidth>
  51. <PageFilterBar condensed>
  52. <ProjectPageFilter resetParamsOnChange={['cursor']} />
  53. <EnvironmentPageFilter resetParamsOnChange={['cursor']} />
  54. <DatePageFilter resetParamsOnChange={['cursor']} />
  55. </PageFilterBar>
  56. <LayoutGap>
  57. <SelectorTable
  58. data={data}
  59. isError={isError}
  60. isLoading={isLoading}
  61. location={location}
  62. clickCountColumns={[
  63. {key: 'count_dead_clicks', name: 'dead clicks'},
  64. {key: 'count_rage_clicks', name: 'rage clicks'},
  65. ]}
  66. clickCountSortable
  67. />
  68. </LayoutGap>
  69. <PaginationNoMargin
  70. pageLinks={pageLinks}
  71. onCursor={(cursor, path, searchQuery) => {
  72. navigate({
  73. pathname: path,
  74. query: {...searchQuery, cursor},
  75. });
  76. }}
  77. />
  78. </Layout.Main>
  79. </Layout.Body>
  80. </PageFiltersContainer>
  81. </SentryDocumentTitle>
  82. );
  83. }
  84. const LayoutGap = styled('div')`
  85. margin-top: ${space(2)};
  86. `;
  87. const PaginationNoMargin = styled(Pagination)`
  88. margin: 0;
  89. `;