mirror of
https://github.com/coder/coder.git
synced 2026-09-22 05:05:20 +08:00
refactor: replace MUI button on TopbarButton (#16212)
Related to https://github.com/coder/coder/issues/14978
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
import { css } from "@emotion/css";
|
||||
import { useTheme } from "@emotion/react";
|
||||
import Button, { type ButtonProps } from "@mui/material/Button";
|
||||
import IconButton, { type IconButtonProps } from "@mui/material/IconButton";
|
||||
import { Avatar, type AvatarProps } from "components/Avatar/Avatar";
|
||||
import { Button, type ButtonProps } from "components/Button/Button";
|
||||
import {
|
||||
type FC,
|
||||
type ForwardedRef,
|
||||
@@ -54,19 +54,7 @@ export const TopbarIconButton = forwardRef<HTMLButtonElement, IconButtonProps>(
|
||||
|
||||
export const TopbarButton = forwardRef<HTMLButtonElement, ButtonProps>(
|
||||
(props: ButtonProps, ref) => {
|
||||
return (
|
||||
<Button
|
||||
ref={ref}
|
||||
color="neutral"
|
||||
css={{
|
||||
height: 28,
|
||||
fontSize: 13,
|
||||
borderRadius: 4,
|
||||
padding: "0 12px",
|
||||
}}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
return <Button ref={ref} variant="outline" size="sm" {...props} />;
|
||||
},
|
||||
);
|
||||
|
||||
|
||||
+3
-2
@@ -5,6 +5,7 @@ import type {
|
||||
Experiments,
|
||||
SerpentOption,
|
||||
} from "api/typesGenerated";
|
||||
import { Link } from "components/Link/Link";
|
||||
import { SettingsHeader } from "components/SettingsHeader/SettingsHeader";
|
||||
import { Stack } from "components/Stack/Stack";
|
||||
import type { FC } from "react";
|
||||
@@ -53,13 +54,13 @@ export const GeneralSettingsPageView: FC<GeneralSettingsPageViewProps> = ({
|
||||
</ul>
|
||||
It is recommended that you remove these experiments from your
|
||||
configuration as they have no effect. See{" "}
|
||||
<a
|
||||
<Link
|
||||
href="https://coder.com/docs/cli/server#--experiments"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
the documentation
|
||||
</a>{" "}
|
||||
</Link>{" "}
|
||||
for more details.
|
||||
</Alert>
|
||||
)}
|
||||
|
||||
@@ -2,10 +2,8 @@ import { type Interpolation, type Theme, useTheme } from "@emotion/react";
|
||||
import CreateIcon from "@mui/icons-material/AddOutlined";
|
||||
import ArrowBackOutlined from "@mui/icons-material/ArrowBackOutlined";
|
||||
import CloseOutlined from "@mui/icons-material/CloseOutlined";
|
||||
import PlayArrowOutlined from "@mui/icons-material/PlayArrowOutlined";
|
||||
import WarningOutlined from "@mui/icons-material/WarningOutlined";
|
||||
import Button from "@mui/material/Button";
|
||||
import ButtonGroup from "@mui/material/ButtonGroup";
|
||||
import IconButton from "@mui/material/IconButton";
|
||||
import Tooltip from "@mui/material/Tooltip";
|
||||
import { getErrorDetail, getErrorMessage } from "api/errors";
|
||||
@@ -29,6 +27,7 @@ import {
|
||||
} from "components/FullPageLayout/Topbar";
|
||||
import { displayError } from "components/GlobalSnackbar/utils";
|
||||
import { Loader } from "components/Loader/Loader";
|
||||
import { PlayIcon } from "lucide-react";
|
||||
import { linkToTemplate, useLinks } from "modules/navigation";
|
||||
import { ProvisionerAlert } from "modules/provisioners/ProvisionerAlert";
|
||||
import { AlertVariant } from "modules/provisioners/ProvisionerAlert";
|
||||
@@ -260,28 +259,15 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
|
||||
>
|
||||
<TemplateVersionStatusBadge version={templateVersion} />
|
||||
|
||||
<ButtonGroup
|
||||
variant="outlined"
|
||||
css={{
|
||||
// Workaround to make the border transitions smoothly on button groups
|
||||
"& > button:hover + button": {
|
||||
borderLeft: "1px solid #FFF",
|
||||
},
|
||||
}}
|
||||
disabled={!canBuild}
|
||||
>
|
||||
<div className="flex gap-1 items-center">
|
||||
<TopbarButton
|
||||
startIcon={
|
||||
<PlayArrowOutlined
|
||||
css={{ color: theme.palette.success.light }}
|
||||
/>
|
||||
}
|
||||
title="Build template (Ctrl + Enter)"
|
||||
disabled={!canBuild}
|
||||
onClick={async () => {
|
||||
await triggerPreview();
|
||||
}}
|
||||
>
|
||||
<PlayIcon />
|
||||
Build
|
||||
</TopbarButton>
|
||||
<ProvisionerTagsPopover
|
||||
@@ -298,10 +284,10 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
|
||||
onUpdateProvisionerTags(newTags);
|
||||
}}
|
||||
/>
|
||||
</ButtonGroup>
|
||||
</div>
|
||||
|
||||
<TopbarButton
|
||||
variant="contained"
|
||||
variant="default"
|
||||
disabled={dirty || !canPublish}
|
||||
onClick={onPublish}
|
||||
>
|
||||
@@ -555,6 +541,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
|
||||
}}
|
||||
>
|
||||
<button
|
||||
type="button"
|
||||
disabled={!buildLogs}
|
||||
css={styles.tab}
|
||||
className={selectedTab === "logs" ? "active" : ""}
|
||||
@@ -566,6 +553,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
|
||||
</button>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
disabled={!canPublish}
|
||||
css={styles.tab}
|
||||
className={selectedTab === "resources" ? "active" : ""}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { useTheme } from "@emotion/react";
|
||||
import ExpandMoreOutlined from "@mui/icons-material/ExpandMoreOutlined";
|
||||
import Button from "@mui/material/Button";
|
||||
import visuallyHidden from "@mui/utils/visuallyHidden";
|
||||
import { API } from "api/api";
|
||||
@@ -25,6 +24,7 @@ import {
|
||||
usePopover,
|
||||
} from "components/deprecated/Popover/Popover";
|
||||
import { useFormik } from "formik";
|
||||
import { ChevronDownIcon } from "lucide-react";
|
||||
import type { FC } from "react";
|
||||
import { useQuery } from "react-query";
|
||||
import { docs } from "utils/docs";
|
||||
@@ -61,10 +61,9 @@ export const BuildParametersPopover: FC<BuildParametersPopoverProps> = ({
|
||||
<TopbarButton
|
||||
data-testid="build-parameters-button"
|
||||
disabled={disabled}
|
||||
color="neutral"
|
||||
css={{ paddingLeft: 0, paddingRight: 0, minWidth: "28px !important" }}
|
||||
className="min-w-fit"
|
||||
>
|
||||
<ExpandMoreOutlined css={{ fontSize: 14 }} />
|
||||
<ChevronDownIcon />
|
||||
<span css={{ ...visuallyHidden }}>{label}</span>
|
||||
</TopbarButton>
|
||||
</PopoverTrigger>
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import BlockIcon from "@mui/icons-material/Block";
|
||||
import OutlinedBlockIcon from "@mui/icons-material/BlockOutlined";
|
||||
import CloudQueueIcon from "@mui/icons-material/CloudQueue";
|
||||
import CropSquareIcon from "@mui/icons-material/CropSquare";
|
||||
import PlayCircleOutlineIcon from "@mui/icons-material/PlayCircleOutline";
|
||||
import PowerSettingsNewIcon from "@mui/icons-material/PowerSettingsNew";
|
||||
import ReplayIcon from "@mui/icons-material/Replay";
|
||||
import Star from "@mui/icons-material/Star";
|
||||
import StarBorder from "@mui/icons-material/StarBorder";
|
||||
import ButtonGroup from "@mui/material/ButtonGroup";
|
||||
import Tooltip from "@mui/material/Tooltip";
|
||||
import type { Workspace, WorkspaceBuildParameter } from "api/typesGenerated";
|
||||
import { TopbarButton } from "components/FullPageLayout/Topbar";
|
||||
import {
|
||||
BanIcon,
|
||||
CirclePlayIcon,
|
||||
CircleStopIcon,
|
||||
CloudIcon,
|
||||
PowerIcon,
|
||||
RotateCcwIcon,
|
||||
StarIcon,
|
||||
StarOffIcon,
|
||||
} from "lucide-react";
|
||||
import type { FC } from "react";
|
||||
import { BuildParametersPopover } from "./BuildParametersPopover";
|
||||
|
||||
@@ -29,9 +29,9 @@ export const UpdateButton: FC<ActionButtonProps> = ({
|
||||
<TopbarButton
|
||||
disabled={loading}
|
||||
data-testid="workspace-update-button"
|
||||
startIcon={<CloudQueueIcon />}
|
||||
onClick={() => handleAction()}
|
||||
>
|
||||
<CloudIcon />
|
||||
{loading ? <>Updating…</> : <>Update…</>}
|
||||
</TopbarButton>
|
||||
);
|
||||
@@ -42,11 +42,8 @@ export const ActivateButton: FC<ActionButtonProps> = ({
|
||||
loading,
|
||||
}) => {
|
||||
return (
|
||||
<TopbarButton
|
||||
disabled={loading}
|
||||
startIcon={<PowerSettingsNewIcon />}
|
||||
onClick={() => handleAction()}
|
||||
>
|
||||
<TopbarButton disabled={loading} onClick={() => handleAction()}>
|
||||
<PowerIcon />
|
||||
{loading ? <>Activating…</> : "Activate"}
|
||||
</TopbarButton>
|
||||
);
|
||||
@@ -64,11 +61,8 @@ export const StartButton: FC<ActionButtonPropsWithWorkspace> = ({
|
||||
tooltipText,
|
||||
}) => {
|
||||
let mainButton = (
|
||||
<TopbarButton
|
||||
startIcon={<PlayCircleOutlineIcon />}
|
||||
onClick={() => handleAction()}
|
||||
disabled={disabled || loading}
|
||||
>
|
||||
<TopbarButton onClick={() => handleAction()} disabled={disabled || loading}>
|
||||
<CirclePlayIcon />
|
||||
{loading ? <>Starting…</> : "Start"}
|
||||
</TopbarButton>
|
||||
);
|
||||
@@ -78,16 +72,7 @@ export const StartButton: FC<ActionButtonPropsWithWorkspace> = ({
|
||||
}
|
||||
|
||||
return (
|
||||
<ButtonGroup
|
||||
variant="outlined"
|
||||
sx={{
|
||||
// Workaround to make the border transitions smoothly on button groups
|
||||
"& > button:hover + button": {
|
||||
borderLeft: "1px solid #FFF",
|
||||
},
|
||||
}}
|
||||
disabled={disabled}
|
||||
>
|
||||
<div className="flex gap-1 items-center">
|
||||
{mainButton}
|
||||
<BuildParametersPopover
|
||||
label="Start with build parameters"
|
||||
@@ -95,7 +80,7 @@ export const StartButton: FC<ActionButtonPropsWithWorkspace> = ({
|
||||
disabled={loading}
|
||||
onSubmit={handleAction}
|
||||
/>
|
||||
</ButtonGroup>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -104,10 +89,8 @@ export const UpdateAndStartButton: FC<ActionButtonProps> = ({
|
||||
}) => {
|
||||
return (
|
||||
<Tooltip title="This template requires automatic updates on workspace startup. Contact your administrator if you want to preserve the template version.">
|
||||
<TopbarButton
|
||||
startIcon={<PlayCircleOutlineIcon />}
|
||||
onClick={() => handleAction()}
|
||||
>
|
||||
<TopbarButton onClick={() => handleAction()}>
|
||||
<CirclePlayIcon />
|
||||
Update and start…
|
||||
</TopbarButton>
|
||||
</Tooltip>
|
||||
@@ -121,10 +104,10 @@ export const StopButton: FC<ActionButtonProps> = ({
|
||||
return (
|
||||
<TopbarButton
|
||||
disabled={loading}
|
||||
startIcon={<CropSquareIcon />}
|
||||
onClick={() => handleAction()}
|
||||
data-testid="workspace-stop-button"
|
||||
>
|
||||
<CircleStopIcon />
|
||||
{loading ? <>Stopping…</> : "Stop"}
|
||||
</TopbarButton>
|
||||
);
|
||||
@@ -136,21 +119,13 @@ export const RestartButton: FC<ActionButtonPropsWithWorkspace> = ({
|
||||
workspace,
|
||||
}) => {
|
||||
return (
|
||||
<ButtonGroup
|
||||
variant="outlined"
|
||||
css={{
|
||||
// Workaround to make the border transitions smoothly on button groups
|
||||
"& > button:hover + button": {
|
||||
borderLeft: "1px solid #FFF",
|
||||
},
|
||||
}}
|
||||
>
|
||||
<div className="flex gap-1 items-center">
|
||||
<TopbarButton
|
||||
startIcon={<ReplayIcon />}
|
||||
onClick={() => handleAction()}
|
||||
data-testid="workspace-restart-button"
|
||||
disabled={loading}
|
||||
>
|
||||
<RotateCcwIcon />
|
||||
{loading ? <>Restarting…</> : <>Restart…</>}
|
||||
</TopbarButton>
|
||||
<BuildParametersPopover
|
||||
@@ -159,7 +134,7 @@ export const RestartButton: FC<ActionButtonPropsWithWorkspace> = ({
|
||||
disabled={loading}
|
||||
onSubmit={handleAction}
|
||||
/>
|
||||
</ButtonGroup>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -168,7 +143,8 @@ export const UpdateAndRestartButton: FC<ActionButtonProps> = ({
|
||||
}) => {
|
||||
return (
|
||||
<Tooltip title="This template requires automatic updates on workspace startup. Contact your administrator if you want to preserve the template version.">
|
||||
<TopbarButton startIcon={<ReplayIcon />} onClick={() => handleAction()}>
|
||||
<TopbarButton onClick={() => handleAction()}>
|
||||
<RotateCcwIcon />
|
||||
Update and restart…
|
||||
</TopbarButton>
|
||||
</Tooltip>
|
||||
@@ -177,7 +153,8 @@ export const UpdateAndRestartButton: FC<ActionButtonProps> = ({
|
||||
|
||||
export const CancelButton: FC<ActionButtonProps> = ({ handleAction }) => {
|
||||
return (
|
||||
<TopbarButton startIcon={<BlockIcon />} onClick={() => handleAction()}>
|
||||
<TopbarButton onClick={() => handleAction()}>
|
||||
<BanIcon />
|
||||
Cancel
|
||||
</TopbarButton>
|
||||
);
|
||||
@@ -189,7 +166,8 @@ interface DisabledButtonProps {
|
||||
|
||||
export const DisabledButton: FC<DisabledButtonProps> = ({ label }) => {
|
||||
return (
|
||||
<TopbarButton startIcon={<OutlinedBlockIcon />} disabled>
|
||||
<TopbarButton disabled>
|
||||
<BanIcon />
|
||||
{label}
|
||||
</TopbarButton>
|
||||
);
|
||||
@@ -207,10 +185,8 @@ export const FavoriteButton: FC<FavoriteButtonProps> = ({
|
||||
isFavorite,
|
||||
}) => {
|
||||
return (
|
||||
<TopbarButton
|
||||
startIcon={isFavorite ? <Star /> : <StarBorder />}
|
||||
onClick={() => onToggle(workspaceID)}
|
||||
>
|
||||
<TopbarButton onClick={() => onToggle(workspaceID)}>
|
||||
{isFavorite ? <StarOffIcon /> : <StarIcon />}
|
||||
{isFavorite ? "Unfavorite" : "Favorite"}
|
||||
</TopbarButton>
|
||||
);
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import DebugIcon from "@mui/icons-material/BugReportOutlined";
|
||||
import ButtonGroup from "@mui/material/ButtonGroup";
|
||||
import type { Workspace } from "api/typesGenerated";
|
||||
import { TopbarButton } from "components/FullPageLayout/Topbar";
|
||||
import { BugIcon } from "lucide-react";
|
||||
import type { FC } from "react";
|
||||
import { BuildParametersPopover } from "./BuildParametersPopover";
|
||||
import type { ActionButtonProps } from "./Buttons";
|
||||
@@ -17,7 +16,8 @@ export const DebugButton: FC<DebugButtonProps> = ({
|
||||
enableBuildParameters,
|
||||
}) => {
|
||||
const mainAction = (
|
||||
<TopbarButton startIcon={<DebugIcon />} onClick={() => handleAction()}>
|
||||
<TopbarButton onClick={() => handleAction()}>
|
||||
<BugIcon />
|
||||
Debug
|
||||
</TopbarButton>
|
||||
);
|
||||
@@ -27,21 +27,13 @@ export const DebugButton: FC<DebugButtonProps> = ({
|
||||
}
|
||||
|
||||
return (
|
||||
<ButtonGroup
|
||||
variant="outlined"
|
||||
css={{
|
||||
// Workaround to make the border transitions smoothly on button groups
|
||||
"& > button:hover + button": {
|
||||
borderLeft: "1px solid #FFF",
|
||||
},
|
||||
}}
|
||||
>
|
||||
<div className="flex gap-1 items-center">
|
||||
{mainAction}
|
||||
<BuildParametersPopover
|
||||
label="Debug with build parameters"
|
||||
workspace={workspace}
|
||||
onSubmit={handleAction}
|
||||
/>
|
||||
</ButtonGroup>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import RetryIcon from "@mui/icons-material/CachedOutlined";
|
||||
import ButtonGroup from "@mui/material/ButtonGroup";
|
||||
import type { Workspace } from "api/typesGenerated";
|
||||
import { TopbarButton } from "components/FullPageLayout/Topbar";
|
||||
import { RotateCcwIcon } from "lucide-react";
|
||||
import type { FC } from "react";
|
||||
import { BuildParametersPopover } from "./BuildParametersPopover";
|
||||
import type { ActionButtonProps } from "./Buttons";
|
||||
@@ -17,7 +16,8 @@ export const RetryButton: FC<RetryButtonProps> = ({
|
||||
enableBuildParameters,
|
||||
}) => {
|
||||
const mainAction = (
|
||||
<TopbarButton startIcon={<RetryIcon />} onClick={() => handleAction()}>
|
||||
<TopbarButton onClick={() => handleAction()}>
|
||||
<RotateCcwIcon />
|
||||
Retry
|
||||
</TopbarButton>
|
||||
);
|
||||
@@ -27,21 +27,13 @@ export const RetryButton: FC<RetryButtonProps> = ({
|
||||
}
|
||||
|
||||
return (
|
||||
<ButtonGroup
|
||||
variant="outlined"
|
||||
css={{
|
||||
// Workaround to make the border transitions smoothly on button groups
|
||||
"& > button:hover + button": {
|
||||
borderLeft: "1px solid #FFF",
|
||||
},
|
||||
}}
|
||||
>
|
||||
<div className="flex gap-1 items-center">
|
||||
{mainAction}
|
||||
<BuildParametersPopover
|
||||
label="Retry with build parameters"
|
||||
workspace={workspace}
|
||||
onSubmit={handleAction}
|
||||
/>
|
||||
</ButtonGroup>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user