addWidget.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import React from 'react';
  2. import {useSortable} from '@dnd-kit/sortable';
  3. import styled from '@emotion/styled';
  4. import Button from 'app/components/button';
  5. import ButtonBar from 'app/components/buttonBar';
  6. import {IconAdd} from 'app/icons';
  7. import {t} from 'app/locale';
  8. import {Organization} from 'app/types';
  9. import {DashboardDetails, DisplayType} from './types';
  10. import WidgetWrapper from './widgetWrapper';
  11. export const ADD_WIDGET_BUTTON_DRAG_ID = 'add-widget-button';
  12. const initialStyles = {
  13. x: 0,
  14. y: 0,
  15. scaleX: 1,
  16. scaleY: 1,
  17. };
  18. type Props = {
  19. onClick: () => void;
  20. orgFeatures: Organization['features'];
  21. orgSlug: Organization['slug'];
  22. dashboardId: DashboardDetails['id'];
  23. };
  24. function AddWidget({onClick, orgFeatures, orgSlug, dashboardId}: Props) {
  25. const {setNodeRef, transform} = useSortable({
  26. disabled: true,
  27. id: ADD_WIDGET_BUTTON_DRAG_ID,
  28. transition: null,
  29. });
  30. return (
  31. <WidgetWrapper
  32. key="add"
  33. ref={setNodeRef}
  34. displayType={DisplayType.BIG_NUMBER}
  35. layoutId={ADD_WIDGET_BUTTON_DRAG_ID}
  36. style={{originX: 0, originY: 0}}
  37. animate={
  38. transform
  39. ? {
  40. x: transform.x,
  41. y: transform.y,
  42. scaleX: transform?.scaleX && transform.scaleX <= 1 ? transform.scaleX : 1,
  43. scaleY: transform?.scaleY && transform.scaleY <= 1 ? transform.scaleY : 1,
  44. }
  45. : initialStyles
  46. }
  47. transition={{
  48. duration: 0.25,
  49. }}
  50. >
  51. {orgFeatures.includes('metrics') ? (
  52. <InnerWrapper>
  53. <ButtonBar gap={1}>
  54. <Button
  55. to={`/organizations/${orgSlug}/dashboards/${dashboardId}/widget/new/?dataSet=metrics`}
  56. >
  57. {t('Add metrics widget')}
  58. </Button>
  59. <Button onClick={onClick}>{t('Add events widget')}</Button>
  60. </ButtonBar>
  61. </InnerWrapper>
  62. ) : (
  63. <InnerWrapper onClick={onClick}>
  64. <AddButton
  65. data-test-id="widget-add"
  66. onClick={onClick}
  67. icon={<IconAdd size="lg" isCircled color="inactive" />}
  68. />
  69. </InnerWrapper>
  70. )}
  71. </WidgetWrapper>
  72. );
  73. }
  74. export default AddWidget;
  75. const AddButton = styled(Button)`
  76. border: none;
  77. &,
  78. &:focus,
  79. &:active,
  80. &:hover {
  81. background: transparent;
  82. box-shadow: none;
  83. }
  84. `;
  85. const InnerWrapper = styled('div')<{onClick?: () => void}>`
  86. width: 100%;
  87. height: 110px;
  88. border: 2px dashed ${p => p.theme.border};
  89. border-radius: ${p => p.theme.borderRadius};
  90. display: flex;
  91. align-items: center;
  92. justify-content: center;
  93. cursor: ${p => (p.onClick ? 'pointer' : '')};
  94. `;