convertWidgetToBuilderStateParams.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import {explodeField} from 'sentry/utils/discover/fields';
  2. import {
  3. DisplayType,
  4. type Widget,
  5. type WidgetQuery,
  6. WidgetType,
  7. } from 'sentry/views/dashboards/types';
  8. import {
  9. serializeFields,
  10. serializeThresholds,
  11. type WidgetBuilderStateQueryParams,
  12. } from 'sentry/views/dashboards/widgetBuilder/hooks/useWidgetBuilderState';
  13. function stringifyFields(
  14. query: WidgetQuery,
  15. fieldKey: 'fields' | 'columns' | 'aggregates'
  16. ) {
  17. const fields = query[fieldKey]?.map((field, index) =>
  18. explodeField({field, alias: query.fieldAliases?.[index]})
  19. );
  20. return fields ? serializeFields(fields) : [];
  21. }
  22. /**
  23. * Converts a widget to a set of query params that can be used to
  24. * restore the widget builder state.
  25. */
  26. export function convertWidgetToBuilderStateParams(
  27. widget: Widget
  28. ): WidgetBuilderStateQueryParams {
  29. const query = widget.queries.flatMap(q => q.conditions);
  30. const sort = widget.queries.flatMap(q => q.orderby);
  31. let legendAlias = widget.queries.flatMap(q => q.name);
  32. // y-axes and fields are shared across all queries
  33. // so we can just use the first query
  34. const firstWidgetQuery = widget.queries[0];
  35. let yAxis = firstWidgetQuery ? stringifyFields(firstWidgetQuery, 'aggregates') : [];
  36. let field: string[] = [];
  37. if (
  38. widget.displayType === DisplayType.TABLE ||
  39. widget.displayType === DisplayType.BIG_NUMBER
  40. ) {
  41. field = firstWidgetQuery ? stringifyFields(firstWidgetQuery, 'fields') : [];
  42. yAxis = [];
  43. legendAlias = [];
  44. } else {
  45. field = firstWidgetQuery ? stringifyFields(firstWidgetQuery, 'columns') : [];
  46. }
  47. return {
  48. title: widget.title,
  49. description: widget.description ?? '',
  50. dataset: widget.widgetType ?? WidgetType.ERRORS,
  51. displayType: widget.displayType ?? DisplayType.TABLE,
  52. limit: widget.limit,
  53. field,
  54. yAxis,
  55. query,
  56. sort,
  57. legendAlias,
  58. selectedAggregate: firstWidgetQuery?.selectedAggregate,
  59. thresholds: widget.thresholds ? serializeThresholds(widget.thresholds) : undefined,
  60. };
  61. }