Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4f142fa

Browse files
authored
feat: add minimal frontend for creating workspaces from specific template versions (#9475)
1 parent 40fcabf commit 4f142fa

File tree

7 files changed

+75
-32
lines changed

7 files changed

+75
-32
lines changed

site/src/i18n/en/createWorkspacePage.json

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"templateLabel": "Template",
3+
"versionLabel": "Version ID",
34
"nameLabel": "Workspace Name",
45
"ownerLabel": "Owner",
56
"createWorkspace": "Create Workspace",

site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx

+11-2
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,23 @@ const CreateWorkspacePage: FC = () => {
4242
defaultBuildParameters,
4343
defaultName:
4444
mode === "auto" ? generateUniqueName() : searchParams.get("name") ?? "",
45+
versionId: searchParams.get("version") ?? undefined,
4546
},
4647
actions: {
4748
onCreateWorkspace: (_, event) => {
4849
navigate(`/@${event.data.owner_name}/${event.data.name}`);
4950
},
5051
},
5152
});
52-
const { template, error, parameters, permissions, gitAuth, defaultName } =
53-
createWorkspaceState.context;
53+
const {
54+
template,
55+
error,
56+
parameters,
57+
permissions,
58+
gitAuth,
59+
defaultName,
60+
versionId,
61+
} = createWorkspaceState.context;
5462
const title = createWorkspaceState.matches("autoCreating")
5563
? "Creating workspace..."
5664
: "Create Workspace";
@@ -74,6 +82,7 @@ const CreateWorkspacePage: FC = () => {
7482
defaultBuildParameters={defaultBuildParameters}
7583
error={error}
7684
template={template as Template}
85+
versionId={versionId}
7786
gitAuth={gitAuth as TemplateVersionGitAuth[]}
7887
permissions={permissions as CreateWSPermissions}
7988
parameters={parameters as TemplateVersionParameter[]}

site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx

+23
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@ import {
3030
import { CreateWSPermissions } from "xServices/createWorkspace/createWorkspaceXService";
3131
import { GitAuth } from "./GitAuth";
3232
import { ErrorAlert } from "components/Alert/ErrorAlert";
33+
import { Stack } from "components/Stack/Stack";
3334

3435
export interface CreateWorkspacePageViewProps {
3536
error: unknown;
3637
defaultName: string;
3738
defaultOwner: TypesGen.User;
3839
template: TypesGen.Template;
40+
versionId?: string;
3941
gitAuth: TypesGen.TemplateVersionGitAuth[];
4042
parameters: TypesGen.TemplateVersionParameter[];
4143
defaultBuildParameters: TypesGen.WorkspaceBuildParameter[];
@@ -53,6 +55,7 @@ export const CreateWorkspacePageView: FC<CreateWorkspacePageViewProps> = ({
5355
defaultName,
5456
defaultOwner,
5557
template,
58+
versionId,
5659
gitAuth,
5760
parameters,
5861
defaultBuildParameters,
@@ -115,6 +118,19 @@ export const CreateWorkspacePageView: FC<CreateWorkspacePageViewProps> = ({
115118
>
116119
<FormFields>
117120
<SelectedTemplate template={template} />
121+
{versionId && (
122+
<Stack spacing={1} className={styles.hasDescription}>
123+
<TextField
124+
disabled
125+
fullWidth
126+
value={versionId}
127+
label={t("versionLabel")}
128+
/>
129+
<span className={styles.description}>
130+
This parameter has been preset, and cannot be modified.
131+
</span>
132+
</Stack>
133+
)}
118134
<TextField
119135
{...getFieldHelpers("name")}
120136
disabled={form.isSubmitting}
@@ -252,6 +268,13 @@ const useGitAuthVerification = (gitAuth: TypesGen.TemplateVersionGitAuth[]) => {
252268
};
253269

254270
const useStyles = makeStyles((theme) => ({
271+
hasDescription: {
272+
paddingBottom: theme.spacing(2),
273+
},
274+
description: {
275+
fontSize: 13,
276+
color: theme.palette.text.secondary,
277+
},
255278
warningText: {
256279
color: theme.palette.warning.light,
257280
},

site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor/TemplateVersionEditor.tsx

+3-14
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ export interface TemplateVersionEditorProps {
6565
onCancelPublish: () => void;
6666
publishingError: unknown;
6767
publishedVersion?: TemplateVersion;
68-
publishedVersionIsDefault?: boolean;
6968
onCreateWorkspace: () => void;
7069
isAskingPublishParameters: boolean;
7170
isPromptingMissingVariables: boolean;
@@ -104,7 +103,6 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
104103
isPublishing,
105104
publishingError,
106105
publishedVersion,
107-
publishedVersionIsDefault,
108106
onCreateWorkspace,
109107
buildLogs,
110108
resources,
@@ -213,18 +211,9 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
213211
severity="success"
214212
dismissible
215213
actions={
216-
// TODO: Only show this button when the version we just published is the
217-
// new primary version. We should remove this condition soon, when we can
218-
// create workspaces using any version, not just the primary.
219-
publishedVersionIsDefault && (
220-
<Button
221-
variant="text"
222-
size="small"
223-
onClick={onCreateWorkspace}
224-
>
225-
Create a workspace
226-
</Button>
227-
)
214+
<Button variant="text" size="small" onClick={onCreateWorkspace}>
215+
Create a workspace
216+
</Button>
228217
}
229218
>
230219
Successfully published {publishedVersion.name}!

site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx

+9-4
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,16 @@ export const TemplateVersionEditorPage: FC = () => {
7777
isPublishing={editorState.matches("publishingVersion")}
7878
publishingError={editorState.context.publishingError}
7979
publishedVersion={editorState.context.lastSuccessfulPublishedVersion}
80-
publishedVersionIsDefault={
81-
editorState.context.lastSuccessfulPublishIsDefault
82-
}
8380
onCreateWorkspace={() => {
84-
navigate(`/templates/${templateName}/workspace`);
81+
const params = new URLSearchParams();
82+
const publishedVersion =
83+
editorState.context.lastSuccessfulPublishedVersion;
84+
if (publishedVersion) {
85+
params.set("version", publishedVersion.id);
86+
}
87+
navigate(
88+
`/templates/${templateName}/workspace?${params.toString()}`,
89+
);
8590
}}
8691
disablePreview={editorState.hasTag("loading")}
8792
disableUpdate={

site/src/xServices/createWorkspace/createWorkspaceXService.ts

+27-6
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ type CreateWorkspaceContext = {
2525
templateName: string;
2626
mode: CreateWorkspaceMode;
2727
defaultName: string;
28+
// Not exposed in the form yet, but can be set as a search param to
29+
// create a workspace with a specific version of a template
30+
versionId?: string;
2831
error?: unknown;
2932
// Form
3033
template?: Template;
@@ -149,21 +152,39 @@ export const createWorkspaceMachine =
149152
},
150153
{
151154
services: {
152-
createWorkspace: ({ organizationId }, { request, owner }) => {
155+
createWorkspace: (
156+
{ organizationId, versionId },
157+
{ request, owner },
158+
) => {
159+
if (versionId) {
160+
request = {
161+
...request,
162+
template_id: undefined,
163+
template_version_id: versionId,
164+
};
165+
}
166+
153167
return createWorkspace(organizationId, owner.id, request);
154168
},
155169
autoCreateWorkspace: async ({
156170
templateName,
171+
versionId,
157172
organizationId,
158173
defaultBuildParameters,
159174
defaultName,
160175
}) => {
161-
const template = await getTemplateByName(
162-
organizationId,
163-
templateName,
164-
);
176+
let templateVersionParameters;
177+
if (versionId) {
178+
templateVersionParameters = { template_version_id: versionId };
179+
} else {
180+
const template = await getTemplateByName(
181+
organizationId,
182+
templateName,
183+
);
184+
templateVersionParameters = { template_id: template.id };
185+
}
165186
return createWorkspace(organizationId, "me", {
166-
template_id: template.id,
187+
...templateVersionParameters,
167188
name: defaultName,
168189
rich_parameter_values: defaultBuildParameters,
169190
});

site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts

+1-6
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ export interface TemplateVersionEditorMachineContext {
2525
tarReader?: TarReader;
2626
publishingError?: unknown;
2727
lastSuccessfulPublishedVersion?: TemplateVersion;
28-
lastSuccessfulPublishIsDefault?: boolean;
2928
missingVariables?: TemplateVersionVariable[];
3029
missingVariableValues?: VariableValue[];
3130
}
@@ -70,7 +69,7 @@ export const templateVersionEditorMachine = createMachine(
7069
data: WorkspaceResource[];
7170
};
7271
publishingVersion: {
73-
data: { isActiveVersion: boolean };
72+
data: void;
7473
};
7574
loadMissingVariables: {
7675
data: TemplateVersionVariable[];
@@ -261,8 +260,6 @@ export const templateVersionEditorMachine = createMachine(
261260
}),
262261
assignLastSuccessfulPublishedVersion: assign({
263262
lastSuccessfulPublishedVersion: (ctx) => ctx.version,
264-
lastSuccessfulPublishIsDefault: (_, event) =>
265-
event.data.isActiveVersion,
266263
version: () => undefined,
267264
}),
268265
addBuildLog: assign({
@@ -433,8 +430,6 @@ export const templateVersionEditorMachine = createMachine(
433430
})
434431
: Promise.resolve(),
435432
]);
436-
437-
return { isActiveVersion };
438433
},
439434
loadMissingVariables: ({ version }) => {
440435
if (!version) {

0 commit comments

Comments
 (0)