useAddToDashboard.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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 {MutableSearch} from 'sentry/utils/tokenizeSearch';
  6. import {useLocation} from 'sentry/utils/useLocation';
  7. import useOrganization from 'sentry/utils/useOrganization';
  8. import usePageFilters from 'sentry/utils/usePageFilters';
  9. import useRouter from 'sentry/utils/useRouter';
  10. import {
  11. DashboardWidgetSource,
  12. DisplayType,
  13. WidgetType,
  14. } from 'sentry/views/dashboards/types';
  15. import {MAX_NUM_Y_AXES} from 'sentry/views/dashboards/widgetBuilder/buildSteps/yAxisStep/yAxisSelector';
  16. import {handleAddQueryToDashboard} from 'sentry/views/discover/utils';
  17. import {
  18. useExploreDataset,
  19. useExploreFields,
  20. useExploreGroupBys,
  21. useExploreMode,
  22. useExploreQuery,
  23. useExploreSortBys,
  24. useExploreVisualizes,
  25. } from 'sentry/views/explore/contexts/pageParamsContext';
  26. import {Mode} from 'sentry/views/explore/contexts/pageParamsContext/mode';
  27. import {formatSort} from 'sentry/views/explore/contexts/pageParamsContext/sortBys';
  28. import {ChartType} from 'sentry/views/insights/common/components/chart';
  29. const CHART_TYPE_TO_DISPLAY_TYPE = {
  30. [ChartType.LINE]: DisplayType.LINE,
  31. [ChartType.BAR]: DisplayType.BAR,
  32. [ChartType.AREA]: DisplayType.AREA,
  33. };
  34. export function useAddToDashboard() {
  35. const location = useLocation();
  36. const router = useRouter();
  37. const {selection} = usePageFilters();
  38. const organization = useOrganization();
  39. const mode = useExploreMode();
  40. const dataset = useExploreDataset();
  41. const groupBys = useExploreGroupBys();
  42. const sortBys = useExploreSortBys();
  43. const visualizes = useExploreVisualizes();
  44. const sampleFields = useExploreFields();
  45. const query = useExploreQuery();
  46. const hasWidgetBuilderRedesign = organization.features.includes(
  47. 'dashboards-widget-builder-redesign'
  48. );
  49. const getEventView = useCallback(
  50. (visualizeIndex: number) => {
  51. const yAxes = visualizes[visualizeIndex]!.yAxes.slice(0, MAX_NUM_Y_AXES);
  52. let fields: any;
  53. if (mode === Mode.SAMPLES) {
  54. if (hasWidgetBuilderRedesign) {
  55. // TODO: Handle the fields for the widget builder if we've selected the samples mode
  56. fields = [];
  57. } else {
  58. fields = sampleFields.filter(Boolean);
  59. }
  60. } else {
  61. fields = [
  62. ...new Set([...groupBys, ...yAxes, ...sortBys.map(sort => sort.field)]),
  63. ].filter(Boolean);
  64. }
  65. const search = new MutableSearch(query);
  66. const discoverQuery: NewQuery = {
  67. name: t('Custom Widget'),
  68. fields,
  69. orderby: sortBys.map(formatSort),
  70. query: search.formatString(),
  71. version: 2,
  72. dataset,
  73. yAxis: yAxes,
  74. };
  75. const newEventView = EventView.fromNewQueryWithPageFilters(
  76. discoverQuery,
  77. selection
  78. );
  79. newEventView.dataset = dataset;
  80. newEventView.display =
  81. CHART_TYPE_TO_DISPLAY_TYPE[visualizes[visualizeIndex]!.chartType];
  82. return newEventView;
  83. },
  84. [
  85. visualizes,
  86. mode,
  87. sampleFields,
  88. groupBys,
  89. query,
  90. dataset,
  91. selection,
  92. sortBys,
  93. hasWidgetBuilderRedesign,
  94. ]
  95. );
  96. const addToDashboard = useCallback(
  97. (visualizeIndex: number) => {
  98. const eventView = getEventView(visualizeIndex);
  99. handleAddQueryToDashboard({
  100. organization,
  101. location,
  102. eventView,
  103. router,
  104. yAxis: eventView.yAxis,
  105. widgetType: WidgetType.SPANS,
  106. source: DashboardWidgetSource.TRACE_EXPLORER,
  107. });
  108. },
  109. [organization, location, getEventView, router]
  110. );
  111. return {
  112. addToDashboard,
  113. };
  114. }