Skip to content

Commit be24cb8

Browse files
committed
Scope create template button to any org
If you can create a template in any organization, you will see the create template button in the workspace page. The permission is renamed to canCreateAnyTemplate to make it clear any org will work. Additionally, renamed updateTemplates to updateAllTemplates to make it clear the permission is site-wide. I removed deleteTemplates because it is not used anywhere.
1 parent 848815c commit be24cb8

File tree

13 files changed

+43
-46
lines changed

13 files changed

+43
-46
lines changed

site/src/contexts/auth/permissions.tsx

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ export const checks = {
22
viewAllUsers: "viewAllUsers",
33
updateUsers: "updateUsers",
44
createUser: "createUser",
5-
createTemplates: "createTemplates",
6-
updateTemplates: "updateTemplates",
7-
deleteTemplates: "deleteTemplates",
85
viewAuditLog: "viewAuditLog",
6+
createAnyTemplate: "createAnyTemplate",
7+
updateAllTemplates: "updateAllTemplates",
98
viewDeploymentValues: "viewDeploymentValues",
109
createGroup: "createGroup",
1110
viewUpdateCheck: "viewUpdateCheck",
@@ -33,24 +32,19 @@ export const permissionsToCheck = {
3332
},
3433
action: "create",
3534
},
36-
[checks.createTemplates]: {
35+
[checks.createAnyTemplate]: {
3736
object: {
3837
resource_type: "template",
38+
any_org: true,
3939
},
4040
action: "update",
4141
},
42-
[checks.updateTemplates]: {
42+
[checks.updateAllTemplates]: {
4343
object: {
4444
resource_type: "template",
4545
},
4646
action: "update",
4747
},
48-
[checks.deleteTemplates]: {
49-
object: {
50-
resource_type: "template",
51-
},
52-
action: "delete",
53-
},
5448
[checks.viewAuditLog]: {
5549
object: {
5650
resource_type: "audit_log",

site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ export const TemplateVersionPage: FC = () => {
7474
versionName={versionName}
7575
templateName={templateName}
7676
createWorkspaceUrl={
77-
permissions.updateTemplates ? createWorkspaceUrl : undefined
77+
// TODO: Does it make sense to allow org admins to create a workspace
78+
// from this version too if it belongs to their org?
79+
permissions.updateAllTemplates ? createWorkspaceUrl : undefined
7880
}
7981
/>
8082
</>

site/src/pages/TemplatesPage/EmptyTemplates.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,17 @@ const findFeaturedExamples = (examples: TemplateExample[]) => {
3636
};
3737

3838
interface EmptyTemplatesProps {
39-
canCreateTemplates: boolean;
39+
canCreateAnyTemplate: boolean;
4040
examples: TemplateExample[];
4141
}
4242

4343
export const EmptyTemplates: FC<EmptyTemplatesProps> = ({
44-
canCreateTemplates,
44+
canCreateAnyTemplate,
4545
examples,
4646
}) => {
4747
const featuredExamples = findFeaturedExamples(examples);
4848

49-
if (canCreateTemplates) {
49+
if (canCreateAnyTemplate) {
5050
return (
5151
<TableEmpty
5252
message="Create your first template"

site/src/pages/TemplatesPage/TemplatesPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const TemplatesPage: FC = () => {
1414
const templatesQuery = useQuery(templates(organizationId));
1515
const examplesQuery = useQuery({
1616
...templateExamples(organizationId),
17-
enabled: permissions.createTemplates,
17+
enabled: permissions.createAnyTemplate,
1818
});
1919
const error = templatesQuery.error || examplesQuery.error;
2020

@@ -25,7 +25,7 @@ export const TemplatesPage: FC = () => {
2525
</Helmet>
2626
<TemplatesPageView
2727
error={error}
28-
canCreateTemplates={permissions.createTemplates}
28+
canCreateAnyTemplate={permissions.createAnyTemplate}
2929
examples={examplesQuery.data}
3030
templates={templatesQuery.data}
3131
/>

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ type Story = StoryObj<typeof TemplatesPageView>;
1919

2020
export const WithTemplates: Story = {
2121
args: {
22-
canCreateTemplates: true,
22+
canCreateAnyTemplate: true,
2323
error: undefined,
2424
templates: [
2525
MockTemplate,
@@ -69,7 +69,7 @@ export const WithTemplates: Story = {
6969

7070
export const EmptyCanCreate: Story = {
7171
args: {
72-
canCreateTemplates: true,
72+
canCreateAnyTemplate: true,
7373
error: undefined,
7474
templates: [],
7575
examples: [MockTemplateExample, MockTemplateExample2],
@@ -81,7 +81,7 @@ export const EmptyCannotCreate: Story = {
8181
error: undefined,
8282
templates: [],
8383
examples: [MockTemplateExample, MockTemplateExample2],
84-
canCreateTemplates: false,
84+
canCreateAnyTemplate: false,
8585
},
8686
};
8787

@@ -92,6 +92,6 @@ export const Error: Story = {
9292
}),
9393
templates: undefined,
9494
examples: undefined,
95-
canCreateTemplates: false,
95+
canCreateAnyTemplate: false,
9696
},
9797
};

site/src/pages/TemplatesPage/TemplatesPageView.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,14 @@ export interface TemplatesPageViewProps {
154154
error?: unknown;
155155
examples: TemplateExample[] | undefined;
156156
templates: Template[] | undefined;
157-
canCreateTemplates: boolean;
157+
canCreateAnyTemplate: boolean;
158158
}
159159

160160
export const TemplatesPageView: FC<TemplatesPageViewProps> = ({
161161
templates,
162162
error,
163163
examples,
164-
canCreateTemplates,
164+
canCreateAnyTemplate,
165165
}) => {
166166
const isLoading = !templates;
167167
const isEmpty = templates && templates.length === 0;
@@ -171,7 +171,7 @@ export const TemplatesPageView: FC<TemplatesPageViewProps> = ({
171171
<Margins>
172172
<PageHeader
173173
actions={
174-
canCreateTemplates && <CreateTemplateButton onNavigate={navigate} />
174+
canCreateAnyTemplate && <CreateTemplateButton onNavigate={navigate} />
175175
}
176176
>
177177
<PageHeaderTitle>
@@ -206,7 +206,7 @@ export const TemplatesPageView: FC<TemplatesPageViewProps> = ({
206206

207207
{isEmpty ? (
208208
<EmptyTemplates
209-
canCreateTemplates={canCreateTemplates}
209+
canCreateAnyTemplate={canCreateAnyTemplate}
210210
examples={examples ?? []}
211211
/>
212212
) : (

site/src/pages/WorkspacePage/WorkspacePage.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@ describe("WorkspacePage", () => {
121121
server.use(
122122
http.post("/api/v2/authcheck", async () => {
123123
return HttpResponse.json({
124-
updateTemplates: true,
125-
updateWorkspace: true,
126124
updateTemplate: true,
125+
updateWorkspace: true,
126+
createAnyTemplate: true,
127127
});
128128
}),
129129
);

site/src/pages/WorkspacesPage/WorkspacesEmpty.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import { TableEmpty } from "components/TableEmpty/TableEmpty";
88
export const WorkspacesEmpty = (props: {
99
isUsingFilter: boolean;
1010
templates?: Template[];
11-
canCreateTemplate: boolean;
11+
canCreateAnyTemplate: boolean;
1212
}) => {
13-
const { isUsingFilter, templates, canCreateTemplate } = props;
13+
const { isUsingFilter, templates, canCreateAnyTemplate } = props;
1414
const totalFeaturedTemplates = 6;
1515
const featuredTemplates = templates?.slice(0, totalFeaturedTemplates);
1616
const defaultTitle = "Create a workspace";
@@ -38,7 +38,7 @@ export const WorkspacesEmpty = (props: {
3838
return <TableEmpty message="No results matched your search" />;
3939
}
4040

41-
if (templates && templates.length === 0 && canCreateTemplate) {
41+
if (templates && templates.length === 0 && canCreateAnyTemplate) {
4242
return (
4343
<TableEmpty
4444
message={defaultTitle}
@@ -61,7 +61,7 @@ export const WorkspacesEmpty = (props: {
6161
);
6262
}
6363

64-
if (templates && templates.length === 0 && !canCreateTemplate) {
64+
if (templates && templates.length === 0 && !canCreateAnyTemplate) {
6565
return (
6666
<TableEmpty
6767
message={defaultTitle}

site/src/pages/WorkspacesPage/WorkspacesPage.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,10 @@ const WorkspacesPage: FC = () => {
8484
</Helmet>
8585

8686
<WorkspacesPageView
87-
canCreateTemplate={permissions.createTemplates}
88-
canChangeVersions={permissions.updateTemplates}
87+
canCreateAnyTemplate={permissions.createAnyTemplate}
88+
// TODO: Does it make sense to allow org admins too if the selected
89+
// templates belong to their org?
90+
canChangeVersions={permissions.updateAllTemplates}
8991
checkedWorkspaces={checkedWorkspaces}
9092
onCheckChange={setCheckedWorkspaces}
9193
canCheckWorkspaces={canCheckWorkspaces}

site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ export const OwnerHasNoWorkspaces: Story = {
185185
args: {
186186
workspaces: [],
187187
count: 0,
188-
canCreateTemplate: true,
188+
canCreateAnyTemplate: true,
189189
},
190190
};
191191

@@ -194,15 +194,15 @@ export const OwnerHasNoWorkspacesAndNoTemplates: Story = {
194194
workspaces: [],
195195
templates: [],
196196
count: 0,
197-
canCreateTemplate: true,
197+
canCreateAnyTemplate: true,
198198
},
199199
};
200200

201201
export const UserHasNoWorkspaces: Story = {
202202
args: {
203203
workspaces: [],
204204
count: 0,
205-
canCreateTemplate: false,
205+
canCreateAnyTemplate: false,
206206
},
207207
};
208208

@@ -211,7 +211,7 @@ export const UserHasNoWorkspacesAndNoTemplates: Story = {
211211
workspaces: [],
212212
templates: [],
213213
count: 0,
214-
canCreateTemplate: false,
214+
canCreateAnyTemplate: false,
215215
},
216216
};
217217

0 commit comments

Comments
 (0)