issueWidgetCard.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import styled from '@emotion/styled';
  2. import type {Location} from 'history';
  3. import ErrorPanel from 'sentry/components/charts/errorPanel';
  4. import SimpleTableChart from 'sentry/components/charts/simpleTableChart';
  5. import Placeholder from 'sentry/components/placeholder';
  6. import {IconWarning} from 'sentry/icons';
  7. import {space} from 'sentry/styles/space';
  8. import type {PageFilters} from 'sentry/types/core';
  9. import type {Organization} from 'sentry/types/organization';
  10. import {defined} from 'sentry/utils';
  11. import type {TableDataRow} from 'sentry/utils/discover/discoverQuery';
  12. import type {MetaType} from 'sentry/utils/discover/eventView';
  13. import {eventViewFromWidget} from 'sentry/views/dashboards/utils';
  14. import {getDatasetConfig} from '../datasetConfig/base';
  15. import type {Widget} from '../types';
  16. import {WidgetType} from '../types';
  17. import {ISSUE_FIELDS} from '../widgetBuilder/issueWidget/fields';
  18. type Props = {
  19. loading: boolean;
  20. location: Location;
  21. selection: PageFilters;
  22. transformedResults: TableDataRow[];
  23. widget: Widget;
  24. errorMessage?: string;
  25. };
  26. export function IssueWidgetCard({
  27. selection,
  28. widget,
  29. errorMessage,
  30. loading,
  31. transformedResults,
  32. location,
  33. }: Props) {
  34. const datasetConfig = getDatasetConfig(WidgetType.ISSUE);
  35. if (errorMessage) {
  36. return (
  37. <ErrorPanel>
  38. <IconWarning color="gray500" size="lg" />
  39. </ErrorPanel>
  40. );
  41. }
  42. if (loading) {
  43. // Align height to other charts.
  44. return <LoadingPlaceholder height="200px" />;
  45. }
  46. const query = widget.queries[0]!;
  47. const queryFields = defined(query.fields)
  48. ? query.fields
  49. : [...query.columns, ...query.aggregates];
  50. const fieldAliases = query.fieldAliases ?? [];
  51. const eventView = eventViewFromWidget(widget.title, widget.queries[0]!, selection);
  52. const getCustomFieldRenderer = (
  53. field: string,
  54. meta: MetaType,
  55. organization?: Organization
  56. ) => {
  57. return (
  58. datasetConfig.getCustomFieldRenderer?.(field, meta, widget, organization) || null
  59. );
  60. };
  61. return (
  62. <StyledSimpleTableChart
  63. location={location}
  64. title=""
  65. eventView={eventView}
  66. fields={queryFields}
  67. fieldAliases={fieldAliases}
  68. loading={loading}
  69. metadata={ISSUE_FIELDS}
  70. data={transformedResults}
  71. getCustomFieldRenderer={getCustomFieldRenderer}
  72. fieldHeaderMap={datasetConfig.getFieldHeaderMap?.()}
  73. stickyHeaders
  74. />
  75. );
  76. }
  77. const LoadingPlaceholder = styled(Placeholder)`
  78. background-color: ${p => p.theme.surface300};
  79. `;
  80. const StyledSimpleTableChart = styled(SimpleTableChart)`
  81. margin-top: ${space(1.5)};
  82. border-bottom-left-radius: ${p => p.theme.borderRadius};
  83. border-bottom-right-radius: ${p => p.theme.borderRadius};
  84. font-size: ${p => p.theme.fontSizeMedium};
  85. box-shadow: none;
  86. `;