timeSeriesWidget.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import styled from '@emotion/styled';
  2. import {defined} from 'sentry/utils';
  3. import {
  4. WidgetFrame,
  5. type WidgetFrameProps,
  6. } from 'sentry/views/dashboards/widgets/common/widgetFrame';
  7. import {
  8. TimeSeriesWidgetVisualization,
  9. type TimeSeriesWidgetVisualizationProps,
  10. } from 'sentry/views/dashboards/widgets/timeSeriesWidget/timeSeriesWidgetVisualization';
  11. import {MISSING_DATA_MESSAGE, X_GUTTER, Y_GUTTER} from '../common/settings';
  12. import type {StateProps} from '../common/types';
  13. import {LoadingPanel} from '../widgetLayout/loadingPanel';
  14. export interface TimeSeriesWidgetProps
  15. extends StateProps,
  16. Omit<WidgetFrameProps, 'children'>,
  17. Partial<TimeSeriesWidgetVisualizationProps> {
  18. visualizationType: TimeSeriesWidgetVisualizationProps['visualizationType'];
  19. }
  20. export function TimeSeriesWidget(props: TimeSeriesWidgetProps) {
  21. const {timeseries} = props;
  22. if (props.isLoading) {
  23. return (
  24. <WidgetFrame title={props.title} description={props.description}>
  25. <LoadingPanel />
  26. </WidgetFrame>
  27. );
  28. }
  29. let parsingError: string | undefined = undefined;
  30. if (!defined(timeseries)) {
  31. parsingError = MISSING_DATA_MESSAGE;
  32. }
  33. const error = props.error ?? parsingError;
  34. return (
  35. <WidgetFrame
  36. title={props.title}
  37. description={props.description}
  38. actions={props.actions}
  39. actionsDisabled={props.actionsDisabled}
  40. actionsMessage={props.actionsMessage}
  41. badgeProps={props.badgeProps}
  42. onFullScreenViewClick={props.onFullScreenViewClick}
  43. warnings={props.warnings}
  44. error={error}
  45. onRetry={props.onRetry}
  46. >
  47. {defined(timeseries) && (
  48. <TimeSeriesWrapper>
  49. <TimeSeriesWidgetVisualization
  50. visualizationType={props.visualizationType}
  51. timeseries={timeseries}
  52. releases={props.releases}
  53. aliases={props.aliases}
  54. dataCompletenessDelay={props.dataCompletenessDelay}
  55. timeseriesSelection={props.timeseriesSelection}
  56. onTimeseriesSelectionChange={props.onTimeseriesSelectionChange}
  57. />
  58. </TimeSeriesWrapper>
  59. )}
  60. </WidgetFrame>
  61. );
  62. }
  63. const TimeSeriesWrapper = styled('div')`
  64. flex-grow: 1;
  65. padding: 0 ${X_GUTTER} ${Y_GUTTER} ${X_GUTTER};
  66. `;