convertBuilderStateToWidget.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 fieldAliases = state.fields?.map(field => field.alias ?? '');
  19. const aggregates =
  20. (state.yAxis?.length ?? 0) > 0
  21. ? state.yAxis?.map(generateFieldAsString)
  22. : state.fields
  23. ?.filter(field =>
  24. [FieldValueKind.FUNCTION, FieldValueKind.EQUATION].includes(
  25. field.kind as FieldValueKind
  26. )
  27. )
  28. .map(generateFieldAsString)
  29. .filter(Boolean);
  30. const columns = state.fields
  31. ?.filter(field => field.kind === FieldValueKind.FIELD)
  32. .map(generateFieldAsString)
  33. .filter(Boolean);
  34. const fields =
  35. state.displayType === DisplayType.TABLE
  36. ? state.fields?.map(generateFieldAsString)
  37. : [...(columns ?? []), ...(aggregates ?? [])];
  38. // If there's no sort, use the first field as the default sort
  39. const defaultSort = fields?.[0] ?? defaultQuery.orderby;
  40. const sort =
  41. defined(state.sort) && state.sort.length > 0
  42. ? _formatSort(state.sort[0]!)
  43. : defaultSort;
  44. const widgetQueries: WidgetQuery[] = queries.map((query, index) => {
  45. return {
  46. ...defaultQuery,
  47. fields,
  48. aggregates: aggregates ?? [],
  49. columns: columns ?? [],
  50. conditions: query,
  51. fieldAliases: fieldAliases ?? [],
  52. name: legendAlias[index] ?? '',
  53. selectedAggregate: state.selectedAggregate,
  54. // Big number widgets don't support sorting, so always ignore the sort state
  55. orderby: state.displayType === DisplayType.BIG_NUMBER ? '' : sort,
  56. };
  57. });
  58. return {
  59. title: state.title ?? '',
  60. description: state.description,
  61. displayType: state.displayType ?? DisplayType.TABLE,
  62. interval: '1h', // TODO: Not sure what to put here yet
  63. queries: widgetQueries,
  64. widgetType: state.dataset,
  65. limit: state.limit,
  66. thresholds: state.thresholds,
  67. };
  68. }
  69. function _formatSort(sort: Sort): string {
  70. const direction = sort.kind === 'desc' ? '-' : '';
  71. return `${direction}${sort.field}`;
  72. }