From b1555df2ad20249f25981fc39816eb4cab4a9fc2 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Wed, 10 Jan 2024 15:57:11 +0000 Subject: [PATCH 1/6] fix: remove cancel button if user cannot cancel job --- site/src/pages/WorkspacePage/Workspace.tsx | 2 +- .../WorkspacePage/WorkspaceActions/WorkspaceActions.tsx | 5 ++++- site/src/pages/WorkspacePage/WorkspaceTopbar.tsx | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/site/src/pages/WorkspacePage/Workspace.tsx b/site/src/pages/WorkspacePage/Workspace.tsx index e19f485aa903a..1eeb7b6c34a04 100644 --- a/site/src/pages/WorkspacePage/Workspace.tsx +++ b/site/src/pages/WorkspacePage/Workspace.tsx @@ -55,7 +55,7 @@ export interface WorkspaceProps { workspaceErrors: WorkspaceErrors; buildInfo?: TypesGen.BuildInfoResponse; sshPrefix?: string; - template?: TypesGen.Template; + template: TypesGen.Template; canRetryDebugMode: boolean; handleBuildRetry: () => void; handleBuildRetryDebug: () => void; diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index 0032c933e3b03..2e37446b91e7a 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -46,6 +46,7 @@ export interface WorkspaceActionsProps { children?: ReactNode; canChangeVersions: boolean; canRetryDebug: boolean; + templateUserCanCancel: boolean; } export const WorkspaceActions: FC = ({ @@ -65,6 +66,7 @@ export const WorkspaceActions: FC = ({ isRestarting, canChangeVersions, canRetryDebug, + templateUserCanCancel, }) => { const { duplicateWorkspace, isDuplicationReady } = useWorkspaceDuplication(workspace); @@ -73,6 +75,7 @@ export const WorkspaceActions: FC = ({ workspace, canRetryDebug, ); + const cancelEnabled = canCancel && templateUserCanCancel const mustUpdate = workspaceUpdatePolicy(workspace, canChangeVersions) === "always" && @@ -146,7 +149,7 @@ export const WorkspaceActions: FC = ({ {buttonMapping[action]} ))} - {canCancel && } + {cancelEnabled && } diff --git a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx index 375e47a22b039..4ee8626b90dc6 100644 --- a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx @@ -30,6 +30,7 @@ import { Popover, PopoverTrigger } from "components/Popover/Popover"; import { HelpTooltipContent } from "components/HelpTooltip/HelpTooltip"; import { AvatarData } from "components/AvatarData/AvatarData"; import { ExternalAvatar } from "components/Avatar/Avatar"; +import { usePermissions } from "hooks"; export type WorkspaceError = | "getBuildsError" @@ -79,6 +80,7 @@ export const WorkspaceTopbar = (props: WorkspaceProps) => { handleBuildRetryDebug, } = props; const theme = useTheme(); + const permissions = usePermissions(); // Quota const hasDailyCost = workspace.latest_build.daily_cost > 0; @@ -265,6 +267,7 @@ export const WorkspaceTopbar = (props: WorkspaceProps) => { canChangeVersions={canChangeVersions} isUpdating={isUpdating} isRestarting={isRestarting} + userCanCancel={permissions.updateTemplates} /> From 98f1c4b8681f25f1e64bced124383384702f1084 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Wed, 10 Jan 2024 16:21:00 +0000 Subject: [PATCH 2/6] sync with backend logic --- .../WorkspacePage/WorkspaceActions/WorkspaceActions.tsx | 8 +++++--- site/src/pages/WorkspacePage/WorkspaceTopbar.tsx | 3 --- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index 2e37446b91e7a..fe7cfc29dd56c 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -27,6 +27,7 @@ import { } from "components/MoreMenu/MoreMenu"; import { TopbarIconButton } from "components/FullPageLayout/Topbar"; import MoreVertOutlined from "@mui/icons-material/MoreVertOutlined"; +import { useMe } from "hooks"; export interface WorkspaceActionsProps { workspace: Workspace; @@ -46,7 +47,6 @@ export interface WorkspaceActionsProps { children?: ReactNode; canChangeVersions: boolean; canRetryDebug: boolean; - templateUserCanCancel: boolean; } export const WorkspaceActions: FC = ({ @@ -66,8 +66,10 @@ export const WorkspaceActions: FC = ({ isRestarting, canChangeVersions, canRetryDebug, - templateUserCanCancel, }) => { + const me = useMe(); + const isOwner = me.roles.find((role) => role.name === "owner"); + const { duplicateWorkspace, isDuplicationReady } = useWorkspaceDuplication(workspace); @@ -75,7 +77,7 @@ export const WorkspaceActions: FC = ({ workspace, canRetryDebug, ); - const cancelEnabled = canCancel && templateUserCanCancel + const cancelEnabled = canCancel || isOwner const mustUpdate = workspaceUpdatePolicy(workspace, canChangeVersions) === "always" && diff --git a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx index 4ee8626b90dc6..375e47a22b039 100644 --- a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx @@ -30,7 +30,6 @@ import { Popover, PopoverTrigger } from "components/Popover/Popover"; import { HelpTooltipContent } from "components/HelpTooltip/HelpTooltip"; import { AvatarData } from "components/AvatarData/AvatarData"; import { ExternalAvatar } from "components/Avatar/Avatar"; -import { usePermissions } from "hooks"; export type WorkspaceError = | "getBuildsError" @@ -80,7 +79,6 @@ export const WorkspaceTopbar = (props: WorkspaceProps) => { handleBuildRetryDebug, } = props; const theme = useTheme(); - const permissions = usePermissions(); // Quota const hasDailyCost = workspace.latest_build.daily_cost > 0; @@ -267,7 +265,6 @@ export const WorkspaceTopbar = (props: WorkspaceProps) => { canChangeVersions={canChangeVersions} isUpdating={isUpdating} isRestarting={isRestarting} - userCanCancel={permissions.updateTemplates} /> From 06b3a3629b23e465c7b6debcea738bb0dfef3810 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Wed, 10 Jan 2024 16:24:01 +0000 Subject: [PATCH 3/6] fmt --- .../pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index fe7cfc29dd56c..8c2297b2c4721 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -77,7 +77,7 @@ export const WorkspaceActions: FC = ({ workspace, canRetryDebug, ); - const cancelEnabled = canCancel || isOwner + const cancelEnabled = canCancel || isOwner; const mustUpdate = workspaceUpdatePolicy(workspace, canChangeVersions) === "always" && From cd8965d387ab883a56eb605fa12f79f438283207 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Wed, 10 Jan 2024 16:42:58 +0000 Subject: [PATCH 4/6] Correct logic --- .../WorkspacePage/WorkspaceActions/WorkspaceActions.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index 8c2297b2c4721..6f78ccd6872dc 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -77,7 +77,9 @@ export const WorkspaceActions: FC = ({ workspace, canRetryDebug, ); - const cancelEnabled = canCancel || isOwner; + const showCancel = + canCancel && + (workspace.template_allow_user_cancel_workspace_jobs || isOwner); const mustUpdate = workspaceUpdatePolicy(workspace, canChangeVersions) === "always" && @@ -151,7 +153,7 @@ export const WorkspaceActions: FC = ({ {buttonMapping[action]} ))} - {cancelEnabled && } + {showCancel && } From 8e0d002e96f7d7aef2083e929442b1d239c021c8 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Thu, 11 Jan 2024 16:55:39 +0000 Subject: [PATCH 5/6] more prop drilling --- site/src/pages/WorkspacePage/Workspace.tsx | 3 ++ .../WorkspaceActions.stories.tsx | 28 +++++++++++++++++++ .../WorkspaceActions/WorkspaceActions.tsx | 6 ++-- .../WorkspacePage/WorkspaceReadyPage.tsx | 6 ++++ .../pages/WorkspacePage/WorkspaceTopbar.tsx | 3 ++ 5 files changed, 42 insertions(+), 4 deletions(-) diff --git a/site/src/pages/WorkspacePage/Workspace.tsx b/site/src/pages/WorkspacePage/Workspace.tsx index 1eeb7b6c34a04..43a63db4e694b 100644 --- a/site/src/pages/WorkspacePage/Workspace.tsx +++ b/site/src/pages/WorkspacePage/Workspace.tsx @@ -61,6 +61,7 @@ export interface WorkspaceProps { handleBuildRetryDebug: () => void; buildLogs?: React.ReactNode; canAutostart: boolean; + isOwner: boolean; } /** @@ -93,6 +94,7 @@ export const Workspace: FC = ({ handleBuildRetryDebug, buildLogs, canAutostart, + isOwner, }) => { const navigate = useNavigate(); const { saveLocal, getLocal } = useLocalStorage(); @@ -199,6 +201,7 @@ export const Workspace: FC = ({ isUpdating={isUpdating} isRestarting={isRestarting} canUpdateWorkspace={canUpdateWorkspace} + isOwner={isOwner} />
= ({ @@ -66,10 +66,8 @@ export const WorkspaceActions: FC = ({ isRestarting, canChangeVersions, canRetryDebug, + isOwner, }) => { - const me = useMe(); - const isOwner = me.roles.find((role) => role.name === "owner"); - const { duplicateWorkspace, isDuplicationReady } = useWorkspaceDuplication(workspace); diff --git a/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx b/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx index f267d1689f1fd..c7e284e7bf88e 100644 --- a/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx @@ -36,6 +36,7 @@ import { WorkspacePermissions } from "./permissions"; import { workspaceResolveAutostart } from "api/queries/workspaceQuota"; import { WorkspaceDeleteDialog } from "./WorkspaceDeleteDialog"; import dayjs from "dayjs"; +import { useMe } from "hooks"; interface WorkspaceReadyPageProps { template: TypesGen.Template; @@ -56,6 +57,10 @@ export const WorkspaceReadyPage = ({ throw Error("Workspace is undefined"); } + // Owner + const me = useMe(); + const isOwner = me.roles.find((role) => role.name === "owner") !== undefined; + // Debug mode const { data: deploymentValues } = useQuery({ ...deploymentConfig(), @@ -247,6 +252,7 @@ export const WorkspaceReadyPage = ({ ) } canAutostart={canAutostart} + isOwner={isOwner} /> void; handleBuildRetryDebug: () => void; + isOwner: boolean; } export const WorkspaceTopbar = (props: WorkspaceProps) => { @@ -77,6 +78,7 @@ export const WorkspaceTopbar = (props: WorkspaceProps) => { canRetryDebugMode, handleBuildRetry, handleBuildRetryDebug, + isOwner, } = props; const theme = useTheme(); @@ -265,6 +267,7 @@ export const WorkspaceTopbar = (props: WorkspaceProps) => { canChangeVersions={canChangeVersions} isUpdating={isUpdating} isRestarting={isRestarting} + isOwner={isOwner} />
From e401894eeb529ed03ee9a50d3e18164e87ef20f5 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Thu, 11 Jan 2024 16:56:10 +0000 Subject: [PATCH 6/6] fmt --- .../WorkspacePage/WorkspaceActions/WorkspaceActions.stories.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.stories.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.stories.tsx index 648557f96b42c..f56c0456a46e9 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.stories.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.stories.tsx @@ -133,5 +133,3 @@ export const CancelHiddenForUser: Story = { isOwner: false, }, }; - -