groupBySelector.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import {Fragment} from 'react';
  2. import {t} from 'sentry/locale';
  3. import type {TagCollection} from 'sentry/types/group';
  4. import type {QueryFieldValue} from 'sentry/utils/discover/fields';
  5. import useOrganization from 'sentry/utils/useOrganization';
  6. import useTags from 'sentry/utils/useTags';
  7. import {getDatasetConfig} from 'sentry/views/dashboards/datasetConfig/base';
  8. import {useValidateWidgetQuery} from 'sentry/views/dashboards/hooks/useValidateWidget';
  9. import {WidgetType} from 'sentry/views/dashboards/types';
  10. import {GroupBySelector} from 'sentry/views/dashboards/widgetBuilder/buildSteps/groupByStep/groupBySelector';
  11. import {SectionHeader} from 'sentry/views/dashboards/widgetBuilder/components/common/sectionHeader';
  12. import {useWidgetBuilderContext} from 'sentry/views/dashboards/widgetBuilder/contexts/widgetBuilderContext';
  13. import {BuilderStateAction} from 'sentry/views/dashboards/widgetBuilder/hooks/useWidgetBuilderState';
  14. import {convertBuilderStateToWidget} from 'sentry/views/dashboards/widgetBuilder/utils/convertBuilderStateToWidget';
  15. import {useSpanTags} from 'sentry/views/explore/contexts/spanTagsContext';
  16. function WidgetBuilderGroupBySelector() {
  17. const {state, dispatch} = useWidgetBuilderContext();
  18. const organization = useOrganization();
  19. let tags: TagCollection = useTags();
  20. const numericSpanTags = useSpanTags('number');
  21. const stringSpanTags = useSpanTags('string');
  22. if (state.dataset === WidgetType.SPANS) {
  23. tags = {...numericSpanTags, ...stringSpanTags};
  24. }
  25. const widget = convertBuilderStateToWidget(state);
  26. const validatedWidgetResponse = useValidateWidgetQuery(widget);
  27. const datasetConfig = getDatasetConfig(state.dataset);
  28. const groupByOptions = datasetConfig.getGroupByFieldOptions
  29. ? datasetConfig.getGroupByFieldOptions(organization, tags)
  30. : {};
  31. const handleGroupByChange = (newValue: QueryFieldValue[]) => {
  32. dispatch({
  33. type: BuilderStateAction.SET_FIELDS,
  34. payload: newValue,
  35. });
  36. };
  37. return (
  38. <Fragment>
  39. <SectionHeader
  40. title={t('Group by')}
  41. tooltipText={t(
  42. 'Aggregated data by a key attribute to calculate averages, percentiles, count and more'
  43. )}
  44. optional
  45. />
  46. <GroupBySelector
  47. columns={state.fields}
  48. fieldOptions={groupByOptions}
  49. onChange={handleGroupByChange}
  50. validatedWidgetResponse={validatedWidgetResponse}
  51. style={{paddingRight: 0}}
  52. />
  53. </Fragment>
  54. );
  55. }
  56. export default WidgetBuilderGroupBySelector;