convertBuilderStateToWidget.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import {defined} from 'sentry/utils';
  2. import {generateFieldAsString, type Sort} 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 {FieldValueKind} from 'sentry/views/discover/table/types';
  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 legendAlias =
  17. defined(state.legendAlias) && state.legendAlias.length > 0 ? state.legendAlias : [];
  18. const fields = state.fields?.map(generateFieldAsString);
  19. const fieldAliases = state.fields?.map(field => field.alias ?? '');
  20. const aggregates =
  21. (state.yAxis?.length ?? 0) > 0
  22. ? state.yAxis?.map(generateFieldAsString)
  23. : state.fields
  24. ?.filter(field =>
  25. [FieldValueKind.FUNCTION, FieldValueKind.EQUATION].includes(
  26. field.kind as FieldValueKind
  27. )
  28. )
  29. .map(generateFieldAsString);
  30. const columns = state.fields
  31. ?.filter(field => field.kind === FieldValueKind.FIELD)
  32. .map(generateFieldAsString);
  33. // If there's no sort, use the first field as the default sort
  34. const defaultSort = fields?.[0] ?? defaultQuery.orderby;
  35. const sort =
  36. defined(state.sort) && state.sort.length > 0
  37. ? _formatSort(state.sort[0]!)
  38. : defaultSort;
  39. const widgetQueries: WidgetQuery[] = queries.map((query, index) => {
  40. return {
  41. ...defaultQuery,
  42. fields,
  43. aggregates: aggregates ?? [],
  44. columns: columns ?? [],
  45. conditions: query,
  46. orderby: sort,
  47. fieldAliases: fieldAliases ?? [],
  48. name: legendAlias[index] ?? '',
  49. };
  50. });
  51. return {
  52. title: state.title ?? '',
  53. description: state.description,
  54. displayType: state.displayType ?? DisplayType.TABLE,
  55. interval: '1h', // TODO: Not sure what to put here yet
  56. queries: widgetQueries,
  57. widgetType: state.dataset,
  58. limit: state.limit,
  59. };
  60. }
  61. function _formatSort(sort: Sort): string {
  62. const direction = sort.kind === 'desc' ? '-' : '';
  63. return `${direction}${sort.field}`;
  64. }