Skip to content

Commit f9f94b5

Browse files
authored
fix: remove cancel button if user cannot cancel job (#11553)
1 parent 8c3a4f2 commit f9f94b5

File tree

5 files changed

+45
-2
lines changed

5 files changed

+45
-2
lines changed

site/src/pages/WorkspacePage/Workspace.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,13 @@ export interface WorkspaceProps {
5555
workspaceErrors: WorkspaceErrors;
5656
buildInfo?: TypesGen.BuildInfoResponse;
5757
sshPrefix?: string;
58-
template?: TypesGen.Template;
58+
template: TypesGen.Template;
5959
canRetryDebugMode: boolean;
6060
handleBuildRetry: () => void;
6161
handleBuildRetryDebug: () => void;
6262
buildLogs?: React.ReactNode;
6363
canAutostart: boolean;
64+
isOwner: boolean;
6465
}
6566

6667
/**
@@ -93,6 +94,7 @@ export const Workspace: FC<WorkspaceProps> = ({
9394
handleBuildRetryDebug,
9495
buildLogs,
9596
canAutostart,
97+
isOwner,
9698
}) => {
9799
const navigate = useNavigate();
98100
const { saveLocal, getLocal } = useLocalStorage();
@@ -199,6 +201,7 @@ export const Workspace: FC<WorkspaceProps> = ({
199201
isUpdating={isUpdating}
200202
isRestarting={isRestarting}
201203
canUpdateWorkspace={canUpdateWorkspace}
204+
isOwner={isOwner}
202205
/>
203206

204207
<div

site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.stories.tsx

+26
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,29 @@ export const AlwaysUpdateStopped: Story = {
107107
canChangeVersions: true,
108108
},
109109
};
110+
111+
export const CancelShownForOwner: Story = {
112+
args: {
113+
workspace: {
114+
...Mocks.MockStartingWorkspace,
115+
template_allow_user_cancel_workspace_jobs: false,
116+
},
117+
isOwner: true,
118+
},
119+
};
120+
export const CancelShownForUser: Story = {
121+
args: {
122+
workspace: Mocks.MockStartingWorkspace,
123+
isOwner: false,
124+
},
125+
};
126+
127+
export const CancelHiddenForUser: Story = {
128+
args: {
129+
workspace: {
130+
...Mocks.MockStartingWorkspace,
131+
template_allow_user_cancel_workspace_jobs: false,
132+
},
133+
isOwner: false,
134+
},
135+
};

site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx

+6-1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export interface WorkspaceActionsProps {
4646
children?: ReactNode;
4747
canChangeVersions: boolean;
4848
canRetryDebug: boolean;
49+
isOwner: boolean;
4950
}
5051

5152
export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
@@ -65,6 +66,7 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
6566
isRestarting,
6667
canChangeVersions,
6768
canRetryDebug,
69+
isOwner,
6870
}) => {
6971
const { duplicateWorkspace, isDuplicationReady } =
7072
useWorkspaceDuplication(workspace);
@@ -73,6 +75,9 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
7375
workspace,
7476
canRetryDebug,
7577
);
78+
const showCancel =
79+
canCancel &&
80+
(workspace.template_allow_user_cancel_workspace_jobs || isOwner);
7681

7782
const mustUpdate =
7883
workspaceUpdatePolicy(workspace, canChangeVersions) === "always" &&
@@ -146,7 +151,7 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
146151
<Fragment key={action}>{buttonMapping[action]}</Fragment>
147152
))}
148153

149-
{canCancel && <CancelButton handleAction={handleCancel} />}
154+
{showCancel && <CancelButton handleAction={handleCancel} />}
150155

151156
<MoreMenu>
152157
<MoreMenuTrigger>

site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx

+6
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import { WorkspacePermissions } from "./permissions";
3636
import { workspaceResolveAutostart } from "api/queries/workspaceQuota";
3737
import { WorkspaceDeleteDialog } from "./WorkspaceDeleteDialog";
3838
import dayjs from "dayjs";
39+
import { useMe } from "hooks";
3940

4041
interface WorkspaceReadyPageProps {
4142
template: TypesGen.Template;
@@ -56,6 +57,10 @@ export const WorkspaceReadyPage = ({
5657
throw Error("Workspace is undefined");
5758
}
5859

60+
// Owner
61+
const me = useMe();
62+
const isOwner = me.roles.find((role) => role.name === "owner") !== undefined;
63+
5964
// Debug mode
6065
const { data: deploymentValues } = useQuery({
6166
...deploymentConfig(),
@@ -247,6 +252,7 @@ export const WorkspaceReadyPage = ({
247252
)
248253
}
249254
canAutostart={canAutostart}
255+
isOwner={isOwner}
250256
/>
251257

252258
<WorkspaceDeleteDialog

site/src/pages/WorkspacePage/WorkspaceTopbar.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export interface WorkspaceProps {
5656
canRetryDebugMode: boolean;
5757
handleBuildRetry: () => void;
5858
handleBuildRetryDebug: () => void;
59+
isOwner: boolean;
5960
}
6061

6162
export const WorkspaceTopbar = (props: WorkspaceProps) => {
@@ -77,6 +78,7 @@ export const WorkspaceTopbar = (props: WorkspaceProps) => {
7778
canRetryDebugMode,
7879
handleBuildRetry,
7980
handleBuildRetryDebug,
81+
isOwner,
8082
} = props;
8183
const theme = useTheme();
8284

@@ -263,6 +265,7 @@ export const WorkspaceTopbar = (props: WorkspaceProps) => {
263265
canChangeVersions={canChangeVersions}
264266
isUpdating={isUpdating}
265267
isRestarting={isRestarting}
268+
isOwner={isOwner}
266269
/>
267270
</div>
268271
</Topbar>

0 commit comments

Comments
 (0)