From 24feae27f8b3601ba5a00b6333a6ee8051345d32 Mon Sep 17 00:00:00 2001 From: Mattias Andersson Date: Wed, 18 Sep 2024 12:52:05 +0200 Subject: [PATCH] Fixes for popover in nav bar and z-index on ControlledPopover (#786) * - Add zIndex and appendTo props to ControlledPopover. - NavBarPopoverButton now toggles the popover, so if the user clicks it when it is open, it closes. - NavBarButton now forwards ref, so that it works with Popover anchoring. * - Add zIndex and appendTo to NavBarPopoverButton. * - Add zIndex and appendTo to DateRangeDualTextInput. --- .../DateRangeDualTextInput.tsx | 12 +++++- .../src/components/nav-bar/NavBarButton.tsx | 32 ++++++++-------- .../nav-bar/NavBarPopoverButton.tsx | 37 +++++++++++-------- .../components/popover/ControlledPopover.tsx | 8 +++- 4 files changed, 54 insertions(+), 35 deletions(-) diff --git a/packages/calendar/src/components/input-types/date-range-dual-text-input/DateRangeDualTextInput.tsx b/packages/calendar/src/components/input-types/date-range-dual-text-input/DateRangeDualTextInput.tsx index 19a8aba0b..32ff64af0 100644 --- a/packages/calendar/src/components/input-types/date-range-dual-text-input/DateRangeDualTextInput.tsx +++ b/packages/calendar/src/components/input-types/date-range-dual-text-input/DateRangeDualTextInput.tsx @@ -4,7 +4,10 @@ import { TextInputProps, ValueAndOnValueChangeProps, } from "@stenajs-webui/forms"; -import { ControlledPopover } from "@stenajs-webui/tooltip"; +import { + ControlledPopover, + ControlledPopoverProps, +} from "@stenajs-webui/tooltip"; import { isAfter } from "date-fns"; import * as React from "react"; import { useMemo, useRef } from "react"; @@ -27,7 +30,8 @@ import { defaultMaxDate } from "../../../config/DefaultMaxDate"; export interface DateRangeDualTextInputProps extends ValueAndOnValueChangeProps, OptionalMinMaxDatesAsString, - Pick { + Pick, + Pick { onEsc?: () => void; onEnter?: () => void; onBlur?: () => void; @@ -50,6 +54,8 @@ export function DateRangeDualTextInput({ widthRight = 128, variant, disabled, + zIndex, + appendTo, }: DateRangeDualTextInputProps) { const { startDate, endDate } = value || {}; @@ -121,6 +127,8 @@ export function DateRangeDualTextInput({ hideArrow restoreFocus={false} returnFocus={false} + zIndex={zIndex} + appendTo={appendTo} renderTrigger={(props) => ( = ({ - selected, - className, - ...buttonProps -}) => { - return ( - - ); -}; +export const NavBarButton = forwardRef( + function ({ selected, className, ...buttonProps }, ref) { + return ( + + ); + } +); diff --git a/packages/panels/src/components/nav-bar/NavBarPopoverButton.tsx b/packages/panels/src/components/nav-bar/NavBarPopoverButton.tsx index a911b7efa..66adbbed5 100644 --- a/packages/panels/src/components/nav-bar/NavBarPopoverButton.tsx +++ b/packages/panels/src/components/nav-bar/NavBarPopoverButton.tsx @@ -1,8 +1,11 @@ import * as React from "react"; import { ReactNode } from "react"; import { NavBarButton, NavBarButtonProps } from "./NavBarButton"; -import { Popover } from "@stenajs-webui/tooltip"; -import { Box, Row } from "@stenajs-webui/core"; +import { + ControlledPopover, + ControlledPopoverProps, +} from "@stenajs-webui/tooltip"; +import { Box, useBoolean } from "@stenajs-webui/core"; type RenderProp = (args: RenderPropArgs) => ReactNode; @@ -11,30 +14,34 @@ interface RenderPropArgs { } export interface NavBarPopoverButtonProps - extends Omit { + extends Omit, + Pick { content?: RenderProp; } export const NavBarPopoverButton: React.FC = ({ content, children, + appendTo, + zIndex, ...navBarButtonProps }) => { + const [isOpen, , close, toggle] = useBoolean(false); + return ( - ( - - - + )} - trigger={"click"} + open={isOpen} + onRequestClose={close} + zIndex={zIndex} + appendTo={appendTo} > - {({ onRequestClose }) => ( - - {content && content({ close: onRequestClose })} - {children} - - )} - + + {content && content({ close })} + {children} + + ); }; diff --git a/packages/tooltip/src/components/popover/ControlledPopover.tsx b/packages/tooltip/src/components/popover/ControlledPopover.tsx index 1b26dfa79..2befed852 100644 --- a/packages/tooltip/src/components/popover/ControlledPopover.tsx +++ b/packages/tooltip/src/components/popover/ControlledPopover.tsx @@ -28,6 +28,8 @@ export interface ControlledPopoverProps extends PropsWithChildren { disablePadding?: boolean; restoreFocus?: boolean; returnFocus?: boolean; + appendTo?: HTMLElement | null | React.MutableRefObject; + zIndex?: number; } const ARROW_WIDTH = 12; @@ -44,6 +46,8 @@ export const ControlledPopover: React.FC = ({ onRequestClose, restoreFocus, returnFocus, + appendTo, + zIndex, }) => { const arrowRef = useRef(null); @@ -88,7 +92,7 @@ export const ControlledPopover: React.FC = ({ {renderTrigger({ ref: refs.setReference, ...getReferenceProps() })} {isMounted && ( - + = ({ >