Skip to content

Commit ae67e33

Browse files
authored
fix: set permissions for experimental Createworkspace page (#17254)
1 parent 510bc37 commit ae67e33

13 files changed

+54
-47
lines changed

site/src/modules/permissions/workspaces.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ export const workspacePermissionChecks = (
33
userId: string,
44
) =>
55
({
6-
createWorkspace: {
6+
createWorkspaceForUserID: {
77
object: {
88
resource_type: "workspace",
99
organization_id: organizationId,

site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ import { pageTitle } from "utils/page";
2626
import type { AutofillBuildParameter } from "utils/richParameters";
2727
import { paramsUsedToCreateWorkspace } from "utils/workspace";
2828
import { CreateWorkspacePageView } from "./CreateWorkspacePageView";
29-
import { type CreateWSPermissions, createWorkspaceChecks } from "./permissions";
29+
import {
30+
type CreateWorkspacePermissions,
31+
createWorkspaceChecks,
32+
} from "./permissions";
3033

3134
export const createWorkspaceModes = ["form", "auto", "duplicate"] as const;
3235
export type CreateWorkspaceMode = (typeof createWorkspaceModes)[number];
@@ -206,7 +209,7 @@ const CreateWorkspacePage: FC = () => {
206209
externalAuthPollingState={externalAuthPollingState}
207210
startPollingExternalAuth={startPollingExternalAuth}
208211
hasAllRequiredExternalAuth={hasAllRequiredExternalAuth}
209-
permissions={permissionsQuery.data as CreateWSPermissions}
212+
permissions={permissionsQuery.data as CreateWorkspacePermissions}
210213
parameters={realizedParameters as TemplateVersionParameter[]}
211214
presets={templateVersionPresetsQuery.data ?? []}
212215
creatingWorkspace={createWorkspaceMutation.isLoading}

site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@ import { Loader } from "components/Loader/Loader";
1717
import { useAuthenticated } from "contexts/auth/RequireAuth";
1818
import { useEffectEvent } from "hooks/hookPolyfills";
1919
import { useDashboard } from "modules/dashboard/useDashboard";
20-
import {
21-
type WorkspacePermissions,
22-
workspacePermissionChecks,
23-
} from "modules/permissions/workspaces";
2420
import { generateWorkspaceName } from "modules/workspaces/generateWorkspaceName";
2521
import { type FC, useCallback, useEffect, useRef, useState } from "react";
2622
import { Helmet } from "react-helmet-async";
@@ -32,6 +28,10 @@ import { paramsUsedToCreateWorkspace } from "utils/workspace";
3228
import { CreateWorkspacePageViewExperimental } from "./CreateWorkspacePageViewExperimental";
3329
export const createWorkspaceModes = ["form", "auto", "duplicate"] as const;
3430
export type CreateWorkspaceMode = (typeof createWorkspaceModes)[number];
31+
import {
32+
type CreateWorkspacePermissions,
33+
createWorkspaceChecks,
34+
} from "./permissions";
3535

3636
export type ExternalAuthPollingState = "idle" | "polling" | "abandoned";
3737

@@ -66,10 +66,7 @@ const CreateWorkspacePageExperimental: FC = () => {
6666
const permissionsQuery = useQuery(
6767
templateQuery.data
6868
? checkAuthorization({
69-
checks: workspacePermissionChecks(
70-
templateQuery.data.organization_id,
71-
me.id,
72-
),
69+
checks: createWorkspaceChecks(templateQuery.data.organization_id),
7370
})
7471
: { enabled: false },
7572
);
@@ -211,7 +208,7 @@ const CreateWorkspacePageExperimental: FC = () => {
211208
externalAuthPollingState={externalAuthPollingState}
212209
startPollingExternalAuth={startPollingExternalAuth}
213210
hasAllRequiredExternalAuth={hasAllRequiredExternalAuth}
214-
permissions={permissionsQuery.data as WorkspacePermissions}
211+
permissions={permissionsQuery.data as CreateWorkspacePermissions}
215212
parameters={realizedParameters as TemplateVersionParameter[]}
216213
presets={templateVersionPresetsQuery.data ?? []}
217214
creatingWorkspace={createWorkspaceMutation.isLoading}

site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const meta: Meta<typeof CreateWorkspacePageView> = {
2727
hasAllRequiredExternalAuth: true,
2828
mode: "form",
2929
permissions: {
30-
createWorkspaceForUser: true,
30+
createWorkspaceForAny: true,
3131
},
3232
onCancel: action("onCancel"),
3333
},

site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import type {
4646
ExternalAuthPollingState,
4747
} from "./CreateWorkspacePage";
4848
import { ExternalAuthButton } from "./ExternalAuthButton";
49-
import type { CreateWSPermissions } from "./permissions";
49+
import type { CreateWorkspacePermissions } from "./permissions";
5050
export const Language = {
5151
duplicationWarning:
5252
"Duplicating a workspace only copies its parameters. No state from the old workspace is copied over.",
@@ -68,7 +68,7 @@ export interface CreateWorkspacePageViewProps {
6868
parameters: TypesGen.TemplateVersionParameter[];
6969
autofillParameters: AutofillBuildParameter[];
7070
presets: TypesGen.Preset[];
71-
permissions: CreateWSPermissions;
71+
permissions: CreateWorkspacePermissions;
7272
creatingWorkspace: boolean;
7373
onCancel: () => void;
7474
onSubmit: (
@@ -255,7 +255,7 @@ export const CreateWorkspacePageView: FC<CreateWorkspacePageViewProps> = ({
255255
<FormSection
256256
title="General"
257257
description={
258-
permissions.createWorkspaceForUser
258+
permissions.createWorkspaceForAny
259259
? "The name of the workspace and its owner. Only admins can create workspaces for other users."
260260
: "The name of your new workspace."
261261
}
@@ -300,7 +300,7 @@ export const CreateWorkspacePageView: FC<CreateWorkspacePageViewProps> = ({
300300
</FormHelperText>
301301
</div>
302302

303-
{permissions.createWorkspaceForUser && (
303+
{permissions.createWorkspaceForAny && (
304304
<UserAutocomplete
305305
value={owner}
306306
onChange={(user) => {

site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import { Stack } from "components/Stack/Stack";
1515
import { UserAutocomplete } from "components/UserAutocomplete/UserAutocomplete";
1616
import { type FormikContextType, useFormik } from "formik";
1717
import { ArrowLeft } from "lucide-react";
18-
import type { WorkspacePermissions } from "modules/permissions/workspaces";
1918
import { generateWorkspaceName } from "modules/workspaces/generateWorkspaceName";
2019
import {
2120
type FC,
@@ -37,7 +36,7 @@ import type {
3736
ExternalAuthPollingState,
3837
} from "./CreateWorkspacePage";
3938
import { ExternalAuthButton } from "./ExternalAuthButton";
40-
39+
import type { CreateWorkspacePermissions } from "./permissions";
4140
export const Language = {
4241
duplicationWarning:
4342
"Duplicating a workspace only copies its parameters. No state from the old workspace is copied over.",
@@ -59,7 +58,7 @@ export interface CreateWorkspacePageViewExperimentalProps {
5958
parameters: TypesGen.TemplateVersionParameter[];
6059
autofillParameters: AutofillBuildParameter[];
6160
presets: TypesGen.Preset[];
62-
permissions: WorkspacePermissions;
61+
permissions: CreateWorkspacePermissions;
6362
creatingWorkspace: boolean;
6463
onCancel: () => void;
6564
onSubmit: (
@@ -253,7 +252,7 @@ export const CreateWorkspacePageViewExperimental: FC<
253252
<hgroup>
254253
<h2 className="text-xl font-semibold m-0">General</h2>
255254
<p className="text-sm text-content-secondary mt-0">
256-
{permissions.createWorkspace
255+
{permissions.createWorkspaceForAny
257256
? "Only admins can create workspaces for other users."
258257
: "The name of your new workspace."}
259258
</p>
@@ -300,7 +299,7 @@ export const CreateWorkspacePageViewExperimental: FC<
300299
</div>
301300
</div>
302301
</div>
303-
{permissions.createWorkspace && (
302+
{permissions.createWorkspaceForAny && (
304303
<div className="flex flex-col gap-2 flex-1">
305304
<Label className="text-sm" htmlFor={`${id}-workspace-name`}>
306305
Owner
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export const createWorkspaceChecks = (organizationId: string) =>
22
({
3-
createWorkspaceForUser: {
3+
createWorkspaceForAny: {
44
object: {
55
resource_type: "workspace",
66
organization_id: organizationId,
@@ -10,7 +10,7 @@ export const createWorkspaceChecks = (organizationId: string) =>
1010
},
1111
}) as const;
1212

13-
export type CreateWSPermissions = Record<
13+
export type CreateWorkspacePermissions = Record<
1414
keyof ReturnType<typeof createWorkspaceChecks>,
1515
boolean
1616
>;

site/src/pages/TemplatePage/TemplateLayout.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import { Loader } from "components/Loader/Loader";
66
import { Margins } from "components/Margins/Margins";
77
import { TabLink, Tabs, TabsList } from "components/Tabs/Tabs";
88
import { useAuthenticated } from "contexts/auth/RequireAuth";
9-
import { workspacePermissionChecks } from "modules/permissions/workspaces";
9+
import {
10+
type WorkspacePermissions,
11+
workspacePermissionChecks,
12+
} from "modules/permissions/workspaces";
1013
import {
1114
type FC,
1215
type PropsWithChildren,
@@ -113,7 +116,9 @@ export const TemplateLayout: FC<PropsWithChildren> = ({
113116
template={data.template}
114117
activeVersion={data.activeVersion}
115118
permissions={data.permissions}
116-
workspacePermissions={workspacePermissionsQuery.data}
119+
workspacePermissions={
120+
workspacePermissionsQuery.data as WorkspacePermissions
121+
}
117122
onDeleteTemplate={() => {
118123
navigate("/templates");
119124
}}

site/src/pages/TemplatePage/TemplatePageHeader.stories.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const meta: Meta<typeof TemplatePageHeader> = {
1414
canUpdateTemplate: true,
1515
},
1616
workspacePermissions: {
17-
createWorkspace: true,
17+
createWorkspaceForUserID: true,
1818
},
1919
},
2020
};
@@ -35,7 +35,7 @@ export const CanNotUpdate: Story = {
3535
export const CannotCreateWorkspace: Story = {
3636
args: {
3737
workspacePermissions: {
38-
createWorkspace: false,
38+
createWorkspaceForUserID: false,
3939
},
4040
},
4141
};

site/src/pages/TemplatePage/TemplatePageHeader.tsx

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
import { Pill } from "components/Pill/Pill";
3232
import { Stack } from "components/Stack/Stack";
3333
import { linkToTemplate, useLinks } from "modules/navigation";
34+
import type { WorkspacePermissions } from "modules/permissions/workspaces";
3435
import type { FC } from "react";
3536
import { useQuery } from "react-query";
3637
import { Link as RouterLink, useNavigate } from "react-router-dom";
@@ -158,7 +159,7 @@ export type TemplatePageHeaderProps = {
158159
template: Template;
159160
activeVersion: TemplateVersion;
160161
permissions: AuthorizationResponse;
161-
workspacePermissions: AuthorizationResponse;
162+
workspacePermissions: WorkspacePermissions;
162163
onDeleteTemplate: () => void;
163164
};
164165

@@ -179,16 +180,17 @@ export const TemplatePageHeader: FC<TemplatePageHeaderProps> = ({
179180
<PageHeader
180181
actions={
181182
<>
182-
{!template.deprecated && workspacePermissions.createWorkspace && (
183-
<Button
184-
variant="contained"
185-
startIcon={<AddIcon />}
186-
component={RouterLink}
187-
to={`${templateLink}/workspace`}
188-
>
189-
Create Workspace
190-
</Button>
191-
)}
183+
{!template.deprecated &&
184+
workspacePermissions.createWorkspaceForUserID && (
185+
<Button
186+
variant="contained"
187+
startIcon={<AddIcon />}
188+
component={RouterLink}
189+
to={`${templateLink}/workspace`}
190+
>
191+
Create Workspace
192+
</Button>
193+
)}
192194

193195
{permissions.canUpdateTemplate && (
194196
<TemplateMenu

site/src/pages/TemplatesPage/TemplatesPageView.stories.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export const WithTemplates: Story = {
7676
examples: [],
7777
workspacePermissions: {
7878
[MockTemplate.organization_id]: {
79-
createWorkspace: true,
79+
createWorkspaceForUserID: true,
8080
},
8181
},
8282
},
@@ -94,7 +94,7 @@ export const CannotCreateWorkspaces: Story = {
9494
...WithTemplates.args,
9595
workspacePermissions: {
9696
[MockTemplate.organization_id]: {
97-
createWorkspace: false,
97+
createWorkspaceForUserID: false,
9898
},
9999
},
100100
},

site/src/pages/TemplatesPage/TemplatesPageView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ const TemplateRow: FC<TemplateRowProps> = ({
160160
{template.deprecated ? (
161161
<DeprecatedBadge />
162162
) : workspacePermissions?.[template.organization_id]
163-
?.createWorkspace ? (
163+
?.createWorkspaceForUserID ? (
164164
<MuiButton
165165
size="small"
166166
css={styles.actionButton}

site/src/pages/WorkspacesPage/WorkspacesPage.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const WorkspacesPage: FC = () => {
4545

4646
const templatesQuery = useQuery(templates());
4747

48-
const orgPermissionsQuery = useQuery(
48+
const workspacePermissionsQuery = useQuery(
4949
workspacePermissionsByOrganization(
5050
templatesQuery.data?.map((template) => template.organization_id),
5151
me.id,
@@ -54,15 +54,16 @@ const WorkspacesPage: FC = () => {
5454

5555
// Filter templates based on workspace creation permission
5656
const filteredTemplates = useMemo(() => {
57-
if (!templatesQuery.data || !orgPermissionsQuery.data) {
57+
if (!templatesQuery.data || !workspacePermissionsQuery.data) {
5858
return templatesQuery.data;
5959
}
6060

6161
return templatesQuery.data.filter((template) => {
62-
const orgPermission = orgPermissionsQuery.data[template.organization_id];
63-
return orgPermission?.createWorkspace;
62+
const workspacePermission =
63+
workspacePermissionsQuery.data[template.organization_id];
64+
return workspacePermission?.createWorkspaceForUserID;
6465
});
65-
}, [templatesQuery.data, orgPermissionsQuery.data]);
66+
}, [templatesQuery.data, workspacePermissionsQuery.data]);
6667

6768
const filterProps = useWorkspacesFilter({
6869
searchParamsResult,

0 commit comments

Comments
 (0)