Content-Length: 9901 | pFad | http://github.com/coder/coder/pull/18951.diff

thub.com diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx index 243bd3cb9be2d..6d057a73d1a50 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx @@ -65,7 +65,10 @@ const CreateWorkspacePage: FC = () => { }); const permissionsQuery = useQuery({ ...checkAuthorization({ - checks: createWorkspaceChecks(templateQuery.data?.organization_id ?? ""), + checks: createWorkspaceChecks( + templateQuery.data?.organization_id ?? "", + templateQuery.data?.id, + ), }), enabled: !!templateQuery.data, }); @@ -208,6 +211,7 @@ const CreateWorkspacePage: FC = () => { startPollingExternalAuth={startPollingExternalAuth} hasAllRequiredExternalAuth={hasAllRequiredExternalAuth} permissions={permissionsQuery.data as CreateWorkspacePermissions} + canUpdateTemplate={permissionsQuery.data?.canUpdateTemplate} parameters={realizedParameters as TemplateVersionParameter[]} presets={templateVersionPresetsQuery.data ?? []} creatingWorkspace={createWorkspaceMutation.isPending} diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx index 2e39c5625a6cb..b69ef084a77f7 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx @@ -79,7 +79,10 @@ const CreateWorkspacePageExperimental: FC = () => { }); const permissionsQuery = useQuery({ ...checkAuthorization({ - checks: createWorkspaceChecks(templateQuery.data?.organization_id ?? ""), + checks: createWorkspaceChecks( + templateQuery.data?.organization_id ?? "", + templateQuery.data?.id, + ), }), enabled: !!templateQuery.data, }); @@ -292,6 +295,7 @@ const CreateWorkspacePageExperimental: FC = () => { owner={owner} setOwner={setOwner} autofillParameters={autofillParameters} + canUpdateTemplate={permissionsQuery.data?.canUpdateTemplate} error={ wsError || createWorkspaceMutation.error || diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx index f085c74c57073..d061b604f6b42 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx @@ -28,6 +28,7 @@ const meta: Meta = { mode: "form", permissions: { createWorkspaceForAny: true, + canUpdateTemplate: false, }, onCancel: action("onCancel"), }, @@ -382,3 +383,23 @@ export const ExternalAuthAllConnected: Story = { ], }, }; + +export const WithViewSourceButton: Story = { + args: { + canUpdateTemplate: true, + versionId: "template-version-123", + template: { + ...MockTemplate, + organization_name: "default", + name: "docker-template", + }, + }, + parameters: { + docs: { + description: { + story: + "This story shows the View Source button that appears for template administrators. The button allows quick navigation to the template editor from the workspace creation page.", + }, + }, + }, +}; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx index 75c382f807b1b..ceac49988c0a5 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx @@ -27,8 +27,10 @@ import { Switch } from "components/Switch/Switch"; import { UserAutocomplete } from "components/UserAutocomplete/UserAutocomplete"; import { type FormikContextType, useFormik } from "formik"; import type { ExternalAuthPollingState } from "hooks/useExternalAuth"; +import { ExternalLinkIcon } from "lucide-react"; import { generateWorkspaceName } from "modules/workspaces/generateWorkspaceName"; import { type FC, useCallback, useEffect, useMemo, useState } from "react"; +import { Link } from "react-router-dom"; import { getFormHelpers, nameValidator, @@ -67,6 +69,7 @@ interface CreateWorkspacePageViewProps { presets: TypesGen.Preset[]; permissions: CreateWorkspacePermissions; creatingWorkspace: boolean; + canUpdateTemplate?: boolean; onCancel: () => void; onSubmit: ( req: TypesGen.CreateWorkspaceRequest, @@ -92,6 +95,7 @@ export const CreateWorkspacePageView: FC = ({ presets = [], permissions, creatingWorkspace, + canUpdateTemplate, onSubmit, onCancel, }) => { @@ -218,9 +222,21 @@ export const CreateWorkspacePageView: FC = ({ - Cancel - + + {canUpdateTemplate && ( + + )} + + } > diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.stories.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.stories.tsx index e00b04fd6bf50..0fcf5d7fbb854 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.stories.tsx @@ -20,6 +20,7 @@ const meta: Meta = { parameters: [], permissions: { createWorkspaceForAny: true, + canUpdateTemplate: false, }, presets: [], sendMessage: () => {}, @@ -38,3 +39,23 @@ export const WebsocketError: Story = { ), }, }; + +export const WithViewSourceButton: Story = { + args: { + canUpdateTemplate: true, + versionId: "template-version-123", + template: { + ...MockTemplate, + organization_name: "default", + name: "docker-template", + }, + }, + parameters: { + docs: { + description: { + story: + "This story shows the View Source button that appears for template administrators in the experimental workspace creation page. The button allows quick navigation to the template editor.", + }, + }, + }, +}; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx index 8cb6c4acb6e49..49c4f8a4d5465 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx @@ -27,7 +27,7 @@ import { import { UserAutocomplete } from "components/UserAutocomplete/UserAutocomplete"; import { type FormikContextType, useFormik } from "formik"; import type { ExternalAuthPollingState } from "hooks/useExternalAuth"; -import { ArrowLeft, CircleHelp } from "lucide-react"; +import { ArrowLeft, CircleHelp, ExternalLinkIcon } from "lucide-react"; import { useSyncFormParameters } from "modules/hooks/useSyncFormParameters"; import { Diagnostics, @@ -44,6 +44,7 @@ import { useRef, useState, } from "react"; +import { Link as RouterLink } from "react-router-dom"; import { docs } from "utils/docs"; import { nameValidator } from "utils/formUtils"; import type { AutofillBuildParameter } from "utils/richParameters"; @@ -54,6 +55,7 @@ import type { CreateWorkspacePermissions } from "./permissions"; interface CreateWorkspacePageViewExperimentalProps { autofillParameters: AutofillBuildParameter[]; + canUpdateTemplate?: boolean; creatingWorkspace: boolean; defaultName?: string | null; defaultOwner: TypesGen.User; @@ -85,6 +87,7 @@ export const CreateWorkspacePageViewExperimental: FC< CreateWorkspacePageViewExperimentalProps > = ({ autofillParameters, + canUpdateTemplate, creatingWorkspace, defaultName, defaultOwner, @@ -379,6 +382,16 @@ export const CreateWorkspacePageViewExperimental: FC< )} + {canUpdateTemplate && ( + + )}

New workspace

diff --git a/site/src/pages/CreateWorkspacePage/permissions.ts b/site/src/pages/CreateWorkspacePage/permissions.ts index 1d933432a6e7c..a5ca3a469f623 100644 --- a/site/src/pages/CreateWorkspacePage/permissions.ts +++ b/site/src/pages/CreateWorkspacePage/permissions.ts @@ -1,13 +1,25 @@ -export const createWorkspaceChecks = (organizationId: string) => +export const createWorkspaceChecks = ( + organizationId: string, + templateId?: string, +) => ({ createWorkspaceForAny: { object: { - resource_type: "workspace", + resource_type: "workspace" as const, organization_id: organizationId, owner_id: "*", }, - action: "create", + action: "create" as const, }, + ...(templateId && { + canUpdateTemplate: { + object: { + resource_type: "template" as const, + resource_id: templateId, + }, + action: "update" as const, + }, + }), }) as const; export type CreateWorkspacePermissions = Record<








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://github.com/coder/coder/pull/18951.diff

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy