Skip to content

Commit a2cd8f9

Browse files
authored
[core] Adding popoverRef to PopoverNext (#8109)
1 parent 905dd8f commit a2cd8f9

4 files changed

Lines changed: 37 additions & 1 deletion

File tree

packages/core/src/components/popover-next/popoverNext.test.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import { render, screen, waitFor } from "@testing-library/react";
66
import userEvent from "@testing-library/user-event";
7+
import { createRef } from "react";
78

89
import { afterAll, beforeEach, describe, expect, it, vi } from "@blueprintjs/test-commons/vitest";
910

@@ -236,6 +237,32 @@ describe("<PopoverNext>", () => {
236237
expect(popoverElement).toHaveClass(Classes.DARK);
237238
});
238239

240+
it("attaches popoverRef to the popover element", async () => {
241+
const popoverRef = createRef<HTMLDivElement>();
242+
const { container } = render(
243+
<PopoverNext content="content" isOpen={true} popoverRef={popoverRef} usePortal={false}>
244+
<Button text="target" />
245+
</PopoverNext>,
246+
);
247+
248+
await waitFor(() => expect(screen.getByText("content")).toBeInTheDocument());
249+
250+
const popoverElement = container.querySelector(`.${Classes.POPOVER}`);
251+
expect(popoverElement).toBeInTheDocument();
252+
expect(popoverRef.current).toBe(popoverElement);
253+
});
254+
255+
it("popoverRef returns null when closed", () => {
256+
const ref = createRef<HTMLDivElement>();
257+
render(
258+
<PopoverNext popoverRef={ref} content="content" isOpen={false}>
259+
<Button text="target" />
260+
</PopoverNext>,
261+
);
262+
263+
expect(ref.current).toBeNull();
264+
});
265+
239266
it("renders with aria-haspopup attr", () => {
240267
const { container } = render(
241268
<PopoverNext content="content" isOpen={true}>

packages/core/src/components/popover-next/popoverNext.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export const PopoverNext = forwardRef<PopoverNextRef, PopoverNextProps>((props,
4141
onClose,
4242
onInteraction,
4343
openOnTargetFocus = true,
44+
popoverRef,
4445
placement,
4546
positioningStrategy = "absolute",
4647
renderTarget,
@@ -399,6 +400,7 @@ export const PopoverNext = forwardRef<PopoverNextRef, PopoverNextProps>((props,
399400
hasDarkParent={hasDarkParent}
400401
isClosingViaEscapeKeypress={isClosingViaEscapeKeypress}
401402
isHoverInteractionKind={isHoverInteractionKind}
403+
popoverRef={popoverRef}
402404
shouldReturnFocusOnClose={shouldReturnFocusOnClose}
403405
{...props}
404406
/>

packages/core/src/components/popover-next/popoverNextProps.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,11 @@ export interface PopoverNextProps<T extends DefaultPopoverTargetHTMLProps = Defa
283283
*/
284284
openOnTargetFocus?: boolean;
285285

286+
/**
287+
* DOM ref attached to the `Classes.POPOVER` element.
288+
*/
289+
popoverRef?: React.Ref<HTMLDivElement>;
290+
286291
/**
287292
* The placement (relative to the target) at which the popover should appear.
288293
* Mutually exclusive with `position` prop. Prefer using this over `position`,
@@ -476,6 +481,7 @@ export interface PopoverPopupProps
476481
| "onOpened"
477482
| "onOpening"
478483
| "popoverClassName"
484+
| "popoverRef"
479485
| "portalClassName"
480486
| "portalContainer"
481487
| "shouldReturnFocusOnClose"

packages/core/src/components/popover-next/popoverPopup.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export function PopoverPopup(props: PopoverPopupProps) {
4242
onOpened,
4343
onOpening,
4444
popoverClassName,
45+
popoverRef,
4546
portalClassName,
4647
portalContainer,
4748
transitionDuration = 300,
@@ -139,7 +140,7 @@ export function PopoverPopup(props: PopoverPopupProps) {
139140
ref={mergeRefs(floatingData.refs.setFloating, transitionContainerElement)}
140141
{...popoverHandlers}
141142
>
142-
<div className={popoverClasses} style={{ transformOrigin }}>
143+
<div className={popoverClasses} ref={popoverRef} style={{ transformOrigin }}>
143144
{arrow && (
144145
<PopoverArrow
145146
arrowProps={{ ref: arrowRef, style: arrowStyle }}

0 commit comments

Comments
 (0)