From ae67e33c66ce22c4594bad28300ccd317812ea71 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Fri, 4 Apr 2025 14:59:01 +0100 Subject: [PATCH] fix: set permissions for experimental Createworkspace page (#17254) --- site/src/modules/permissions/workspaces.ts | 2 +- .../CreateWorkspacePage.tsx | 7 ++++-- .../CreateWorkspacePageExperimental.tsx | 15 +++++------- .../CreateWorkspacePageView.stories.tsx | 2 +- .../CreateWorkspacePageView.tsx | 8 +++---- .../CreateWorkspacePageViewExperimental.tsx | 9 ++++--- .../pages/CreateWorkspacePage/permissions.ts | 4 ++-- .../src/pages/TemplatePage/TemplateLayout.tsx | 9 +++++-- .../TemplatePageHeader.stories.tsx | 4 ++-- .../pages/TemplatePage/TemplatePageHeader.tsx | 24 ++++++++++--------- .../TemplatesPageView.stories.tsx | 4 ++-- .../pages/TemplatesPage/TemplatesPageView.tsx | 2 +- .../pages/WorkspacesPage/WorkspacesPage.tsx | 11 +++++---- 13 files changed, 54 insertions(+), 47 deletions(-) diff --git a/site/src/modules/permissions/workspaces.ts b/site/src/modules/permissions/workspaces.ts index b0834877e8..8410571fa1 100644 --- a/site/src/modules/permissions/workspaces.ts +++ b/site/src/modules/permissions/workspaces.ts @@ -3,7 +3,7 @@ export const workspacePermissionChecks = ( userId: string, ) => ({ - createWorkspace: { + createWorkspaceForUserID: { object: { resource_type: "workspace", organization_id: organizationId, diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx index 150a79bd69..fd88e0cc23 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx @@ -26,7 +26,10 @@ import { pageTitle } from "utils/page"; import type { AutofillBuildParameter } from "utils/richParameters"; import { paramsUsedToCreateWorkspace } from "utils/workspace"; import { CreateWorkspacePageView } from "./CreateWorkspacePageView"; -import { type CreateWSPermissions, createWorkspaceChecks } from "./permissions"; +import { + type CreateWorkspacePermissions, + createWorkspaceChecks, +} from "./permissions"; export const createWorkspaceModes = ["form", "auto", "duplicate"] as const; export type CreateWorkspaceMode = (typeof createWorkspaceModes)[number]; @@ -206,7 +209,7 @@ const CreateWorkspacePage: FC = () => { externalAuthPollingState={externalAuthPollingState} startPollingExternalAuth={startPollingExternalAuth} hasAllRequiredExternalAuth={hasAllRequiredExternalAuth} - permissions={permissionsQuery.data as CreateWSPermissions} + permissions={permissionsQuery.data as CreateWorkspacePermissions} parameters={realizedParameters as TemplateVersionParameter[]} presets={templateVersionPresetsQuery.data ?? []} creatingWorkspace={createWorkspaceMutation.isLoading} diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx index 96198eb172..8598085c94 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx @@ -17,10 +17,6 @@ import { Loader } from "components/Loader/Loader"; import { useAuthenticated } from "contexts/auth/RequireAuth"; import { useEffectEvent } from "hooks/hookPolyfills"; import { useDashboard } from "modules/dashboard/useDashboard"; -import { - type WorkspacePermissions, - workspacePermissionChecks, -} from "modules/permissions/workspaces"; import { generateWorkspaceName } from "modules/workspaces/generateWorkspaceName"; import { type FC, useCallback, useEffect, useRef, useState } from "react"; import { Helmet } from "react-helmet-async"; @@ -32,6 +28,10 @@ import { paramsUsedToCreateWorkspace } from "utils/workspace"; import { CreateWorkspacePageViewExperimental } from "./CreateWorkspacePageViewExperimental"; export const createWorkspaceModes = ["form", "auto", "duplicate"] as const; export type CreateWorkspaceMode = (typeof createWorkspaceModes)[number]; +import { + type CreateWorkspacePermissions, + createWorkspaceChecks, +} from "./permissions"; export type ExternalAuthPollingState = "idle" | "polling" | "abandoned"; @@ -66,10 +66,7 @@ const CreateWorkspacePageExperimental: FC = () => { const permissionsQuery = useQuery( templateQuery.data ? checkAuthorization({ - checks: workspacePermissionChecks( - templateQuery.data.organization_id, - me.id, - ), + checks: createWorkspaceChecks(templateQuery.data.organization_id), }) : { enabled: false }, ); @@ -211,7 +208,7 @@ const CreateWorkspacePageExperimental: FC = () => { externalAuthPollingState={externalAuthPollingState} startPollingExternalAuth={startPollingExternalAuth} hasAllRequiredExternalAuth={hasAllRequiredExternalAuth} - permissions={permissionsQuery.data as WorkspacePermissions} + permissions={permissionsQuery.data as CreateWorkspacePermissions} parameters={realizedParameters as TemplateVersionParameter[]} presets={templateVersionPresetsQuery.data ?? []} creatingWorkspace={createWorkspaceMutation.isLoading} diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx index 47d1198765..564209f076 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx @@ -27,7 +27,7 @@ const meta: Meta = { hasAllRequiredExternalAuth: true, mode: "form", permissions: { - createWorkspaceForUser: true, + createWorkspaceForAny: true, }, onCancel: action("onCancel"), }, diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx index 656e18563e..5dc9c8d0a4 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx @@ -46,7 +46,7 @@ import type { ExternalAuthPollingState, } from "./CreateWorkspacePage"; import { ExternalAuthButton } from "./ExternalAuthButton"; -import type { CreateWSPermissions } from "./permissions"; +import type { CreateWorkspacePermissions } from "./permissions"; export const Language = { duplicationWarning: "Duplicating a workspace only copies its parameters. No state from the old workspace is copied over.", @@ -68,7 +68,7 @@ export interface CreateWorkspacePageViewProps { parameters: TypesGen.TemplateVersionParameter[]; autofillParameters: AutofillBuildParameter[]; presets: TypesGen.Preset[]; - permissions: CreateWSPermissions; + permissions: CreateWorkspacePermissions; creatingWorkspace: boolean; onCancel: () => void; onSubmit: ( @@ -255,7 +255,7 @@ export const CreateWorkspacePageView: FC = ({ = ({ - {permissions.createWorkspaceForUser && ( + {permissions.createWorkspaceForAny && ( { diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx index a200a76f61..ff8c2836be 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx @@ -15,7 +15,6 @@ import { Stack } from "components/Stack/Stack"; import { UserAutocomplete } from "components/UserAutocomplete/UserAutocomplete"; import { type FormikContextType, useFormik } from "formik"; import { ArrowLeft } from "lucide-react"; -import type { WorkspacePermissions } from "modules/permissions/workspaces"; import { generateWorkspaceName } from "modules/workspaces/generateWorkspaceName"; import { type FC, @@ -37,7 +36,7 @@ import type { ExternalAuthPollingState, } from "./CreateWorkspacePage"; import { ExternalAuthButton } from "./ExternalAuthButton"; - +import type { CreateWorkspacePermissions } from "./permissions"; export const Language = { duplicationWarning: "Duplicating a workspace only copies its parameters. No state from the old workspace is copied over.", @@ -59,7 +58,7 @@ export interface CreateWorkspacePageViewExperimentalProps { parameters: TypesGen.TemplateVersionParameter[]; autofillParameters: AutofillBuildParameter[]; presets: TypesGen.Preset[]; - permissions: WorkspacePermissions; + permissions: CreateWorkspacePermissions; creatingWorkspace: boolean; onCancel: () => void; onSubmit: ( @@ -253,7 +252,7 @@ export const CreateWorkspacePageViewExperimental: FC<

General

- {permissions.createWorkspace + {permissions.createWorkspaceForAny ? "Only admins can create workspaces for other users." : "The name of your new workspace."}

@@ -300,7 +299,7 @@ export const CreateWorkspacePageViewExperimental: FC< - {permissions.createWorkspace && ( + {permissions.createWorkspaceForAny && (