Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 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
d5a6d18
chore: rm 1rem comment
aqandrew Sep 6, 2025
e0f4f4c
Merge branch 'main' into aqandrew/replace-popover
aqandrew Sep 9, 2025
e5ab08d
fix: left-align EditRolesButton's PopoverContent
aqandrew Sep 9, 2025
189fe0b
fix: restore BuildParametersPopover's background/border color
aqandrew Sep 9, 2025
431b828
fix: prevent SelectMenuContent className from being overwritten
aqandrew Sep 9, 2025
f6a3098
fix: apply SelectFilter styles now that SelectMenuContent doesn't render
aqandrew Sep 9, 2025
8785d6b
fix: softcode SelectMenuContent width
aqandrew Sep 9, 2025
ffc7aa8
fix: make default SelectMenuContent font size 14px
aqandrew Sep 9, 2025
cf7b88f
chore: remove unused searchStyles
aqandrew Sep 9, 2025
8c6c3fc
refactor: export PopoverContentProps, PopoverTriggerProps, and
aqandrew Sep 9, 2025
005256a
chore: check:fix
aqandrew Sep 9, 2025
018c654
refactor: change `style` prop to `css`
aqandrew Sep 11, 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]")!;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

muuuuch better

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");
},
};
20 changes: 10 additions & 10 deletions site/src/components/Filter/SelectFilter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import {
SelectMenuTrigger,
} from "components/SelectMenu/SelectMenu";
import { type FC, type ReactNode, useState } from "react";
import { cn } from "utils/cn";

const BASE_WIDTH = 200;
const POPOVER_WIDTH = 320;

