datasetSelector.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import {Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import FeatureBadge from 'sentry/components/badge/featureBadge';
  4. import RadioGroup, {type RadioOption} from 'sentry/components/forms/controls/radioGroup';
  5. import ExternalLink from 'sentry/components/links/externalLink';
  6. import {t, tct} from 'sentry/locale';
  7. import {space} from 'sentry/styles/space';
  8. import {trackAnalytics} from 'sentry/utils/analytics';
  9. import {WidgetBuilderVersion} from 'sentry/utils/analytics/dashboardsAnalyticsEvents';
  10. import useOrganization from 'sentry/utils/useOrganization';
  11. import {WidgetType} from 'sentry/views/dashboards/types';
  12. import {SectionHeader} from 'sentry/views/dashboards/widgetBuilder/components/common/sectionHeader';
  13. import {useWidgetBuilderContext} from 'sentry/views/dashboards/widgetBuilder/contexts/widgetBuilderContext';
  14. import useDashboardWidgetSource from 'sentry/views/dashboards/widgetBuilder/hooks/useDashboardWidgetSource';
  15. import useIsEditingWidget from 'sentry/views/dashboards/widgetBuilder/hooks/useIsEditingWidget';
  16. import {BuilderStateAction} from 'sentry/views/dashboards/widgetBuilder/hooks/useWidgetBuilderState';
  17. function WidgetBuilderDatasetSelector() {
  18. const organization = useOrganization();
  19. const {state, dispatch} = useWidgetBuilderContext();
  20. const source = useDashboardWidgetSource();
  21. const isEditing = useIsEditingWidget();
  22. const datasetChoices: Array<RadioOption<WidgetType>> = [];
  23. datasetChoices.push([WidgetType.ERRORS, t('Errors')]);
  24. datasetChoices.push([WidgetType.TRANSACTIONS, t('Transactions')]);
  25. if (organization.features.includes('dashboards-eap')) {
  26. datasetChoices.push([
  27. WidgetType.SPANS,
  28. <FeatureBadgeAlignmentWrapper aria-label={t('Spans')} key={'dataset-choice-spans'}>
  29. {t('Spans')}{' '}
  30. <FeatureBadge
  31. type="beta"
  32. title={t('This feature is available for early adopters and the UX may change')}
  33. />
  34. </FeatureBadgeAlignmentWrapper>,
  35. ]);
  36. }
  37. datasetChoices.push([WidgetType.ISSUE, t('Issues')]);
  38. datasetChoices.push([WidgetType.RELEASE, t('Releases')]);
  39. return (
  40. <Fragment>
  41. <StyledSectionHeader
  42. title={t('Dataset')}
  43. tooltipText={tct(
  44. `This reflects the type of information you want to use. To learn more, [link: read the docs].`,
  45. {
  46. link: (
  47. <ExternalLink href="https://docs.sentry.io/product/dashboards/widget-builder/#choose-your-dataset" />
  48. ),
  49. }
  50. )}
  51. />
  52. <DatasetChoices
  53. label={t('Dataset')}
  54. value={state.dataset ?? WidgetType.ERRORS}
  55. choices={datasetChoices}
  56. onChange={(newValue: WidgetType) => {
  57. dispatch({
  58. type: BuilderStateAction.SET_DATASET,
  59. payload: newValue,
  60. });
  61. trackAnalytics('dashboards_views.widget_builder.change', {
  62. from: source,
  63. widget_type: state.dataset ?? '',
  64. builder_version: WidgetBuilderVersion.SLIDEOUT,
  65. field: 'dataSet',
  66. value: newValue,
  67. new_widget: !isEditing,
  68. organization,
  69. });
  70. }}
  71. />
  72. </Fragment>
  73. );
  74. }
  75. export default WidgetBuilderDatasetSelector;
  76. const DatasetChoices = styled(RadioGroup<WidgetType>)`
  77. display: flex;
  78. flex-direction: row;
  79. flex-wrap: wrap;
  80. gap: ${space(2)};
  81. `;
  82. const FeatureBadgeAlignmentWrapper = styled('div')`
  83. ${FeatureBadge} {
  84. position: relative;
  85. top: -1px;
  86. }
  87. `;
  88. const StyledSectionHeader = styled(SectionHeader)`
  89. margin-bottom: ${space(2)};
  90. `;