UNPKG

@grafana/ui

Version:
1 lines • 20.7 kB
{"version":3,"file":"Drawer.mjs","sources":["../../../../src/components/Drawer/Drawer.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay } from '@react-aria/overlays';\nimport RcDrawer from 'rc-drawer';\nimport { ReactNode, useCallback, useEffect, useState } from 'react';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { getDragStyles } from '../DragHandle/DragHandle';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Stack } from '../Layout/Stack/Stack';\nimport { ScrollContainer } from '../ScrollContainer/ScrollContainer';\nimport { Text } from '../Text/Text';\n\nimport 'rc-drawer/assets/index.css';\n\nexport interface Props {\n children: ReactNode;\n /** Title shown at the top of the drawer */\n title?: ReactNode;\n /** Subtitle shown below the title */\n subtitle?: ReactNode;\n /** Should the Drawer be closable by clicking on the mask, defaults to true */\n closeOnMaskClick?: boolean;\n /** @deprecated */\n inline?: boolean;\n /**\n * @deprecated use the size property instead\n **/\n width?: number | string;\n /**\n * @deprecated use a large size instead if high width is needed\n **/\n expandable?: boolean;\n /**\n * Specifies the width and min-width.\n * sm = width 25vw & min-width 384px\n * md = width 50vw & min-width 568px\n * lg = width 75vw & min-width 744px\n **/\n size?: 'sm' | 'md' | 'lg';\n /** Tabs */\n tabs?: React.ReactNode;\n /**\n * Whether the content should be wrapped in a ScrollContainer\n * Only change this if you intend to manage scroll behaviour yourself\n * (e.g. having a split pane with independent scrolling)\n **/\n scrollableContent?: boolean;\n /** Callback for closing the drawer */\n onClose: () => void;\n}\n\nconst drawerSizes = {\n sm: { width: '25vw', minWidth: 384 },\n md: { width: '50vw', minWidth: 568 },\n lg: { width: '75vw', minWidth: 744 },\n};\n\n/**\n * Drawer is a slide in overlay that can be used to display additional information without hiding the main page content. It can be anchored to the left or right edge of the screen.\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/overlays-drawer--docs\n */\nexport function Drawer({\n children,\n onClose,\n closeOnMaskClick = true,\n scrollableContent = true,\n title,\n subtitle,\n width,\n size = 'md',\n tabs,\n}: Props) {\n const [drawerWidth, onMouseDown, onTouchStart] = useResizebleDrawer();\n\n const styles = useStyles2(getStyles);\n const wrapperStyles = useStyles2(getWrapperStyles, size);\n const dragStyles = useStyles2(getDragStyles);\n\n const overlayRef = React.useRef(null);\n const { dialogProps, titleProps } = useDialog({}, overlayRef);\n const { overlayProps } = useOverlay(\n {\n isDismissable: false,\n isOpen: true,\n onClose,\n },\n overlayRef\n );\n\n // Adds body class while open so the toolbar nav can hide some actions while drawer is open\n useBodyClassWhileOpen();\n\n const content = <div className={styles.content}>{children}</div>;\n const overrideWidth = drawerWidth ?? width ?? drawerSizes[size].width;\n const minWidth = drawerSizes[size].minWidth;\n\n return (\n <RcDrawer\n open={true}\n onClose={onClose}\n placement=\"right\"\n getContainer={'.main-view'}\n className={styles.drawerContent}\n rootClassName={styles.drawer}\n classNames={{\n wrapper: wrapperStyles,\n }}\n styles={{\n wrapper: {\n width: overrideWidth,\n minWidth,\n },\n }}\n width={''}\n motion={{\n motionAppear: true,\n motionName: styles.drawerMotion,\n }}\n maskClassName={styles.mask}\n maskClosable={closeOnMaskClick}\n maskMotion={{\n motionAppear: true,\n motionName: styles.maskMotion,\n }}\n >\n <FocusScope restoreFocus contain autoFocus>\n <div\n aria-label={\n typeof title === 'string'\n ? selectors.components.Drawer.General.title(title)\n : selectors.components.Drawer.General.title('no title')\n }\n className={styles.container}\n {...overlayProps}\n {...dialogProps}\n ref={overlayRef}\n >\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n className={cx(dragStyles.dragHandleVertical, styles.resizer)}\n onMouseDown={onMouseDown}\n onTouchStart={onTouchStart}\n />\n <div className={cx(styles.header, Boolean(tabs) && styles.headerWithTabs)}>\n <div className={styles.actions}>\n <IconButton\n name=\"times\"\n variant=\"secondary\"\n onClick={onClose}\n data-testid={selectors.components.Drawer.General.close}\n tooltip={t(`grafana-ui.drawer.close`, 'Close')}\n />\n </div>\n {typeof title === 'string' ? (\n <Stack direction=\"column\">\n <Text element=\"h3\" truncate {...titleProps}>\n {title}\n </Text>\n {subtitle && (\n <div className={styles.subtitle} data-testid={selectors.components.Drawer.General.subtitle}>\n {subtitle}\n </div>\n )}\n </Stack>\n ) : (\n title\n )}\n {tabs && <div className={styles.tabsWrapper}>{tabs}</div>}\n </div>\n {!scrollableContent ? content : <ScrollContainer showScrollIndicators>{content}</ScrollContainer>}\n </div>\n </FocusScope>\n </RcDrawer>\n );\n}\n\nfunction useResizebleDrawer(): [\n string | undefined,\n React.EventHandler<React.MouseEvent>,\n React.EventHandler<React.TouchEvent>,\n] {\n const [drawerWidth, setDrawerWidth] = useState<string | undefined>(undefined);\n\n const onMouseMove = useCallback((e: MouseEvent) => {\n setDrawerWidth(getCustomDrawerWidth(e.clientX));\n }, []);\n\n const onTouchMove = useCallback((e: TouchEvent) => {\n const touch = e.touches[0];\n setDrawerWidth(getCustomDrawerWidth(touch.clientX));\n }, []);\n\n const onMouseUp = useCallback(\n (e: MouseEvent) => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n },\n [onMouseMove]\n );\n\n const onTouchEnd = useCallback(\n (e: TouchEvent) => {\n document.removeEventListener('touchmove', onTouchMove);\n document.removeEventListener('touchend', onTouchEnd);\n },\n [onTouchMove]\n );\n\n function onMouseDown(e: React.MouseEvent<HTMLDivElement>) {\n e.stopPropagation();\n e.preventDefault();\n // we will only add listeners when needed, and remove them afterward\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }\n\n function onTouchStart(e: React.TouchEvent<HTMLDivElement>) {\n e.stopPropagation();\n e.preventDefault();\n // we will only add listeners when needed, and remove them afterward\n document.addEventListener('touchmove', onTouchMove);\n document.addEventListener('touchend', onTouchEnd);\n }\n\n return [drawerWidth, onMouseDown, onTouchStart];\n}\n\nfunction getCustomDrawerWidth(clientX: number) {\n let offsetRight = document.body.offsetWidth - (clientX - document.body.offsetLeft);\n let widthPercent = Math.min((offsetRight / document.body.clientWidth) * 100, 98).toFixed(2);\n return `${widthPercent}vw`;\n}\n\nfunction useBodyClassWhileOpen() {\n useEffect(() => {\n if (!document.body) {\n return;\n }\n\n document.body.classList.add('body-drawer-open');\n\n return () => {\n document.body.classList.remove('body-drawer-open');\n };\n }, []);\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css({\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n flex: '1 1 0',\n minHeight: '100%',\n position: 'relative',\n }),\n drawer: css({\n top: 0,\n\n '.rc-drawer-content-wrapper': {\n boxShadow: theme.shadows.z3,\n },\n }),\n drawerContent: css({\n backgroundColor: `${theme.colors.background.primary} !important`,\n display: 'flex',\n overflow: 'unset !important',\n flexDirection: 'column',\n }),\n drawerMotion: css({\n '&-appear': {\n [theme.transitions.handleMotion('no-preference')]: {\n transform: 'translateX(100%)',\n transition: 'none !important',\n },\n [theme.transitions.handleMotion('reduce')]: {\n opacity: 0,\n },\n '&-active': {\n [theme.transitions.handleMotion('no-preference')]: {\n transform: 'translateX(0)',\n transition: `${theme.transitions.create('transform')} !important`,\n },\n [theme.transitions.handleMotion('reduce')]: {\n transition: `opacity 0.2s ease-in-out`,\n opacity: 1,\n },\n },\n },\n }),\n // we want the mask itself to span the whole page including the top bar\n // this ensures trying to click something in the top bar will close the drawer correctly\n // but we don't want the backdrop styling to apply over the top bar as it looks weird\n // instead have a child pseudo element to apply the backdrop styling below the top bar\n mask: css({\n // The !important here is to override the default .rc-drawer-mask styles\n backgroundColor: 'transparent !important',\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n position: 'fixed !important' as 'fixed',\n\n '&:before': {\n backgroundColor: `${theme.components.overlay.background} !important`,\n bottom: 0,\n content: '\"\"',\n left: 0,\n position: 'fixed',\n right: 0,\n top: 0,\n },\n }),\n maskMotion: css({\n '&-appear': {\n opacity: 0,\n\n '&-active': {\n opacity: 1,\n [theme.transitions.handleMotion('no-preference', 'reduce')]: {\n transition: theme.transitions.create('opacity'),\n },\n },\n },\n }),\n header: css({\n label: 'drawer-header',\n flexGrow: 0,\n padding: theme.spacing(2, 2, 3),\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n }),\n headerWithTabs: css({\n borderBottom: 'none',\n }),\n actions: css({\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n }),\n subtitle: css({\n label: 'drawer-subtitle',\n color: theme.colors.text.secondary,\n }),\n content: css({\n padding: theme.spacing(theme.components.drawer?.padding ?? 2),\n height: '100%',\n flexGrow: 1,\n minHeight: 0,\n }),\n tabsWrapper: css({\n label: 'drawer-tabs',\n paddingLeft: theme.spacing(2),\n margin: theme.spacing(1, -1, -3, -3),\n }),\n resizer: css({\n top: 0,\n left: theme.spacing(-1),\n bottom: 0,\n position: 'absolute',\n zIndex: theme.zIndex.modal,\n }),\n };\n};\n\nfunction getWrapperStyles(theme: GrafanaTheme2, size: 'sm' | 'md' | 'lg') {\n return css({\n label: `drawer-content-wrapper-${size}`,\n overflow: 'unset !important',\n\n [theme.breakpoints.down('md')]: {\n width: `calc(100% - ${theme.spacing(2)}) !important`,\n minWidth: '0 !important',\n },\n });\n}\n"],"names":[],"mappings":"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"}