mirror of
https://github.com/coder/coder.git
synced 2025-07-12 00:14:10 +00:00
feat: Show help tooltip on hover (#2423)
This commit is contained in:
@ -16,7 +16,7 @@ export default {
|
|||||||
const Template: Story<HelpTooltipProps> = (args) => (
|
const Template: Story<HelpTooltipProps> = (args) => (
|
||||||
<HelpTooltip {...args}>
|
<HelpTooltip {...args}>
|
||||||
<HelpTooltipTitle>What is a template?</HelpTooltipTitle>
|
<HelpTooltipTitle>What is a template?</HelpTooltipTitle>
|
||||||
<HelpTooltipText>A template is a common configuration for your team`'`s workspaces.</HelpTooltipText>
|
<HelpTooltipText>A template is a common configuration for your team's workspaces.</HelpTooltipText>
|
||||||
<HelpTooltipLinksGroup>
|
<HelpTooltipLinksGroup>
|
||||||
<HelpTooltipLink href="https://github.com/coder/coder/">Creating a template</HelpTooltipLink>
|
<HelpTooltipLink href="https://github.com/coder/coder/">Creating a template</HelpTooltipLink>
|
||||||
<HelpTooltipLink href="https://github.com/coder/coder/">Updating a template</HelpTooltipLink>
|
<HelpTooltipLink href="https://github.com/coder/coder/">Updating a template</HelpTooltipLink>
|
||||||
|
@ -3,7 +3,7 @@ import Popover from "@material-ui/core/Popover"
|
|||||||
import { makeStyles } from "@material-ui/core/styles"
|
import { makeStyles } from "@material-ui/core/styles"
|
||||||
import HelpIcon from "@material-ui/icons/HelpOutline"
|
import HelpIcon from "@material-ui/icons/HelpOutline"
|
||||||
import OpenInNewIcon from "@material-ui/icons/OpenInNew"
|
import OpenInNewIcon from "@material-ui/icons/OpenInNew"
|
||||||
import React, { createContext, useContext, useState } from "react"
|
import React, { createContext, useContext, useRef, useState } from "react"
|
||||||
import { Stack } from "../../Stack/Stack"
|
import { Stack } from "../../Stack/Stack"
|
||||||
|
|
||||||
type Icon = typeof HelpIcon
|
type Icon = typeof HelpIcon
|
||||||
@ -29,31 +29,36 @@ const useHelpTooltip = () => {
|
|||||||
|
|
||||||
export const HelpTooltip: React.FC<HelpTooltipProps> = ({ children, open, size = "medium" }) => {
|
export const HelpTooltip: React.FC<HelpTooltipProps> = ({ children, open, size = "medium" }) => {
|
||||||
const styles = useStyles({ size })
|
const styles = useStyles({ size })
|
||||||
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null)
|
const anchorRef = useRef<HTMLButtonElement>(null)
|
||||||
open = open ?? Boolean(anchorEl)
|
const [isOpen, setIsOpen] = useState(!!open)
|
||||||
const id = open ? "help-popover" : undefined
|
const id = isOpen ? "help-popover" : undefined
|
||||||
|
|
||||||
const onClose = () => {
|
const onClose = () => {
|
||||||
setAnchorEl(null)
|
setIsOpen(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<button
|
<button
|
||||||
|
ref={anchorRef}
|
||||||
aria-describedby={id}
|
aria-describedby={id}
|
||||||
className={styles.button}
|
className={styles.button}
|
||||||
onClick={(event) => {
|
onClick={(event) => {
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
setAnchorEl(event.currentTarget)
|
setIsOpen(true)
|
||||||
|
}}
|
||||||
|
onMouseEnter={() => {
|
||||||
|
setIsOpen(true)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<HelpIcon className={styles.icon} />
|
<HelpIcon className={styles.icon} />
|
||||||
</button>
|
</button>
|
||||||
<Popover
|
<Popover
|
||||||
|
className={styles.popover}
|
||||||
classes={{ paper: styles.popoverPaper }}
|
classes={{ paper: styles.popoverPaper }}
|
||||||
id={id}
|
id={id}
|
||||||
open={open}
|
open={isOpen}
|
||||||
anchorEl={anchorEl}
|
anchorEl={anchorRef.current}
|
||||||
onClose={onClose}
|
onClose={onClose}
|
||||||
anchorOrigin={{
|
anchorOrigin={{
|
||||||
vertical: "bottom",
|
vertical: "bottom",
|
||||||
@ -63,8 +68,16 @@ export const HelpTooltip: React.FC<HelpTooltipProps> = ({ children, open, size =
|
|||||||
vertical: "top",
|
vertical: "top",
|
||||||
horizontal: "left",
|
horizontal: "left",
|
||||||
}}
|
}}
|
||||||
|
PaperProps={{
|
||||||
|
onMouseEnter: () => {
|
||||||
|
setIsOpen(true)
|
||||||
|
},
|
||||||
|
onMouseLeave: () => {
|
||||||
|
setIsOpen(false)
|
||||||
|
},
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<HelpTooltipContext.Provider value={{ open, onClose }}>{children}</HelpTooltipContext.Provider>
|
<HelpTooltipContext.Provider value={{ open: isOpen, onClose }}>{children}</HelpTooltipContext.Provider>
|
||||||
</Popover>
|
</Popover>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
@ -166,11 +179,16 @@ const useStyles = makeStyles((theme) => ({
|
|||||||
height: ({ size }: { size?: Size }) => theme.spacing(getIconSpacingFromSize(size)),
|
height: ({ size }: { size?: Size }) => theme.spacing(getIconSpacingFromSize(size)),
|
||||||
},
|
},
|
||||||
|
|
||||||
|
popover: {
|
||||||
|
pointerEvents: "none",
|
||||||
|
},
|
||||||
|
|
||||||
popoverPaper: {
|
popoverPaper: {
|
||||||
marginTop: theme.spacing(0.5),
|
marginTop: theme.spacing(0.5),
|
||||||
width: theme.spacing(38),
|
width: theme.spacing(38),
|
||||||
padding: theme.spacing(2.5),
|
padding: theme.spacing(2.5),
|
||||||
color: theme.palette.text.secondary,
|
color: theme.palette.text.secondary,
|
||||||
|
pointerEvents: "auto",
|
||||||
},
|
},
|
||||||
|
|
||||||
title: {
|
title: {
|
||||||
|
Reference in New Issue
Block a user