addWidget.tsx 2.1 KB

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