groupBySelector.tsx 2.5 KB

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