UNPKG

@grafana/ui

Version:
1 lines • 19.6 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 { 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\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 <div className={styles.titleWrapper}>\n <Text element=\"h3\" {...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 </div>\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 transform: 'translateX(100%)',\n transition: 'none !important',\n\n '&-active': {\n transition: `${theme.transitions.create('transform')} !important`,\n transform: 'translateX(0)',\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 transition: theme.transitions.create('opacity'),\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 titleWrapper: css({\n label: 'drawer-title',\n overflowWrap: 'break-word',\n }),\n subtitle: css({\n label: 'drawer-subtitle',\n color: theme.colors.text.secondary,\n paddingTop: theme.spacing(1),\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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"}