Skip to content

Commit 6719ed6

Browse files
committed
RBAC (unfinished) and style tweak
1 parent 4437f61 commit 6719ed6

File tree

3 files changed

+44
-21
lines changed

3 files changed

+44
-21
lines changed

site/src/pages/TemplatePage/TemplatePage.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
import { useMachine } from "@xstate/react"
1+
import { useMachine, useSelector } from "@xstate/react"
22
import { ConfirmDialog } from "components/ConfirmDialog/ConfirmDialog"
3-
import { FC } from "react"
3+
import { FC, useContext } from "react"
44
import { Helmet } from "react-helmet-async"
55
import { useTranslation } from "react-i18next"
66
import { Navigate, useParams } from "react-router-dom"
7+
import { selectPermissions } from "xServices/auth/authSelectors"
8+
import { XServiceContext } from "xServices/StateContext"
79
import { Loader } from "../../components/Loader/Loader"
810
import { useOrganizationId } from "../../hooks/useOrganizationId"
911
import { pageTitle } from "../../util/page"
@@ -37,7 +39,9 @@ export const TemplatePage: FC<React.PropsWithChildren<unknown>> = () => {
3739
templateVersions,
3840
deleteTemplateError,
3941
} = templateState.context
40-
const isLoading = !template || !activeTemplateVersion || !templateResources
42+
const xServices = useContext(XServiceContext)
43+
const permissions = useSelector(xServices.authXService, selectPermissions)
44+
const isLoading = !template || !activeTemplateVersion || !templateResources || !permissions
4145

4246
const handleDeleteTemplate = () => {
4347
templateSend("DELETE")
@@ -61,6 +65,7 @@ export const TemplatePage: FC<React.PropsWithChildren<unknown>> = () => {
6165
activeTemplateVersion={activeTemplateVersion}
6266
templateResources={templateResources}
6367
templateVersions={templateVersions}
68+
canDeleteTemplate={permissions.deleteTemplates}
6469
handleDeleteTemplate={handleDeleteTemplate}
6570
deleteTemplateError={deleteTemplateError}
6671
/>

site/src/pages/TemplatePage/TemplatePageView.tsx

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export interface TemplatePageViewProps {
4141
templateVersions?: TemplateVersion[]
4242
handleDeleteTemplate: (templateId: string) => void
4343
deleteTemplateError: Error | unknown
44+
canDeleteTemplate: boolean
4445
}
4546

4647
export const TemplatePageView: FC<React.PropsWithChildren<TemplatePageViewProps>> = ({
@@ -50,6 +51,7 @@ export const TemplatePageView: FC<React.PropsWithChildren<TemplatePageViewProps>
5051
templateVersions,
5152
handleDeleteTemplate,
5253
deleteTemplateError,
54+
canDeleteTemplate
5355
}) => {
5456
const styles = useStyles()
5557
const readme = frontMatter(activeTemplateVersion.readme)
@@ -59,6 +61,15 @@ export const TemplatePageView: FC<React.PropsWithChildren<TemplatePageViewProps>
5961
return resources.filter((resource) => resource.workspace_transition === "start")
6062
}
6163

64+
const createWorkspaceButton = (className: string) => <Link
65+
underline="none"
66+
component={RouterLink}
67+
to={`/templates/${template.name}/workspace`}
68+
>
69+
<Button className={className} startIcon={<AddCircleOutline />}>{Language.createButton}</Button>
70+
</Link>
71+
72+
6273
return (
6374
<Margins>
6475
<>
@@ -76,24 +87,20 @@ export const TemplatePageView: FC<React.PropsWithChildren<TemplatePageViewProps>
7687
</Button>
7788
</Link>
7889

79-
<DropdownButton
80-
primaryAction={
81-
<Link
82-
underline="none"
83-
component={RouterLink}
84-
to={`/templates/${template.name}/workspace`}
85-
>
86-
<Button startIcon={<AddCircleOutline />}>{Language.createButton}</Button>
87-
</Link>
88-
}
89-
secondaryActions={[
90-
{
91-
action: "delete",
92-
button: <DeleteButton handleAction={() => handleDeleteTemplate(template.id)} />,
93-
},
94-
]}
95-
canCancel={false}
96-
/>
90+
{canDeleteTemplate ?
91+
<DropdownButton
92+
primaryAction={createWorkspaceButton(styles.actionButton)}
93+
secondaryActions={[
94+
{
95+
action: "delete",
96+
button: <DeleteButton handleAction={() => handleDeleteTemplate(template.id)} />,
97+
},
98+
]}
99+
canCancel={false}
100+
/>
101+
:
102+
createWorkspaceButton("")
103+
}
97104
</Stack>
98105
}
99106
>
@@ -156,6 +163,10 @@ export const TemplatePageView: FC<React.PropsWithChildren<TemplatePageViewProps>
156163

157164
export const useStyles = makeStyles((theme) => {
158165
return {
166+
actionButton: {
167+
border: "none",
168+
borderRadius: `${theme.shape.borderRadius}px 0px 0px ${theme.shape.borderRadius}px`,
169+
},
159170
readmeContents: {
160171
margin: 0,
161172
},

site/src/xServices/auth/authXService.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export const checks = {
1414
updateUsers: "updateUsers",
1515
createUser: "createUser",
1616
createTemplates: "createTemplates",
17+
deleteTemplates: "deleteTemplates",
1718
viewAuditLog: "viewAuditLog",
1819
} as const
1920

@@ -42,6 +43,12 @@ export const permissionsToCheck = {
4243
},
4344
action: "update",
4445
},
46+
[checks.deleteTemplates]: {
47+
object: {
48+
resource_type: "template"
49+
},
50+
action: "delete"
51+
},
4552
[checks.viewAuditLog]: {
4653
object: {
4754
resource_type: "audit_log",

0 commit comments

Comments
 (0)