useAddCompareQueryToDashboard.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import {useCallback} from 'react';
  2. import {t} from 'sentry/locale';
  3. import type {NewQuery} from 'sentry/types/organization';
  4. import EventView from 'sentry/utils/discover/eventView';
  5. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  6. import {MutableSearch} from 'sentry/utils/tokenizeSearch';
  7. import {useLocation} from 'sentry/utils/useLocation';
  8. import useOrganization from 'sentry/utils/useOrganization';
  9. import usePageFilters from 'sentry/utils/usePageFilters';
  10. import useRouter from 'sentry/utils/useRouter';
  11. import {DashboardWidgetSource, WidgetType} from 'sentry/views/dashboards/types';
  12. import {MAX_NUM_Y_AXES} from 'sentry/views/dashboards/widgetBuilder/buildSteps/yAxisStep/yAxisSelector';
  13. import {handleAddQueryToDashboard} from 'sentry/views/discover/utils';
  14. import {Mode} from 'sentry/views/explore/contexts/pageParamsContext/mode';
  15. import {formatSort} from 'sentry/views/explore/contexts/pageParamsContext/sortBys';
  16. import {
  17. getQueryMode,
  18. type ReadableExploreQueryParts,
  19. } from 'sentry/views/explore/multiQueryMode/locationUtils';
  20. export function useAddCompareQueryToDashboard(query: ReadableExploreQueryParts) {
  21. const organization = useOrganization();
  22. const hasWidgetBuilderRedesign = organization.features.includes(
  23. 'dashboards-widget-builder-redesign'
  24. );
  25. const {selection} = usePageFilters();
  26. const location = useLocation();
  27. const router = useRouter(); // required for handleAddQueryToDashboard
  28. const yAxes = query.yAxes.slice(0, MAX_NUM_Y_AXES);
  29. const groupBys = query.groupBys;
  30. const mode = getQueryMode(groupBys);
  31. const sortBys = query.sortBys;
  32. const qs = query.query;
  33. const queryFields = query.fields;
  34. const getEventView = useCallback(() => {
  35. let fields: any;
  36. if (mode === Mode.SAMPLES) {
  37. if (hasWidgetBuilderRedesign) {
  38. // TODO: Handle the fields for the widget builder if we've selected the samples mode
  39. fields = [];
  40. } else {
  41. fields = queryFields.filter(Boolean);
  42. }
  43. } else {
  44. fields = [
  45. ...new Set([...groupBys, ...yAxes, ...sortBys.map(sort => sort.field)]),
  46. ].filter(Boolean);
  47. }
  48. const search = new MutableSearch(qs);
  49. const discoverQuery: NewQuery = {
  50. name: t('Custom Widget'),
  51. fields,
  52. orderby: sortBys.map(formatSort),
  53. query: search.formatString(),
  54. version: 2,
  55. dataset: DiscoverDatasets.SPANS_EAP_RPC,
  56. yAxis: yAxes,
  57. };
  58. const newEventView = EventView.fromNewQueryWithPageFilters(discoverQuery, selection);
  59. newEventView.dataset = DiscoverDatasets.SPANS_EAP_RPC;
  60. return newEventView;
  61. }, [
  62. groupBys,
  63. hasWidgetBuilderRedesign,
  64. mode,
  65. qs,
  66. queryFields,
  67. selection,
  68. sortBys,
  69. yAxes,
  70. ]);
  71. const addToDashboard = useCallback(() => {
  72. const eventView = getEventView();
  73. handleAddQueryToDashboard({
  74. organization,
  75. location,
  76. eventView,
  77. router,
  78. yAxis: eventView.yAxis,
  79. widgetType: WidgetType.SPANS,
  80. source: DashboardWidgetSource.TRACE_EXPLORER,
  81. });
  82. }, [organization, location, getEventView, router]);
  83. return {
  84. addToDashboard,
  85. };
  86. }