import React from "react"; import type { IBounds } from "react-laag"; import { useLayer } from "react-laag"; import { DataEditorAll as DataEditor } from "../../data-editor-all.js"; import { BeautifulWrapper, Description, PropName, useMockDataGenerator, defaultProps, } from "../../data-editor/stories/utils.js"; import { SimpleThemeWrapper } from "../../stories/story-utils.js"; import type { GridMouseEventArgs } from "../../internal/data-grid/event-args.js"; export default { title: "Glide-Data-Grid/DataEditor Demos", decorators: [ (Story: React.ComponentType) => ( Using the onItemHovered event makes it easy to create tooltips. This story is intentionally forced to scroll vertically so layout in scrolling documents can be confirmed. }> ), ], }; const zeroBounds = { left: 0, top: 0, width: 0, height: 0, bottom: 0, right: 0, }; export const Tooltips: React.VFC = () => { const { cols, getCellContent } = useMockDataGenerator(6); const [tooltip, setTooltip] = React.useState<{ val: string; bounds: IBounds } | undefined>(); const timeoutRef = React.useRef(0); const onItemHovered = React.useCallback((args: GridMouseEventArgs) => { if (args.kind === "cell") { window.clearTimeout(timeoutRef.current); setTooltip(undefined); timeoutRef.current = window.setTimeout(() => { setTooltip({ val: `Tooltip for ${args.location[0]}, ${args.location[1]}`, bounds: { // translate to react-laag types left: args.bounds.x, top: args.bounds.y, width: args.bounds.width, height: args.bounds.height, right: args.bounds.x + args.bounds.width, bottom: args.bounds.y + args.bounds.height, }, }); }, 1000); } else { window.clearTimeout(timeoutRef.current); timeoutRef.current = 0; setTooltip(undefined); } }, []); React.useEffect(() => () => window.clearTimeout(timeoutRef.current), []); const isOpen = tooltip !== undefined; const { renderLayer, layerProps } = useLayer({ isOpen, triggerOffset: 4, auto: true, container: "portal", trigger: { getBounds: () => tooltip?.bounds ?? zeroBounds, }, }); return ( <> {isOpen && renderLayer(
{tooltip.val}
)} ); };