From a1d4ed81c835f716d8521e81ab6ef6d1df58723c Mon Sep 17 00:00:00 2001 From: Parkreiner Date: Wed, 8 Nov 2023 17:28:26 +0000 Subject: [PATCH 01/14] refactor: remove enums from workspace actions --- .../WorkspaceActions/WorkspaceActions.tsx | 53 +++++--------- .../WorkspaceActions/constants.ts | 72 ++++++++++--------- 2 files changed, 59 insertions(+), 66 deletions(-) diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index 4efc94df53623..4d167586835df 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -11,11 +11,7 @@ import { UpdateButton, ActivateButton, } from "./Buttons"; -import { - ButtonMapping, - ButtonTypesEnum, - actionsByWorkspaceStatus, -} from "./constants"; +import { ButtonMapping, actionsByWorkspaceStatus } from "./constants"; import Divider from "@mui/material/Divider"; import DuplicateIcon from "@mui/icons-material/FileCopyOutlined"; @@ -76,42 +72,32 @@ export const WorkspaceActions: FC = ({ const { duplicateWorkspace, isDuplicationReady } = useWorkspaceDuplication(workspace); - // A mapping of button type to the corresponding React component + // A mapping of button type to their corresponding React components const buttonMapping: ButtonMapping = { - [ButtonTypesEnum.update]: , - [ButtonTypesEnum.updating]: ( - - ), - [ButtonTypesEnum.start]: ( - - ), - [ButtonTypesEnum.starting]: ( + update: , + updating: , + start: , + starting: ( ), - [ButtonTypesEnum.stop]: , - [ButtonTypesEnum.stopping]: ( - - ), - [ButtonTypesEnum.restart]: ( + stop: , + stopping: , + restart: ( ), - [ButtonTypesEnum.restarting]: ( + restarting: ( ), - [ButtonTypesEnum.deleting]: , - [ButtonTypesEnum.canceling]: , - [ButtonTypesEnum.deleted]: , - [ButtonTypesEnum.pending]: , - [ButtonTypesEnum.activate]: ( - - ), - [ButtonTypesEnum.activating]: ( - - ), + deleting: , + canceling: , + deleted: , + pending: , + activate: , + activating: , }; return ( @@ -120,11 +106,9 @@ export const WorkspaceActions: FC = ({ data-testid="workspace-actions" > {canBeUpdated && - (isUpdating - ? buttonMapping[ButtonTypesEnum.updating] - : buttonMapping[ButtonTypesEnum.update])} + (isUpdating ? buttonMapping.updating : buttonMapping.update)} - {isRestarting && buttonMapping[ButtonTypesEnum.restarting]} + {isRestarting && buttonMapping.restarting} {!isRestarting && actionsByStatus.map((action) => ( @@ -132,6 +116,7 @@ export const WorkspaceActions: FC = ({ ))} {canCancel && } + { if (workspace.dormant_at) { return { - actions: [ButtonTypesEnum.activate], + actions: ["activate"], canCancel: false, canAcceptJobs: false, }; @@ -49,7 +57,7 @@ export const actionsByWorkspaceStatus = ( ) { if (status === "running") { return { - actions: [ButtonTypesEnum.stop], + actions: ["stop"], canCancel: false, canAcceptJobs: true, }; @@ -67,33 +75,33 @@ export const actionsByWorkspaceStatus = ( const statusToActions: Record = { starting: { - actions: [ButtonTypesEnum.starting], + actions: ["starting"], canCancel: true, canAcceptJobs: false, }, running: { - actions: [ButtonTypesEnum.stop, ButtonTypesEnum.restart], + actions: ["stop", "restart"], canCancel: false, canAcceptJobs: true, }, stopping: { - actions: [ButtonTypesEnum.stopping], + actions: ["stopping"], canCancel: true, canAcceptJobs: false, }, stopped: { - actions: [ButtonTypesEnum.start], + actions: ["start"], canCancel: false, canAcceptJobs: true, }, canceled: { - actions: [ButtonTypesEnum.start, ButtonTypesEnum.stop], + actions: ["start", "stop"], canCancel: false, canAcceptJobs: true, }, // in the case of an error failed: { - actions: [ButtonTypesEnum.start, ButtonTypesEnum.stop], + actions: ["start", "stop"], canCancel: false, canAcceptJobs: true, }, @@ -101,22 +109,22 @@ const statusToActions: Record = { * disabled states */ canceling: { - actions: [ButtonTypesEnum.canceling], + actions: ["canceling"], canCancel: false, canAcceptJobs: false, }, deleting: { - actions: [ButtonTypesEnum.deleting], + actions: ["deleting"], canCancel: true, canAcceptJobs: false, }, deleted: { - actions: [ButtonTypesEnum.deleted], + actions: ["deleted"], canCancel: false, canAcceptJobs: false, }, pending: { - actions: [ButtonTypesEnum.pending], + actions: ["pending"], canCancel: false, canAcceptJobs: false, }, From 216954c0b8ec43d105ed45e36d3d216df2d417fe Mon Sep 17 00:00:00 2001 From: Parkreiner Date: Wed, 8 Nov 2023 17:32:13 +0000 Subject: [PATCH 02/14] docs: remove typos from comments --- site/src/pages/WorkspacePage/WorkspaceActions/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts b/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts index aabd02b51633f..bc4df2ba59e7f 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts +++ b/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts @@ -18,7 +18,7 @@ const buttonTypes = [ "activate", "activating", - // These are buttons that should be with disabled UI elements + // These are buttons that should be used with disabled UI elements "canceling", "deleted", "pending", From 199f9c9d9d956c771570a0d832af326580a8f3d6 Mon Sep 17 00:00:00 2001 From: Parkreiner Date: Wed, 8 Nov 2023 18:33:54 +0000 Subject: [PATCH 03/14] refactor: clean up code formatting --- .../WorkspaceActions/WorkspaceActions.tsx | 21 ++++++++++--------- .../WorkspaceActions/constants.ts | 4 ++-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index 4d167586835df..d137c66d5c4af 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -59,16 +59,6 @@ export const WorkspaceActions: FC = ({ isRestarting, canChangeVersions, }) => { - const { - canCancel, - canAcceptJobs, - actions: actionsByStatus, - } = actionsByWorkspaceStatus( - workspace, - workspace.latest_build.status, - canChangeVersions, - ); - const canBeUpdated = workspace.outdated && canAcceptJobs; const { duplicateWorkspace, isDuplicationReady } = useWorkspaceDuplication(workspace); @@ -100,6 +90,17 @@ export const WorkspaceActions: FC = ({ activating: , }; + const { + canCancel, + canAcceptJobs, + actions: actionsByStatus, + } = actionsByWorkspaceStatus( + workspace, + workspace.latest_build.status, + canChangeVersions, + ); + const canBeUpdated = workspace.outdated && canAcceptJobs; + return (
Date: Wed, 8 Nov 2023 18:52:57 +0000 Subject: [PATCH 04/14] refactor: clean up Workspace --- site/src/pages/WorkspacePage/Workspace.tsx | 55 ++++++++++------------ 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/site/src/pages/WorkspacePage/Workspace.tsx b/site/src/pages/WorkspacePage/Workspace.tsx index 761592d32f25b..6fa28c9e9a5c6 100644 --- a/site/src/pages/WorkspacePage/Workspace.tsx +++ b/site/src/pages/WorkspacePage/Workspace.tsx @@ -113,31 +113,13 @@ export const Workspace: FC> = ({ hasMoreBuilds, }) => { const navigate = useNavigate(); - const serverVersion = buildInfo?.version || ""; const { saveLocal, getLocal } = useLocalStorage(); - - const buildError = Boolean(workspaceErrors[WorkspaceErrors.BUILD_ERROR]) && ( - - ); - - const cancellationError = Boolean( - workspaceErrors[WorkspaceErrors.CANCELLATION_ERROR], - ) && ( - - ); - - let transitionStats: TypesGen.TransitionStats | undefined = undefined; - if (template !== undefined) { - transitionStats = ActiveTransition(template, workspace); - } - const [showAlertPendingInQueue, setShowAlertPendingInQueue] = useState(false); + + // 2023-11-08 - MES - This effect will be called every single render because + // "now" will always change and invalidate the dependency array. Need to + // figure out if this effect should run every render (possibly meaning no + // dependency array at all), or how to get the array stabilized (more ideal) const now = dayjs(); useEffect(() => { if ( @@ -164,10 +146,12 @@ export const Workspace: FC> = ({ setShowAlertPendingInQueue(true); }, t); - return () => { - clearTimeout(showTimer); - }; + return () => clearTimeout(showTimer); }, [workspace, now, showAlertPendingInQueue]); + + const transitionStats = + template !== undefined ? ActiveTransition(template, workspace) : undefined; + return ( <> @@ -226,8 +210,21 @@ export const Workspace: FC> = ({ {updateMessage && {updateMessage}} )} - {buildError} - {cancellationError} + + {Boolean(workspaceErrors[WorkspaceErrors.BUILD_ERROR]) && ( + + )} + + {Boolean(workspaceErrors[WorkspaceErrors.CANCELLATION_ERROR]) && ( + + )} + {workspace.latest_build.status === "running" && !workspace.health.healthy && ( > = ({ showBuiltinApps={canUpdateWorkspace} hideSSHButton={hideSSHButton} hideVSCodeDesktopButton={hideVSCodeDesktopButton} - serverVersion={serverVersion} + serverVersion={buildInfo?.version || ""} onUpdateAgent={handleUpdate} // On updating the workspace the agent version is also updated /> )} From d1d8cfeff4b8b64c92857e0978a92f664ed9216d Mon Sep 17 00:00:00 2001 From: Parkreiner Date: Wed, 8 Nov 2023 18:57:56 +0000 Subject: [PATCH 05/14] docs: reword comments for clarity --- site/src/pages/WorkspacePage/Workspace.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/src/pages/WorkspacePage/Workspace.tsx b/site/src/pages/WorkspacePage/Workspace.tsx index 6fa28c9e9a5c6..00f086b62b19d 100644 --- a/site/src/pages/WorkspacePage/Workspace.tsx +++ b/site/src/pages/WorkspacePage/Workspace.tsx @@ -118,8 +118,8 @@ export const Workspace: FC> = ({ // 2023-11-08 - MES - This effect will be called every single render because // "now" will always change and invalidate the dependency array. Need to - // figure out if this effect should run every render (possibly meaning no - // dependency array at all), or how to get the array stabilized (more ideal) + // figure out if this effect really should run every render (possibly meaning + // no dependency array at all), or how to get the array stabilized (ideal) const now = dayjs(); useEffect(() => { if ( From e39dc2dff150becfa493edf19ee32b73eb9419f8 Mon Sep 17 00:00:00 2001 From: Parkreiner Date: Wed, 8 Nov 2023 19:14:08 +0000 Subject: [PATCH 06/14] refactor: remove needless types --- .../WorkspaceActions/WorkspaceActions.tsx | 4 ++-- .../pages/WorkspacePage/WorkspaceActions/constants.ts | 11 +++-------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index d137c66d5c4af..cf1f6ac3c1852 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -11,7 +11,7 @@ import { UpdateButton, ActivateButton, } from "./Buttons"; -import { ButtonMapping, actionsByWorkspaceStatus } from "./constants"; +import { type ButtonType, actionsByWorkspaceStatus } from "./constants"; import Divider from "@mui/material/Divider"; import DuplicateIcon from "@mui/icons-material/FileCopyOutlined"; @@ -63,7 +63,7 @@ export const WorkspaceActions: FC = ({ useWorkspaceDuplication(workspace); // A mapping of button type to their corresponding React components - const buttonMapping: ButtonMapping = { + const buttonMapping: Record = { update: , updating: , start: , diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts b/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts index 088c5401b6542..efd6351ea5ea7 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts +++ b/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts @@ -1,5 +1,4 @@ import { type Workspace, type WorkspaceStatus } from "api/typesGenerated"; -import { type ReactNode } from "react"; import { workspaceUpdatePolicy } from "utils/workspace"; /** @@ -29,10 +28,6 @@ const buttonTypes = [ */ export type ButtonType = (typeof buttonTypes)[number]; -export type ButtonMapping = { - [key in ButtonType]: ReactNode; -}; - interface WorkspaceAbilities { actions: ButtonType[]; canCancel: boolean; @@ -99,15 +94,15 @@ const statusToActions: Record = { canCancel: false, canAcceptJobs: true, }, + // in the case of an error failed: { actions: ["start", "stop"], canCancel: false, canAcceptJobs: true, }, - /** - * disabled states - */ + + // Disabled states canceling: { actions: ["canceling"], canCancel: false, From a0b153f1ae376b4ca9bdf25cd7f8f0fadf498cb9 Mon Sep 17 00:00:00 2001 From: Parkreiner Date: Wed, 8 Nov 2023 19:16:46 +0000 Subject: [PATCH 07/14] refactor: make restarting view logic more explicit --- .../WorkspaceActions/WorkspaceActions.tsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index cf1f6ac3c1852..5cd08331cbd5c 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -109,12 +109,11 @@ export const WorkspaceActions: FC = ({ {canBeUpdated && (isUpdating ? buttonMapping.updating : buttonMapping.update)} - {isRestarting && buttonMapping.restarting} - - {!isRestarting && - actionsByStatus.map((action) => ( - {buttonMapping[action]} - ))} + {isRestarting + ? buttonMapping.restarting + : actionsByStatus.map((action) => ( + {buttonMapping[action]} + ))} {canCancel && } From a4266e35d1cae5c4d87bee33690748bb3407f735 Mon Sep 17 00:00:00 2001 From: Parkreiner Date: Wed, 8 Nov 2023 19:35:18 +0000 Subject: [PATCH 08/14] refactor: clean up types --- .../WorkspacePage/WorkspaceActions/WorkspaceActions.tsx | 8 ++------ .../src/pages/WorkspacePage/WorkspaceActions/constants.ts | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index 5cd08331cbd5c..dd83b7c73d078 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -90,11 +90,7 @@ export const WorkspaceActions: FC = ({ activating: , }; - const { - canCancel, - canAcceptJobs, - actions: actionsByStatus, - } = actionsByWorkspaceStatus( + const { actions, canCancel, canAcceptJobs } = actionsByWorkspaceStatus( workspace, workspace.latest_build.status, canChangeVersions, @@ -111,7 +107,7 @@ export const WorkspaceActions: FC = ({ {isRestarting ? buttonMapping.restarting - : actionsByStatus.map((action) => ( + : actions.map((action) => ( {buttonMapping[action]} ))} diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts b/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts index efd6351ea5ea7..2de07fde8f533 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts +++ b/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts @@ -29,7 +29,7 @@ const buttonTypes = [ export type ButtonType = (typeof buttonTypes)[number]; interface WorkspaceAbilities { - actions: ButtonType[]; + actions: readonly ButtonType[]; canCancel: boolean; canAcceptJobs: boolean; } From 99c352696abea6d0558a2e45b1b72f044b393a8c Mon Sep 17 00:00:00 2001 From: Parkreiner Date: Wed, 8 Nov 2023 19:52:07 +0000 Subject: [PATCH 09/14] refactor: remove workspace errors enum --- .../pages/WorkspacePage/Workspace.stories.tsx | 8 ++--- site/src/pages/WorkspacePage/Workspace.tsx | 34 ++++++++----------- .../WorkspacePage/WorkspaceReadyPage.tsx | 8 ++--- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/site/src/pages/WorkspacePage/Workspace.stories.tsx b/site/src/pages/WorkspacePage/Workspace.stories.tsx index d77bff78c5875..7ef67ac0911eb 100644 --- a/site/src/pages/WorkspacePage/Workspace.stories.tsx +++ b/site/src/pages/WorkspacePage/Workspace.stories.tsx @@ -3,7 +3,7 @@ import { Meta, StoryObj } from "@storybook/react"; import { WatchAgentMetadataContext } from "components/Resources/AgentMetadata"; import { ProvisionerJobLog } from "api/typesGenerated"; import * as Mocks from "testHelpers/entities"; -import { Workspace, WorkspaceErrors } from "./Workspace"; +import { Workspace } from "./Workspace"; import { withReactContext } from "storybook-react-context"; import EventSource from "eventsourcemock"; import { ProxyContext, getPreferredProxy } from "contexts/ProxyContext"; @@ -133,7 +133,7 @@ export const Failed: Story = { ...Running.args, workspace: Mocks.MockFailedWorkspace, workspaceErrors: { - [WorkspaceErrors.BUILD_ERROR]: Mocks.mockApiError({ + buildError: Mocks.mockApiError({ message: "A workspace build is already active.", }), }, @@ -216,7 +216,7 @@ export const GetBuildsError: Story = { args: { ...Running.args, workspaceErrors: { - [WorkspaceErrors.GET_BUILDS_ERROR]: Mocks.mockApiError({ + getBuildsError: Mocks.mockApiError({ message: "There is a problem fetching builds.", }), }, @@ -227,7 +227,7 @@ export const CancellationError: Story = { args: { ...Failed.args, workspaceErrors: { - [WorkspaceErrors.CANCELLATION_ERROR]: Mocks.mockApiError({ + cancellationError: Mocks.mockApiError({ message: "Job could not be canceled.", }), }, diff --git a/site/src/pages/WorkspacePage/Workspace.tsx b/site/src/pages/WorkspacePage/Workspace.tsx index 00f086b62b19d..1ad55bed02329 100644 --- a/site/src/pages/WorkspacePage/Workspace.tsx +++ b/site/src/pages/WorkspacePage/Workspace.tsx @@ -30,11 +30,13 @@ import { BuildsTable } from "./BuildsTable"; import { WorkspaceDeletedBanner } from "./WorkspaceDeletedBanner"; import { WorkspaceStats } from "./WorkspaceStats"; -export enum WorkspaceErrors { - GET_BUILDS_ERROR = "getBuildsError", - BUILD_ERROR = "buildError", - CANCELLATION_ERROR = "cancellationError", -} +export type WorkspaceError = + | "getBuildsError" + | "buildError" + | "cancellationError"; + +export type WorkspaceErrors = Partial>; + export interface WorkspaceProps { scheduleProps: { onDeadlinePlus: (hours: number) => void; @@ -62,7 +64,7 @@ export interface WorkspaceProps { canChangeVersions: boolean; hideSSHButton?: boolean; hideVSCodeDesktopButton?: boolean; - workspaceErrors: Partial>; + workspaceErrors: WorkspaceErrors; buildInfo?: TypesGen.BuildInfoResponse; sshPrefix?: string; template?: TypesGen.Template; @@ -211,18 +213,12 @@ export const Workspace: FC> = ({ )} - {Boolean(workspaceErrors[WorkspaceErrors.BUILD_ERROR]) && ( - + {Boolean(workspaceErrors.buildError) && ( + )} - {Boolean(workspaceErrors[WorkspaceErrors.CANCELLATION_ERROR]) && ( - + {Boolean(workspaceErrors.cancellationError) && ( + )} {workspace.latest_build.status === "running" && @@ -338,10 +334,8 @@ export const Workspace: FC> = ({ /> )} - {workspaceErrors[WorkspaceErrors.GET_BUILDS_ERROR] ? ( - + {workspaceErrors.getBuildsError ? ( + ) : ( Date: Wed, 8 Nov 2023 20:14:35 +0000 Subject: [PATCH 10/14] fix: remove pointless render key --- site/src/pages/WorkspacePage/Workspace.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/site/src/pages/WorkspacePage/Workspace.tsx b/site/src/pages/WorkspacePage/Workspace.tsx index 1ad55bed02329..26b9ac74377f6 100644 --- a/site/src/pages/WorkspacePage/Workspace.tsx +++ b/site/src/pages/WorkspacePage/Workspace.tsx @@ -290,7 +290,6 @@ export const Workspace: FC> = ({ actions={ canRetryDebugMode && ( ); @@ -162,3 +167,13 @@ export const ActionLoadingButton: FC = ({ label }) => { ); }; + +export function RetryButton({ + handleAction, +}: Omit) { + return ( + + ); +} diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index 0ff0fd873945c..332ffa4151a15 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -10,6 +10,7 @@ import { RestartButton, UpdateButton, ActivateButton, + RetryButton, } from "./Buttons"; import { type ButtonType, actionsByWorkspaceStatus } from "./constants"; @@ -37,6 +38,7 @@ export interface WorkspaceActionsProps { handleCancel: () => void; handleSettings: () => void; handleChangeVersion: () => void; + handleRetry: () => void; handleDormantActivate: () => void; isUpdating: boolean; isRestarting: boolean; @@ -53,6 +55,7 @@ export const WorkspaceActions: FC = ({ handleUpdate, handleCancel, handleSettings, + handleRetry, handleChangeVersion, handleDormantActivate: handleDormantActivate, isUpdating, @@ -88,6 +91,7 @@ export const WorkspaceActions: FC = ({ pending: , activate: , activating: , + retry: , }; const { actions, canCancel, canAcceptJobs } = actionsByWorkspaceStatus( diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts b/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts index f5da1b5b414aa..886db9869099d 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts +++ b/site/src/pages/WorkspacePage/WorkspaceActions/constants.ts @@ -17,6 +17,11 @@ const buttonTypes = [ "activate", "activating", + // There's no need for a retrying state because retrying starts a transition + // into one of the starting, stopping, or deleting states (based on the + // WorkspaceTransition type) + "retry", + // These are buttons that should be used with disabled UI elements "canceling", "deleted", @@ -97,7 +102,7 @@ const statusToActions: Record = { // in the case of an error failed: { - actions: ["start", "stop"], + actions: ["retry"], canCancel: false, canAcceptJobs: true, },