diff --git a/coderd/workspaces.go b/coderd/workspaces.go index 3adbb6b0e8..96cb57fadf 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -2353,6 +2353,17 @@ func (api *API) patchWorkspaceACL(rw http.ResponseWriter, r *http.Request) { return } + // Don't allow adding new groups or users to a workspace associated with a + // task. Sharing a task workspace without sharing the task itself is a broken + // half measure that we don't want to support right now. To be fixed! + if workspace.TaskID.Valid { + httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ + Message: "Task workspaces cannot be shared.", + Detail: "This workspace is managed by a task. Task sharing has not yet been implemented.", + }) + return + } + apiKey := httpmw.APIKey(r) if _, ok := req.UserRoles[apiKey.UserID.String()]; ok { httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ diff --git a/site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx b/site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx index 971db6aad7..69f77f2a73 100644 --- a/site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx +++ b/site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx @@ -7,7 +7,6 @@ import { DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, - DropdownMenuSeparator, DropdownMenuTrigger, } from "components/DropdownMenu/DropdownMenu"; import { CoderIcon } from "components/Icons/CoderIcon"; @@ -22,13 +21,7 @@ import { } from "components/Tooltip/Tooltip"; import { useAuthenticated } from "hooks"; import { useSearchParamsKey } from "hooks/useSearchParamsKey"; -import { - EditIcon, - EllipsisIcon, - PanelLeftIcon, - Share2Icon, - TrashIcon, -} from "lucide-react"; +import { EditIcon, EllipsisIcon, PanelLeftIcon, TrashIcon } from "lucide-react"; import { type FC, useState } from "react"; import { useQuery } from "react-query"; import { Link as RouterLink, useNavigate, useParams } from "react-router"; @@ -234,15 +227,6 @@ const TaskSidebarMenuItem: FC = ({ task }) => { - - - - Share - - - { diff --git a/site/src/modules/workspaces/WorkspaceSharingForm/WorkspaceSharingForm.tsx b/site/src/modules/workspaces/WorkspaceSharingForm/WorkspaceSharingForm.tsx index 6760a48d2a..196ff53332 100644 --- a/site/src/modules/workspaces/WorkspaceSharingForm/WorkspaceSharingForm.tsx +++ b/site/src/modules/workspaces/WorkspaceSharingForm/WorkspaceSharingForm.tsx @@ -141,6 +141,7 @@ export const RoleSelectField: FC = ({ interface WorkspaceSharingFormProps { workspaceACL: WorkspaceACL | undefined; canUpdatePermissions: boolean; + isTaskWorkspace: boolean; error: unknown; onUpdateUser: (user: WorkspaceUser, role: WorkspaceRole) => void; updatingUserId: WorkspaceUser["id"] | undefined; @@ -156,6 +157,7 @@ interface WorkspaceSharingFormProps { export const WorkspaceSharingForm: FC = ({ workspaceACL, canUpdatePermissions, + isTaskWorkspace, error, updatingUserId, onUpdateUser, @@ -185,14 +187,24 @@ export const WorkspaceSharingForm: FC = ({ const tableBody = ( - {!workspaceACL ? ( + {isTaskWorkspace ? ( + + + + + + ) : !workspaceACL ? ( ) : isEmpty ? ( diff --git a/site/src/pages/TaskPage/TaskPage.tsx b/site/src/pages/TaskPage/TaskPage.tsx index 0863f980c2..0808fe851d 100644 --- a/site/src/pages/TaskPage/TaskPage.tsx +++ b/site/src/pages/TaskPage/TaskPage.tsx @@ -5,7 +5,6 @@ import { workspaceBuildParameters } from "api/queries/workspaceBuilds"; import { startWorkspace, workspaceByOwnerAndName, - workspacePermissions, } from "api/queries/workspaces"; import type { Workspace, @@ -79,7 +78,6 @@ const TaskPage = () => { return state.error ? false : 5_000; }, }); - const { data: permissions } = useQuery(workspacePermissions(workspace)); const refetch = taskQuery.error ? taskQuery.refetch : workspaceQuery.refetch; const error = taskQuery.error ?? workspaceQuery.error; const waitingStatuses: WorkspaceStatus[] = ["starting", "pending"]; @@ -200,11 +198,7 @@ const TaskPage = () => { {pageTitle(task.display_name)} - + {content} = ({ - task, - workspace, - canUpdatePermissions, -}) => { +export const TaskTopbar: FC = ({ task, workspace }) => { return (
@@ -79,11 +70,6 @@ export const TaskTopbar: FC = ({ - - - { - e.stopPropagation(); - navigate( - `/@${task.owner_name}/${task.workspace_name}/settings/sharing`, - ); - }} - > - - Share - - { diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/ShareButton.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/ShareButton.tsx index c19ee06172..e0b9e375fb 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/ShareButton.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/ShareButton.tsx @@ -35,6 +35,7 @@ export const ShareButton: FC = ({ = ({