diff --git a/site/src/pages/TemplatePage/TemplateVersionsPage/VersionRow.tsx b/site/src/pages/TemplatePage/TemplateVersionsPage/VersionRow.tsx index 3aac57cbae8..71e39e45ddb 100644 --- a/site/src/pages/TemplatePage/TemplateVersionsPage/VersionRow.tsx +++ b/site/src/pages/TemplatePage/TemplateVersionsPage/VersionRow.tsx @@ -7,6 +7,7 @@ import { InfoTooltip } from "#/components/InfoTooltip/InfoTooltip"; import { Pill } from "#/components/Pill/Pill"; import { TableCell } from "#/components/Table/Table"; import { TimelineEntry } from "#/components/Timeline/TimelineEntry"; +import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useClickableTableRow } from "#/hooks/useClickableTableRow"; interface VersionRowProps { @@ -25,6 +26,7 @@ export const VersionRow: FC = ({ onArchiveClick, }) => { const navigate = useNavigate(); + const { permissions } = useAuthenticated(); const clickableProps = useClickableTableRow({ onClick: () => navigate(version.name), @@ -33,7 +35,11 @@ export const VersionRow: FC = ({ const jobStatus = version.job.status; return ( - +
diff --git a/site/src/pages/TemplatePage/TemplateVersionsPage/VersionsTable.stories.tsx b/site/src/pages/TemplatePage/TemplateVersionsPage/VersionsTable.stories.tsx index fecde1b2d71..7b40e29fc7b 100644 --- a/site/src/pages/TemplatePage/TemplateVersionsPage/VersionsTable.stories.tsx +++ b/site/src/pages/TemplatePage/TemplateVersionsPage/VersionsTable.stories.tsx @@ -1,22 +1,32 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { action } from "storybook/actions"; +import { within } from "storybook/test"; import { MockCanceledProvisionerJob, MockCancelingProvisionerJob, MockFailedProvisionerJob, + MockNoPermissions, MockPendingProvisionerJob, + MockPermissions, MockRunningProvisionerJob, MockTemplateVersion, + MockUserOwner, } from "#/testHelpers/entities"; +import { withAuthProvider } from "#/testHelpers/storybook"; import { VersionsTable } from "./VersionsTable"; const meta: Meta = { title: "pages/TemplatePage/VersionsTable", component: VersionsTable, + parameters: { + user: MockUserOwner, + permissions: MockPermissions, + }, args: { onPromoteClick: () => {}, onArchiveClick: () => {}, }, + decorators: [withAuthProvider], }; export default meta; @@ -35,6 +45,23 @@ export const Example: Story = { MockTemplateVersion, ], }, + play: async ({ canvasElement }) => { + // With permissions.updateTemplates, VersionRow is a clickable button + const canvas = within(canvasElement); + await canvas.findByRole("button", { name: MockTemplateVersion.name }); + }, +}; + +export const NoUpdatePermission: Story = { + args: { ...Example.args }, + parameters: { + permissions: MockNoPermissions, + }, + play: async ({ canvasElement }) => { + // Without permissions.updateTemplates, VersionRow is a non-clickable row + const canvas = within(canvasElement); + await canvas.findByRole("row", { name: MockTemplateVersion.name }); + }, }; export const NoEditPermission: Story = {