export type SelectFilterOption = {
startIcon?: ReactNode;
Expand Down Expand Up @@ -60,15 +60,15 @@ export const SelectFilter: FC<SelectFilterProps> = ({
</SelectMenuButton>
</SelectMenuTrigger>
<SelectMenuContent
horizontal="right"
css={{
"& .MuiPaper-root": {
// When including selectFilterSearch, we aim for the width to be as
// wide as possible.
width: selectFilterSearch ? "100%" : undefined,
maxWidth: POPOVER_WIDTH,
minWidth: width,
},
align="end"
className={cn([
// When including selectFilterSearch, we aim for the width to be as
// wide as possible.
selectFilterSearch && "w-full",
"max-w-[320px]",
])}
style={{
minWidth: width,
}}
>
{selectFilterSearch}
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
7 changes: 7 additions & 0 deletions site/src/components/Popover/Popover.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,16 @@ import {
} from "react";
import { cn } from "utils/cn";

export type PopoverContentProps = PopoverPrimitive.PopoverContentProps;

export type PopoverTriggerProps = PopoverPrimitive.PopoverTriggerProps;

export const Popover = PopoverPrimitive.Root;

export const PopoverTrigger = PopoverPrimitive.Trigger;

export const PopoverClose = PopoverPrimitive.PopoverClose;

export const PopoverContent = forwardRef<
ElementRef<typeof PopoverPrimitive.Content>,
ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>
Expand All @@ -23,6 +29,7 @@ export const PopoverContent = forwardRef<
ref={ref}
align={align}
sideOffset={sideOffset}
collisionPadding={16}
className={cn(
`z-50 w-72 rounded-md border border-solid bg-surface-primary
text-content-primary shadow-md outline-none
Expand Down
11 changes: 0 additions & 11 deletions site/src/components/Search/Search.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -104,14 +104,3 @@ const SearchEmptyStyles = {
paddingBottom: 8,
}),
} satisfies Record<string, Interpolation<Theme>>;

/**
* Reusable styles for consumers of the base components
*/
export const searchStyles = {
content: {
width: 320,
padding: 0,
borderRadius: 4,
},
} satisfies Record<string, Interpolation<Theme>>;
20 changes: 17 additions & 3 deletions site/src/components/SelectMenu/SelectMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import { Button, type ButtonProps } from "components/Button/Button";
import {
Popover,
PopoverContent,
type PopoverContentProps,
PopoverTrigger,
} from "components/deprecated/Popover/Popover";
type PopoverTriggerProps,
} from "components/Popover/Popover";
import {
SearchField,
type SearchFieldProps,
Expand All @@ -26,9 +28,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
{...props}
className={cn(
"w-auto bg-surface-secondary border-surface-quaternary overflow-y-auto text-sm",
props.className,
)}
/>
);
};

type SelectMenuButtonProps = ButtonProps & {
startIcon?: React.ReactNode;
Expand Down
2 changes: 1 addition & 1 deletion site/src/hooks/useClassName.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { css } from "@emotion/css";
import { type Theme, useTheme } from "@emotion/react";
import { type DependencyList, useMemo } from "react";

export type ClassName = (cssFn: typeof css, theme: Theme) => string;
type ClassName = (cssFn: typeof css, theme: Theme) => string;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this means we're getting closer!! excited to see this old hack gone


/**
* @deprecated This hook was used as an escape hatch to generate class names
Expand Down
121 changes: 53 additions & 68 deletions site/src/modules/dashboard/Navbar/DeploymentDropdown.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { css, type Interpolation, type Theme, useTheme } from "@emotion/react";
import { css, type Interpolation, type Theme } from "@emotion/react";
import MenuItem from "@mui/material/MenuItem";
import { Button } from "components/Button/Button";
import {
Popover,
PopoverClose,
PopoverContent,
PopoverTrigger,
usePopover,
} from "components/deprecated/Popover/Popover";
} from "components/Popover/Popover";
import { ChevronDownIcon } from "lucide-react";
import { linkToAuditing } from "modules/navigation";
import type { FC } from "react";
Expand All @@ -27,8 +27,6 @@ export const DeploymentDropdown: FC<DeploymentDropdownProps> = ({
canViewConnectionLog,
canViewHealth,
}) => {
const theme = useTheme();

if (
!canViewAuditLog &&
!canViewConnectionLog &&
Expand All @@ -41,22 +39,16 @@ export const DeploymentDropdown: FC<DeploymentDropdownProps> = ({

return (
<Popover>
<PopoverTrigger>
<PopoverTrigger asChild>
<Button variant="outline" size="lg">
Admin settings
<ChevronDownIcon className="text-content-primary !size-icon-xs" />
</Button>
</PopoverTrigger>

<PopoverContent
horizontal="right"
css={{
".MuiPaper-root": {
minWidth: "auto",
width: 180,
boxShadow: theme.shadows[6],
},
}}
align="end"
className="bg-surface-secondary border-surface-quaternary w-[180px] min-w-auto"
>
<DeploymentDropdownContent
canViewDeployment={canViewDeployment}
Expand All @@ -77,79 +69,72 @@ const DeploymentDropdownContent: FC<DeploymentDropdownProps> = ({
canViewHealth,
canViewConnectionLog,
}) => {
const popover = usePopover();

const onPopoverClose = () => popover.setOpen(false);

return (
<nav>
{canViewDeployment && (
<MenuItem
component={NavLink}
to="/deployment"
css={styles.menuItem}
onClick={onPopoverClose}
>
Deployment
</MenuItem>
<PopoverClose asChild>
<MenuItem component={NavLink} to="/deployment" css={styles.menuItem}>
Deployment
</MenuItem>
</PopoverClose>
)}
{canViewOrganizations && (
<MenuItem
component={NavLink}
to="/organizations"
css={styles.menuItem}
onClick={onPopoverClose}
>
Organizations
</MenuItem>
<PopoverClose asChild>
<MenuItem
component={NavLink}
to="/organizations"
css={styles.menuItem}
>
Organizations
</MenuItem>
</PopoverClose>
)}
{canViewAuditLog && (
<MenuItem
component={NavLink}
to={linkToAuditing}
css={styles.menuItem}
onClick={onPopoverClose}
>
Audit Logs
</MenuItem>
<PopoverClose asChild>
<MenuItem
component={NavLink}
to={linkToAuditing}
css={styles.menuItem}
>
Audit Logs
</MenuItem>
</PopoverClose>
)}
{canViewConnectionLog && (
<MenuItem
component={NavLink}
to="/connectionlog"
css={styles.menuItem}
onClick={onPopoverClose}
>
Connection Logs
</MenuItem>
<PopoverClose asChild>
<MenuItem
component={NavLink}
to="/connectionlog"
css={styles.menuItem}
>
Connection Logs
</MenuItem>
</PopoverClose>
)}
{canViewHealth && (
<MenuItem
component={NavLink}
to="/health"
css={styles.menuItem}
onClick={onPopoverClose}
>
Healthcheck
</MenuItem>
<PopoverClose asChild>
<MenuItem component={NavLink} to="/health" css={styles.menuItem}>
Healthcheck
</MenuItem>
</PopoverClose>
)}
</nav>
);
};

const styles = {
menuItem: (theme) => css`
text-decoration: none;
color: inherit;
gap: 8px;
padding: 8px 20px;
font-size: 14px;
text-decoration: none;
color: inherit;
gap: 8px;
padding: 8px 20px;
font-size: 14px;

&:hover {
background-color: ${theme.palette.action.hover};
transition: background-color 0.3s ease;
}
`,
&:hover {
background-color: ${theme.palette.action.hover};
transition: background-color 0.3s ease;
}
`,
menuItemIcon: (theme) => ({
color: theme.palette.text.secondary,
width: 20,
Expand Down
Loading
Loading