convertBuilderStateToWidget.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import {defined} from 'sentry/utils';
  2. import {generateFieldAsString} from 'sentry/utils/discover/fields';
  3. import {getDatasetConfig} from 'sentry/views/dashboards/datasetConfig/base';
  4. import {
  5. DisplayType,
  6. type Widget,
  7. type WidgetQuery,
  8. WidgetType,
  9. } from 'sentry/views/dashboards/types';
  10. import {formatSort} from 'sentry/views/explore/tables/aggregatesTable';
  11. import type {WidgetBuilderState} from '../hooks/useWidgetBuilderState';
  12. export function convertBuilderStateToWidget(state: WidgetBuilderState): Widget {
  13. const datasetConfig = getDatasetConfig(state.dataset ?? WidgetType.ERRORS);
  14. const defaultQuery = datasetConfig.defaultWidgetQuery;
  15. const queries = defined(state.query) && state.query.length > 0 ? state.query : [''];
  16. const fields = state.fields?.map(generateFieldAsString);
  17. const aggregates = state.yAxis?.map(generateFieldAsString);
  18. const columns = state.fields
  19. ?.filter(field => 'kind' in field && field.kind === 'field')
  20. .map(generateFieldAsString);
  21. // If there's no sort, use the first field as the default sort
  22. const defaultSort = fields?.[0] ?? defaultQuery.orderby;
  23. const sort =
  24. defined(state.sort) && state.sort.length > 0
  25. ? formatSort(state.sort[0])
  26. : defaultSort;
  27. const widgetQueries: WidgetQuery[] = queries.map(query => {
  28. return {
  29. ...defaultQuery,
  30. fields: defined(fields) && fields.length > 0 ? fields : defaultQuery.fields,
  31. aggregates:
  32. defined(aggregates) && aggregates.length > 0
  33. ? aggregates
  34. : defaultQuery.aggregates,
  35. columns: defined(columns) && columns.length > 0 ? columns : defaultQuery.columns,
  36. conditions: query,
  37. orderby: sort,
  38. };
  39. });
  40. return {
  41. title: state.title ?? '',
  42. description: state.description,
  43. displayType: state.displayType ?? DisplayType.TABLE,
  44. interval: '1h', // TODO: Not sure what to put here yet
  45. queries: widgetQueries,
  46. widgetType: state.dataset,
  47. };
  48. }