Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
fba9492
refactor: replace Popover with Tooltip in AgentLatency
aqandrew Aug 28, 2025
e230f38
refactor: replace PopoverTrigger with TooltipTrigger in AgentStatus
aqandrew Aug 28, 2025
75c9fdf
refactor: replace PopoverTrigger with TooltipTrigger in
aqandrew Aug 28, 2025
bea24d8
fix: remove HelpTooltipText from AgentLatency (div inside p)
aqandrew Aug 28, 2025
9e6fa0c
fix: add TooltipProvider to AuditHelpTooltip
aqandrew Aug 28, 2025
303222b
fix: add TooltipProvider to ConnectionLogHelpTooltip,
aqandrew Aug 28, 2025
f835cb1
fix: add TooltipProvider to PublishTemplateVersionDialog
aqandrew Aug 28, 2025
dd7e233
fix: add TooltipProvider to TemplateHelpTooltip
aqandrew Aug 29, 2025
d397fff
fix: add TooltipProvider to WorkspaceHelpTooltip
aqandrew Aug 29, 2025
6134bad
fix: add TooltipProvider to WorkspaceOurdatedTooltip
aqandrew Aug 29, 2025
ad562be
fix: add TooltipProvider to SubAgentOutdatedTooltip
aqandrew Aug 29, 2025
d30170c
fix: add TooltipProvider to EditRolesButton
aqandrew Aug 29, 2025
4438af8
fix: add TooltipProvider to AutoCreateMissingGroupsHelpTooltip and
aqandrew Aug 29, 2025
00b70ea
refactor: extract TooltipProvder to definition of HelpTooltip
aqandrew Aug 29, 2025
c59daf3
refactor: remove extract TooltipProvider from DevContainerStartError
aqandrew Aug 29, 2025
3aeaa49
test: add PublishDTemplateVersionDialog story
aqandrew Aug 29, 2025
eaf3baf
chore: remove unused import
aqandrew Aug 29, 2025
c93e092
refactor: rename Tooltip to MUITooltip
aqandrew Aug 29, 2025
ef6cceb
refactor: replace Popover in OwnerBreadcrumb, WorkspaceBreadcrumb,
aqandrew Aug 29, 2025
c142b5a
chore: check:fix
aqandrew Aug 29, 2025
143e33e
Merge branch 'main' into aqandrew/replace-popover-in-helptooltip
aqandrew Aug 29, 2025
d22a040
chore: lint:fix
aqandrew Aug 29, 2025
2ff9e66
test: expect elements + text content rendered by HelpTooltip
aqandrew Aug 29, 2025
ed5bf98
Revert "refactor: rename Tooltip to MUITooltip"
aqandrew Aug 29, 2025
ff6c794
refactor: replace deprecated Popover in IconField
aqandrew Aug 30, 2025
9887b09
refactor: move default collisionPadding from HelpTooltip to Popover
aqandrew Sep 2, 2025
d859688
refactor: replace deprecated Popover in SelectMenu
aqandrew Sep 3, 2025
bda70b2
style: prettier
aqandrew Sep 3, 2025
6a37c49
refactor: replace deprecated Popover in DeploymentDropdown
aqandrew Sep 3, 2025
6921bbe
style: prettier
aqandrew Sep 3, 2025
423bddc
refactor: replace deprecated Popover in UserDropdown
aqandrew Sep 3, 2025
81a70f3
refactor: remove redundant open state var from UserDropdown
aqandrew Sep 3, 2025
949698b
refactor: replace deprecated Popover in UserDropdownContent.test
aqandrew Sep 3, 2025
8207137
refactor: replace deprecated Popover in PortForwardButton
aqandrew Sep 3, 2025
a6cf0da
refactor: replace deprecated Popover in EditRolesButton
aqandrew Sep 3, 2025
183d163
refactor: replace deprecated Popover in ProvisionerTagsPopover
aqandrew Sep 3, 2025
1242cbe
refactor: replace deprecated Popover in WorkspacesButton
aqandrew Sep 3, 2025
1f9acc3
refactor: replace deprecated Popover in BuildParametersPopover
aqandrew Sep 3, 2025
244792a
refactor: extract TemplateInsightsControls component
aqandrew Sep 4, 2025
07fd1e2
test: use set past dateRange
aqandrew Sep 4, 2025
8bd2cd0
test: add play functions to TemplateInsightsControls.stories
aqandrew Sep 4, 2025
bdacfb1
refactor: replace deprecated Popover in DateRange
aqandrew Sep 4, 2025
9e7b432
fix: remove unknown props from PopoverContent
aqandrew Sep 4, 2025
5ba7da8
chore: check:fix
aqandrew Sep 4, 2025
85611c3
refactor: don't export ClassName type
aqandrew Sep 4, 2025
259e8a3
test: expect elements rendered by Popover
aqandrew Sep 5, 2025
7b62b8a
test: add third mock organization to CreateOrganizationPageView
aqandrew Sep 9, 2025
5e97617
test: add third mock group to IdpSyncPageView stories
aqandrew Sep 9, 2025
b371230
refactor: replace other deprecated Popovers which open on hover
aqandrew Sep 9, 2025
a869695
refactor: rename Tooltip to MUITooltip
aqandrew Sep 9, 2025
942842f
refactor: replace deprecated Popover in UserRoleCell
aqandrew Sep 10, 2025
44e14ac
refactor: replace deprecated Popover in UserGroupsCell
aqandrew Sep 10, 2025
b2370af
refactor: replace deprecated Popover in Notifications
aqandrew Sep 10, 2025
f75a147
refactor: factor out type import
aqandrew Sep 10, 2025
ef1bfef
chore: delete deprecated Popover
aqandrew Sep 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions site/src/components/Filter/SelectFilter.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { Meta, StoryObj } from "@storybook/react-vite";
import { Avatar } from "components/Avatar/Avatar";
import { useState } from "react";
import { action } from "storybook/actions";
import { expect, userEvent, within } from "storybook/test";
import { expect, screen, userEvent, within } from "storybook/test";
import {
SelectFilter,
type SelectFilterOption,
Expand Down Expand Up @@ -88,7 +88,7 @@ export const SelectingOption: Story = {
const canvas = within(canvasElement);
const button = canvas.getByRole("button");
await userEvent.click(button);
const option = canvas.getByText("Option 25");
const option = screen.getByText("Option 25");
await userEvent.click(option);
await expect(button).toHaveTextContent("Option 25");
},
Expand All @@ -102,7 +102,7 @@ export const UnselectingOption: Story = {
const canvas = within(canvasElement);
const button = canvas.getByRole("button");
await userEvent.click(button);
const menu = canvasElement.querySelector<HTMLElement>("[role=menu]")!;
const menu = screen.getByRole("menu");
const option = within(menu).getByText("Option 26");
await userEvent.click(option);
await expect(button).toHaveTextContent("All options");
Expand Down Expand Up @@ -140,7 +140,7 @@ export const SearchingOption: Story = {
const canvas = within(canvasElement);
const button = canvas.getByRole("button");
await userEvent.click(button);
const search = canvas.getByLabelText("Search options");
const search = screen.getByLabelText("Search options");
await userEvent.type(search, "option-2");
},
};
2 changes: 1 addition & 1 deletion site/src/components/Filter/SelectFilter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ export const SelectFilter: FC<SelectFilterProps> = ({
</SelectMenuButton>
</SelectMenuTrigger>
<SelectMenuContent
horizontal="right"
align="end"
css={{
"& .MuiPaper-root": {
// When including selectFilterSearch, we aim for the width to be as
Expand Down
61 changes: 29 additions & 32 deletions site/src/components/HelpTooltip/HelpTooltip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,17 @@ import {
css,
type Interpolation,
type Theme,
useTheme,
} from "@emotion/react";
import Link from "@mui/material/Link";
import {
Popover,
PopoverContent,
type PopoverContentProps,
type PopoverProps,
PopoverTrigger,
usePopover,
} from "components/deprecated/Popover/Popover";
import type { TooltipProps } from "@radix-ui/react-tooltip";
import { Stack } from "components/Stack/Stack";
import {
Tooltip,
TooltipContent,
type TooltipContentProps,
TooltipProvider,
TooltipTrigger,
} from "components/Tooltip/Tooltip";
import { CircleHelpIcon, ExternalLinkIcon } from "lucide-react";
import {
type FC,
Expand All @@ -23,31 +22,35 @@ import {
type PropsWithChildren,
type ReactNode,
} from "react";
import { cn } from "utils/cn";

type Icon = typeof CircleHelpIcon;

type Size = "small" | "medium";

export const HelpTooltipIcon = CircleHelpIcon;

export const HelpTooltip: FC<PopoverProps> = (props) => {
return <Popover mode="hover" {...props} />;
export const HelpTooltip: FC<TooltipProps> = (props) => {
return (
<TooltipProvider>
<Tooltip delayDuration={0} {...props} />
</TooltipProvider>
);
};

export const HelpTooltipContent: FC<PopoverContentProps> = (props) => {
const theme = useTheme();

export const HelpTooltipContent: FC<TooltipContentProps> = ({
className,
...props
}) => {
return (
<PopoverContent
<TooltipContent
side="bottom"
align="start"
{...props}
css={{
"& .MuiPaper-root": {
fontSize: 14,
width: 304,
padding: 20,
color: theme.palette.text.secondary,
},
}}
className={cn(
"w-[320px] p-5 bg-surface-secondary border-surface-quaternary text-sm",
className,
)}
/>
);
};
Expand Down Expand Up @@ -76,7 +79,7 @@ export const HelpTooltipTrigger = forwardRef<
});

return (
<PopoverTrigger>
<TooltipTrigger asChild>
<button
{...buttonProps}
aria-label="More info"
Expand All @@ -102,7 +105,7 @@ export const HelpTooltipTrigger = forwardRef<
>
{children}
</button>
</PopoverTrigger>
</TooltipTrigger>
);
});

Expand Down Expand Up @@ -155,18 +158,12 @@ export const HelpTooltipAction: FC<HelpTooltipActionProps> = ({
onClick,
ariaLabel,
}) => {
const popover = usePopover();

return (
<button
type="button"
aria-label={ariaLabel ?? ""}
css={styles.action}
onClick={(event) => {
event.stopPropagation();
onClick();
popover.setOpen(false);
}}
onClick={onClick}
>
<Icon css={styles.actionIcon} />
{children}
Expand Down
25 changes: 11 additions & 14 deletions site/src/components/IconField/IconField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ import InputAdornment from "@mui/material/InputAdornment";
import TextField, { type TextFieldProps } from "@mui/material/TextField";
import { visuallyHidden } from "@mui/utils";
import { Button } from "components/Button/Button";
import { ExternalImage } from "components/ExternalImage/ExternalImage";
import { Loader } from "components/Loader/Loader";
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "components/deprecated/Popover/Popover";
import { ExternalImage } from "components/ExternalImage/ExternalImage";
import { Loader } from "components/Loader/Loader";
} from "components/Popover/Popover";
import { ChevronDownIcon } from "lucide-react";
import { type FC, lazy, Suspense, useState } from "react";

Expand Down Expand Up @@ -80,24 +80,21 @@ export const IconField: FC<IconFieldProps> = ({

<Global
styles={css`
em-emoji-picker {
--rgb-background: ${theme.palette.background.paper};
--rgb-input: ${theme.palette.primary.main};
--rgb-color: ${theme.palette.text.primary};

// Hack to prevent the right side from being cut off
width: 350px;
}
`}
em-emoji-picker {
--rgb-background: ${theme.palette.background.paper};
--rgb-input: ${theme.palette.primary.main};
--rgb-color: ${theme.palette.text.primary};
}
`}
/>
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger>
<PopoverTrigger asChild>
<Button variant="outline" size="lg" className="flex-shrink-0">
Emoji
<ChevronDownIcon />
</Button>
</PopoverTrigger>
<PopoverContent id="emoji" horizontal="right">
<PopoverContent id="emoji" side="bottom" align="end" className="w-min">
<Suspense fallback={<Loader />}>
<EmojiPicker
onEmojiSelect={(emoji) => {
Expand Down
26 changes: 13 additions & 13 deletions site/src/components/InfoTooltip/InfoTooltip.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { expect, userEvent, waitFor, within } from "storybook/test";
import { expect, screen, userEvent, waitFor } from "storybook/test";
import { InfoTooltip } from "./InfoTooltip";

const meta = {
Expand All @@ -16,13 +16,13 @@ export default meta;
type Story = StoryObj<typeof InfoTooltip>;

export const Example: Story = {
play: async ({ canvasElement, step }) => {
const screen = within(canvasElement);

play: async ({ step }) => {
await step("activate hover trigger", async () => {
await userEvent.hover(screen.getByRole("button"));
await waitFor(() =>
expect(screen.getByText(meta.args.message)).toBeInTheDocument(),
expect(screen.getByRole("tooltip")).toHaveTextContent(
meta.args.message,
),
);
});
},
Expand All @@ -33,13 +33,13 @@ export const Notice = {
type: "notice",
message: "Unfortunately, there's a radio connected to my brain",
},
play: async ({ canvasElement, step }) => {
const screen = within(canvasElement);

play: async ({ step }) => {
await step("activate hover trigger", async () => {
await userEvent.hover(screen.getByRole("button"));
await waitFor(() =>
expect(screen.getByText(Notice.args.message)).toBeInTheDocument(),
expect(screen.getByRole("tooltip")).toHaveTextContent(
Notice.args.message,
),
);
});
},
Expand All @@ -50,13 +50,13 @@ export const Warning = {
type: "warning",
message: "Unfortunately, there's a radio connected to my brain",
},
play: async ({ canvasElement, step }) => {
const screen = within(canvasElement);

play: async ({ step }) => {
await step("activate hover trigger", async () => {
await userEvent.hover(screen.getByRole("button"));
await waitFor(() =>
expect(screen.getByText(Warning.args.message)).toBeInTheDocument(),
expect(screen.getByRole("tooltip")).toHaveTextContent(
Warning.args.message,
),
);
});
},
Expand Down
1 change: 1 addition & 0 deletions site/src/components/Popover/Popover.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export const PopoverContent = forwardRef<
ref={ref}
align={align}
sideOffset={sideOffset}
collisionPadding={16} // 1rem
className={cn(
`z-50 w-72 rounded-md border border-solid bg-surface-primary
text-content-primary shadow-md outline-none
Expand Down
22 changes: 19 additions & 3 deletions site/src/components/SelectMenu/SelectMenu.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import MenuItem, { type MenuItemProps } from "@mui/material/MenuItem";
import MenuList, { type MenuListProps } from "@mui/material/MenuList";
import type {
PopoverContentProps,
PopoverTriggerProps,
} from "@radix-ui/react-popover";
import { Button, type ButtonProps } from "components/Button/Button";
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "components/deprecated/Popover/Popover";
} from "components/Popover/Popover";
import {
SearchField,
type SearchFieldProps,
Expand All @@ -26,9 +30,21 @@ const SIDE_PADDING = 16;

export const SelectMenu = Popover;

export const SelectMenuTrigger = PopoverTrigger;
export const SelectMenuTrigger: FC<PopoverTriggerProps> = (props) => {
return <PopoverTrigger asChild {...props} />;
};

export const SelectMenuContent = PopoverContent;
export const SelectMenuContent: FC<PopoverContentProps> = (props) => {
return (
<PopoverContent
className={cn(
"bg-surface-secondary border-surface-quaternary overflow-y-auto",
props.className,
)}
{...props}
/>
);
};

type SelectMenuButtonProps = ButtonProps & {
startIcon?: React.ReactNode;
Expand Down
10 changes: 7 additions & 3 deletions site/src/components/Tooltip/Tooltip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,15 @@ export const Tooltip = TooltipPrimitive.Root;

export const TooltipTrigger = TooltipPrimitive.Trigger;

export type TooltipContentProps = React.ComponentPropsWithoutRef<
typeof TooltipPrimitive.Content
> & {
disablePortal?: boolean;
};

export const TooltipContent = React.forwardRef<
React.ElementRef<typeof TooltipPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> & {
disablePortal?: boolean;
}
TooltipContentProps
>(({ className, sideOffset = 4, disablePortal, ...props }, ref) => {
const content = (
<TooltipPrimitive.Content
Expand Down
57 changes: 0 additions & 57 deletions site/src/components/deprecated/Popover/Popover.stories.tsx

This file was deleted.

Loading