Fix date separator trigger ref forwarding for jump-to-date menu (#33102)
* Fix date separator trigger ref forwarding for jump-to-date menu * Normal forwarded ref is sufficient for the menu-button setup in Compound * Better comment
This commit is contained in:
+9
-13
@@ -5,7 +5,7 @@
|
|||||||
* Please see LICENSE files in the repository root for full details.
|
* Please see LICENSE files in the repository root for full details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from "react";
|
import React, { forwardRef } from "react";
|
||||||
import { Heading, Tooltip } from "@vector-im/compound-web";
|
import { Heading, Tooltip } from "@vector-im/compound-web";
|
||||||
import ChevronDownIcon from "@vector-im/compound-design-tokens/assets/web/icons/chevron-down";
|
import ChevronDownIcon from "@vector-im/compound-design-tokens/assets/web/icons/chevron-down";
|
||||||
|
|
||||||
@@ -20,8 +20,6 @@ export interface DateSeparatorButtonProps {
|
|||||||
tooltipOpen?: boolean;
|
tooltipOpen?: boolean;
|
||||||
/** Extra CSS classes to apply to the component. */
|
/** Extra CSS classes to apply to the component. */
|
||||||
className?: string;
|
className?: string;
|
||||||
/** Optional ref for the button container element. */
|
|
||||||
buttonRef?: React.Ref<HTMLDivElement>;
|
|
||||||
/** Called when the pointer enters the button trigger. */
|
/** Called when the pointer enters the button trigger. */
|
||||||
onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;
|
onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;
|
||||||
/** Called when the pointer leaves the button trigger. */
|
/** Called when the pointer leaves the button trigger. */
|
||||||
@@ -32,19 +30,17 @@ export interface DateSeparatorButtonProps {
|
|||||||
onBlur?: React.FocusEventHandler<HTMLDivElement>;
|
onBlur?: React.FocusEventHandler<HTMLDivElement>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Interactive date separator button that opens the jump-to-date menu. */
|
/** Interactive date separator button that forwards its ref to the underlying trigger element used by Compound Menu. */
|
||||||
export function DateSeparatorButton({
|
export const DateSeparatorButton = forwardRef<HTMLDivElement, DateSeparatorButtonProps>(function DateSeparatorButton(
|
||||||
label,
|
{ label, tooltipOpen, className, ...props },
|
||||||
tooltipOpen,
|
forwardedRef,
|
||||||
className,
|
): React.ReactNode {
|
||||||
buttonRef,
|
|
||||||
...props
|
|
||||||
}: DateSeparatorButtonProps): React.ReactNode {
|
|
||||||
const { translate: _t } = useI18n();
|
const { translate: _t } = useI18n();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Tooltip description={_t("room|jump_to_date")} placement="right" open={tooltipOpen}>
|
<Tooltip description={_t("room|jump_to_date")} placement="right" open={tooltipOpen}>
|
||||||
<Flex
|
<Flex
|
||||||
ref={buttonRef}
|
ref={forwardedRef}
|
||||||
data-testid="jump-to-date-separator-button"
|
data-testid="jump-to-date-separator-button"
|
||||||
className={className}
|
className={className}
|
||||||
aria-live="off"
|
aria-live="off"
|
||||||
@@ -60,4 +56,4 @@ export function DateSeparatorButton({
|
|||||||
</Flex>
|
</Flex>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
);
|
);
|
||||||
}
|
});
|
||||||
|
|||||||
+10
-1
@@ -7,12 +7,13 @@
|
|||||||
|
|
||||||
import { render, screen } from "@test-utils";
|
import { render, screen } from "@test-utils";
|
||||||
import { composeStories } from "@storybook/react-vite";
|
import { composeStories } from "@storybook/react-vite";
|
||||||
import React from "react";
|
import React, { createRef } from "react";
|
||||||
import { describe, it, expect } from "vitest";
|
import { describe, it, expect } from "vitest";
|
||||||
import { waitFor } from "@testing-library/react";
|
import { waitFor } from "@testing-library/react";
|
||||||
import userEvent from "@testing-library/user-event";
|
import userEvent from "@testing-library/user-event";
|
||||||
|
|
||||||
import { BaseViewModel } from "../../../core/viewmodel/BaseViewModel";
|
import { BaseViewModel } from "../../../core/viewmodel/BaseViewModel";
|
||||||
|
import { DateSeparatorButton } from "./DateSeparatorButton";
|
||||||
import { DateSeparatorView, type DateSeparatorViewModel, type DateSeparatorViewSnapshot } from "./DateSeparatorView";
|
import { DateSeparatorView, type DateSeparatorViewModel, type DateSeparatorViewSnapshot } from "./DateSeparatorView";
|
||||||
import * as stories from "./DateSeparatorView.stories";
|
import * as stories from "./DateSeparatorView.stories";
|
||||||
|
|
||||||
@@ -73,4 +74,12 @@ describe("DateSeparatorView", () => {
|
|||||||
vm.setSnapshot({ label: "Yesterday" });
|
vm.setSnapshot({ label: "Yesterday" });
|
||||||
await waitFor(() => expect(screen.getByText("Yesterday", { selector: "h2" })).toBeInTheDocument());
|
await waitFor(() => expect(screen.getByText("Yesterday", { selector: "h2" })).toBeInTheDocument());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("forwards refs to the trigger element", () => {
|
||||||
|
const ref = createRef<HTMLDivElement>();
|
||||||
|
|
||||||
|
render(<DateSeparatorButton ref={ref} label="Today" />);
|
||||||
|
|
||||||
|
expect(ref.current).toBe(screen.getByTestId("jump-to-date-separator-button"));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user