widgetBuilderSlideout.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import styled from '@emotion/styled';
  2. import {Button} from 'sentry/components/button';
  3. import SlideOverPanel from 'sentry/components/slideOverPanel';
  4. import {IconClose} from 'sentry/icons';
  5. import {t} from 'sentry/locale';
  6. import {space} from 'sentry/styles/space';
  7. import WidgetBuilderDatasetSelector from 'sentry/views/dashboards/widgetBuilder/components/datasetSelector';
  8. import DevBuilder from 'sentry/views/dashboards/widgetBuilder/components/devBuilder';
  9. import WidgetBuilderFilterBar from 'sentry/views/dashboards/widgetBuilder/components/filtersBar';
  10. import WidgetBuilderNameAndDescription from 'sentry/views/dashboards/widgetBuilder/components/nameAndDescFields';
  11. type WidgetBuilderSlideoutProps = {
  12. isOpen: boolean;
  13. onClose: () => void;
  14. };
  15. function WidgetBuilderSlideout({isOpen, onClose}: WidgetBuilderSlideoutProps) {
  16. return (
  17. <SlideOverPanel collapsed={!isOpen} slidePosition="left">
  18. <SlideoutHeaderWrapper>
  19. <SlideoutTitle>{t('Create Custom Widget')}</SlideoutTitle>
  20. <CloseButton
  21. priority="link"
  22. size="zero"
  23. borderless
  24. aria-label={t('Close Widget Builder')}
  25. icon={<IconClose size="sm" />}
  26. onClick={onClose}
  27. >
  28. {t('Close')}
  29. </CloseButton>
  30. </SlideoutHeaderWrapper>
  31. <SlideoutBodyWrapper>
  32. <Section>
  33. <WidgetBuilderFilterBar />
  34. </Section>
  35. <Section>
  36. <WidgetBuilderDatasetSelector />
  37. </Section>
  38. <Section>
  39. <WidgetBuilderNameAndDescription />
  40. </Section>
  41. <DevBuilder />
  42. </SlideoutBodyWrapper>
  43. </SlideOverPanel>
  44. );
  45. }
  46. export default WidgetBuilderSlideout;
  47. const CloseButton = styled(Button)`
  48. color: ${p => p.theme.gray300};
  49. height: fit-content;
  50. &:hover {
  51. color: ${p => p.theme.gray400};
  52. }
  53. z-index: 100;
  54. `;
  55. const SlideoutTitle = styled('h5')`
  56. margin: 0;
  57. `;
  58. const SlideoutHeaderWrapper = styled('div')`
  59. padding: ${space(3)} ${space(4)};
  60. display: flex;
  61. align-items: center;
  62. justify-content: space-between;
  63. border-bottom: 1px solid ${p => p.theme.border};
  64. `;
  65. const SlideoutBodyWrapper = styled('div')`
  66. padding: ${space(4)};
  67. `;
  68. const Section = styled('div')`
  69. margin-bottom: ${space(4)};
  70. `;