sortableWidget.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import type {ComponentProps} from 'react';
  2. import styled from '@emotion/styled';
  3. import {LazyRender} from 'sentry/components/lazyRender';
  4. import PanelAlert from 'sentry/components/panels/panelAlert';
  5. import type {User} from 'sentry/types/user';
  6. import useOrganization from 'sentry/utils/useOrganization';
  7. import {useUser} from 'sentry/utils/useUser';
  8. import {useUserTeams} from 'sentry/utils/useUserTeams';
  9. import {checkUserHasEditAccess} from 'sentry/views/dashboards/detail';
  10. import WidgetCard from 'sentry/views/dashboards/widgetCard';
  11. import {DashboardsMEPProvider} from './widgetCard/dashboardsMEPContext';
  12. import {Toolbar} from './widgetCard/toolbar';
  13. import type {DashboardFilters, DashboardPermissions, Widget} from './types';
  14. import type WidgetLegendSelectionState from './widgetLegendSelectionState';
  15. const TABLE_ITEM_LIMIT = 20;
  16. type Props = {
  17. index: string;
  18. isEditingDashboard: boolean;
  19. onDelete: () => void;
  20. onDuplicate: () => void;
  21. onEdit: () => void;
  22. onSetTransactionsDataset: () => void;
  23. widget: Widget;
  24. widgetLegendState: WidgetLegendSelectionState;
  25. widgetLimitReached: boolean;
  26. dashboardCreator?: User;
  27. dashboardFilters?: DashboardFilters;
  28. dashboardPermissions?: DashboardPermissions;
  29. isMobile?: boolean;
  30. isPreview?: boolean;
  31. windowWidth?: number;
  32. };
  33. function SortableWidget(props: Props) {
  34. const {
  35. widget,
  36. isEditingDashboard,
  37. widgetLimitReached,
  38. onDelete,
  39. onEdit,
  40. onDuplicate,
  41. onSetTransactionsDataset,
  42. isPreview,
  43. isMobile,
  44. windowWidth,
  45. index,
  46. dashboardFilters,
  47. widgetLegendState,
  48. dashboardPermissions,
  49. dashboardCreator,
  50. } = props;
  51. const organization = useOrganization();
  52. const currentUser = useUser();
  53. const {teams: userTeams} = useUserTeams();
  54. const hasEditAccess = checkUserHasEditAccess(
  55. currentUser,
  56. userTeams,
  57. organization,
  58. dashboardPermissions,
  59. dashboardCreator
  60. );
  61. const widgetProps: ComponentProps<typeof WidgetCard> = {
  62. widget,
  63. isEditingDashboard,
  64. widgetLimitReached,
  65. hasEditAccess,
  66. onDelete,
  67. onEdit,
  68. onDuplicate,
  69. onSetTransactionsDataset,
  70. showContextMenu: true,
  71. isPreview,
  72. index,
  73. dashboardFilters,
  74. widgetLegendState,
  75. renderErrorMessage: errorMessage => {
  76. return (
  77. typeof errorMessage === 'string' && (
  78. <PanelAlert type="error">{errorMessage}</PanelAlert>
  79. )
  80. );
  81. },
  82. isMobile,
  83. windowWidth,
  84. tableItemLimit: TABLE_ITEM_LIMIT,
  85. };
  86. return (
  87. <GridWidgetWrapper>
  88. <DashboardsMEPProvider>
  89. <LazyRender containerHeight={200} withoutContainer>
  90. <WidgetCard {...widgetProps} />
  91. {props.isEditingDashboard && (
  92. <Toolbar
  93. onEdit={props.onEdit}
  94. onDelete={props.onDelete}
  95. onDuplicate={props.onDuplicate}
  96. isMobile={props.isMobile}
  97. />
  98. )}
  99. </LazyRender>
  100. </DashboardsMEPProvider>
  101. </GridWidgetWrapper>
  102. );
  103. }
  104. export default SortableWidget;
  105. const GridWidgetWrapper = styled('div')`
  106. height: 100%;
  107. `;