From 0f4a3df2c60cfe84aacb6e31494235e0bd25fec1 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Thu, 18 Jun 2026 19:57:55 +0500 Subject: [PATCH] fix: respect automatic_updates policy when building workspace action list (#26362) --- site/src/modules/workspaces/actions.ts | 10 ++++++++ .../WorkspaceActions/WorkspaceActions.tsx | 23 +++---------------- .../WorkspacesPage/WorkspacesPage.test.tsx | 18 +++++++++++++++ site/src/testHelpers/entities.ts | 2 +- 4 files changed, 32 insertions(+), 21 deletions(-) diff --git a/site/src/modules/workspaces/actions.ts b/site/src/modules/workspaces/actions.ts index ea00bf3774..d69208bc72 100644 --- a/site/src/modules/workspaces/actions.ts +++ b/site/src/modules/workspaces/actions.ts @@ -86,6 +86,11 @@ export const abilitiesByWorkspaceStatus = ( if (workspace.template_require_active_version && workspace.outdated) { actions.push("updateAndRestartRequireActiveVersion"); + } else if ( + workspace.automatic_updates === "always" && + workspace.outdated + ) { + actions.unshift("updateAndRestart"); } else { if (workspace.outdated) { actions.unshift("updateAndRestart"); @@ -111,6 +116,11 @@ export const abilitiesByWorkspaceStatus = ( if (workspace.template_require_active_version && workspace.outdated) { actions.push("updateAndStartRequireActiveVersion"); + } else if ( + workspace.automatic_updates === "always" && + workspace.outdated + ) { + actions.push("updateAndStart"); } else { if (workspace.outdated) { actions.unshift("updateAndStart"); diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index 8a5cb54468..f4912801a4 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -9,7 +9,6 @@ import { } from "#/modules/workspaces/actions"; import type { WorkspacePermissions } from "#/modules/workspaces/permissions"; import { WorkspaceMoreActions } from "#/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions"; -import { mustUpdateWorkspace } from "#/utils/workspace"; import { ActivateButton, CancelButton, @@ -71,13 +70,8 @@ export const WorkspaceActions: FC = ({ }, ); - const mustUpdate = mustUpdateWorkspace( - workspace, - permissions.updateWorkspaceVersion, - ); const tooltipText = getTooltipText( workspace, - mustUpdate, permissions.updateWorkspaceVersion, ); @@ -116,7 +110,6 @@ export const WorkspaceActions: FC = ({ ), @@ -125,17 +118,16 @@ export const WorkspaceActions: FC = ({ loading workspace={workspace} handleAction={handleStart} - disabled={mustUpdate} tooltipText={tooltipText} /> ), + stop: , stopping: , restart: ( ), @@ -144,10 +136,10 @@ export const WorkspaceActions: FC = ({ loading workspace={workspace} handleAction={handleRestart} - disabled={mustUpdate} tooltipText={tooltipText} /> ), + deleting: , canceling: , deleted: , @@ -203,18 +195,9 @@ export const WorkspaceActions: FC = ({ function getTooltipText( workspace: Workspace, - mustUpdate: boolean, canChangeVersions: boolean, ): string { - if (!mustUpdate && !canChangeVersions) { - return ""; - } - - if ( - !mustUpdate && - canChangeVersions && - workspace.template_require_active_version - ) { + if (canChangeVersions && workspace.template_require_active_version) { return "This template requires automatic updates on workspace startup, but template administrators can ignore this policy."; } diff --git a/site/src/pages/WorkspacesPage/WorkspacesPage.test.tsx b/site/src/pages/WorkspacesPage/WorkspacesPage.test.tsx index 6dae88d1ff..e10d88521b 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPage.test.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPage.test.tsx @@ -11,6 +11,7 @@ import type { import { MockDormantOutdatedWorkspace, MockDormantWorkspace, + MockOutdatedStoppedWorkspaceAlwaysUpdate, MockOutdatedWorkspace, MockRunningOutdatedWorkspace, MockStoppedWorkspace, @@ -394,4 +395,21 @@ describe("WorkspaceApps filtering", () => { }), ).not.toBeInTheDocument(); }); + + it("does not show start button for stopped outdated workspace with automatic_updates always", async () => { + vi.spyOn(API, "getWorkspaces").mockResolvedValue({ + workspaces: [MockOutdatedStoppedWorkspaceAlwaysUpdate], + count: 1, + }); + + renderWithAuth(); + await waitForLoaderToBeRemoved(); + + expect( + screen.queryByRole("button", { name: "Start workspace" }), + ).not.toBeInTheDocument(); + expect( + screen.getByRole("button", { name: "Update and start workspace" }), + ).toBeInTheDocument(); + }); }); diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index 6eb84004b6..a1db10dd2b 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -1804,7 +1804,7 @@ export const MockOutdatedStoppedWorkspaceRequireActiveVersion: TypesGen.Workspac }, }; -const _MockOutdatedStoppedWorkspaceAlwaysUpdate: TypesGen.Workspace = { +export const MockOutdatedStoppedWorkspaceAlwaysUpdate: TypesGen.Workspace = { ...MockOutdatedRunningWorkspaceAlwaysUpdate, latest_build: { ...MockWorkspaceBuild,