From ff4fc2f25d7e88890bf7a1e28e49be6013a44cf2 Mon Sep 17 00:00:00 2001 From: "blink-so[bot]" <211532188+blink-so[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 15:16:11 +0000 Subject: [PATCH 1/5] feat: add View Source button for template administrators in workspace creation Adds a View Source button to the workspace creation page that allows template administrators to quickly navigate to the template editor. The button: - Only appears for users with template update permissions - Links directly to the template version editor - Uses the ExternalLinkIcon for consistency with other source viewing features - Is positioned next to the Cancel button in the page header This addresses user friction where template admins expect to be able to edit templates directly from the workspace creation flow. Co-authored-by: matifali <10648092+matifali@users.noreply.github.com> --- .../CreateWorkspacePage.tsx | 12 ++++++++++- .../CreateWorkspacePageView.tsx | 20 ++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx index 243bd3cb9be2d..c10bd4d39e09f 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx @@ -65,7 +65,16 @@ const CreateWorkspacePage: FC = () => { }); const permissionsQuery = useQuery({ ...checkAuthorization({ - checks: createWorkspaceChecks(templateQuery.data?.organization_id ?? ""), + checks: { + ...createWorkspaceChecks(templateQuery.data?.organization_id ?? ""), + canUpdateTemplate: { + object: { + resource_type: "template", + resource_id: templateQuery.data?.id ?? "", + }, + action: "update", + }, + }, }), enabled: !!templateQuery.data, }); @@ -208,6 +217,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/CreateWorkspacePageView.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx index 75c382f807b1b..8b4326c5f145f 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx @@ -28,7 +28,9 @@ import { UserAutocomplete } from "components/UserAutocomplete/UserAutocomplete"; import { type FormikContextType, useFormik } from "formik"; import type { ExternalAuthPollingState } from "hooks/useExternalAuth"; import { generateWorkspaceName } from "modules/workspaces/generateWorkspaceName"; +import { ExternalLinkIcon } from "lucide-react"; 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,19 @@ export const CreateWorkspacePageView: FC = ({ - Cancel - + + {canUpdateTemplate && ( + + )} + + } > From 91e19e89c7965c2ad97e89ee919f43f2f31df6d8 Mon Sep 17 00:00:00 2001 From: "blink-so[bot]" <211532188+blink-so[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 15:18:38 +0000 Subject: [PATCH 2/5] fix: format Link component to match linting requirements Co-authored-by: matifali <10648092+matifali@users.noreply.github.com> --- .../src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx index 8b4326c5f145f..de2e4d929da9e 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx @@ -225,7 +225,9 @@ export const CreateWorkspacePageView: 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< pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy