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

Skip to content

Commit 942ec2f

Browse files
committed
Merge remote-tracking branch 'origin/main' into agent-metadata
2 parents 1300009 + dd4e1f7 commit 942ec2f

File tree

11 files changed

+643
-252
lines changed

11 files changed

+643
-252
lines changed

coderd/templateversions.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ func (api *API) patchTemplateVersion(rw http.ResponseWriter, r *http.Request) {
123123
if errors.Is(err, errTemplateVersionNameConflict) {
124124
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
125125
Message: err.Error(),
126+
Validations: []codersdk.ValidationError{
127+
{Field: "name", Detail: "Name is already used"},
128+
},
126129
})
127130
return
128131
}

site/src/api/api.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,17 @@ export const updateActiveTemplateVersion = async (
373373
return response.data
374374
}
375375

376+
export const patchTemplateVersion = async (
377+
templateVersionId: string,
378+
data: TypesGen.PatchTemplateVersionRequest,
379+
) => {
380+
const response = await axios.patch<TypesGen.TemplateVersion>(
381+
`/api/v2/templateversions/${templateVersionId}`,
382+
data,
383+
)
384+
return response.data
385+
}
386+
376387
export const updateTemplateMeta = async (
377388
templateId: string,
378389
data: TypesGen.UpdateTemplateMeta,
@@ -1032,3 +1043,26 @@ export const watchAgentMetadata = (agentId: string): EventSource => {
10321043
{ withCredentials: true },
10331044
)
10341045
}
1046+
1047+
export const watchBuildLogs = (
1048+
versionId: string,
1049+
onMessage: (log: TypesGen.ProvisionerJobLog) => void,
1050+
) => {
1051+
return new Promise<void>((resolve, reject) => {
1052+
const proto = location.protocol === "https:" ? "wss:" : "ws:"
1053+
const socket = new WebSocket(
1054+
`${proto}//${location.host}/api/v2/templateversions/${versionId}/logs?follow=true`,
1055+
)
1056+
socket.binaryType = "blob"
1057+
socket.addEventListener("message", (event) =>
1058+
onMessage(JSON.parse(event.data) as TypesGen.ProvisionerJobLog),
1059+
)
1060+
socket.addEventListener("error", () => {
1061+
reject(new Error("Connection for logs failed."))
1062+
})
1063+
socket.addEventListener("close", () => {
1064+
// When the socket closes, logs have finished streaming!
1065+
resolve()
1066+
})
1067+
})
1068+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import { DialogProps } from "components/Dialogs/Dialog"
2+
import { FC } from "react"
3+
import { getFormHelpers } from "util/formUtils"
4+
import { FormFields } from "components/Form/Form"
5+
import { useFormik } from "formik"
6+
import * as Yup from "yup"
7+
import { PublishVersionData } from "pages/TemplateVersionPage/TemplateVersionEditorPage/types"
8+
import TextField from "@material-ui/core/TextField"
9+
import { ConfirmDialog } from "components/Dialogs/ConfirmDialog/ConfirmDialog"
10+
import Checkbox from "@material-ui/core/Checkbox"
11+
import FormControlLabel from "@material-ui/core/FormControlLabel"
12+
import { Stack } from "components/Stack/Stack"
13+
14+
export type PublishTemplateVersionDialogProps = DialogProps & {
15+
defaultName: string
16+
isPublishing: boolean
17+
publishingError?: unknown
18+
onClose: () => void
19+
onConfirm: (data: PublishVersionData) => void
20+
}
21+
22+
export const PublishTemplateVersionDialog: FC<
23+
PublishTemplateVersionDialogProps
24+
> = ({
25+
onConfirm,
26+
isPublishing,
27+
onClose,
28+
defaultName,
29+
publishingError,
30+
...dialogProps
31+
}) => {
32+
const form = useFormik({
33+
initialValues: {
34+
name: defaultName,
35+
isActiveVersion: false,
36+
},
37+
validationSchema: Yup.object({
38+
name: Yup.string().required(),
39+
isActiveVersion: Yup.boolean(),
40+
}),
41+
onSubmit: onConfirm,
42+
})
43+
const getFieldHelpers = getFormHelpers(form, publishingError)
44+
const handleClose = () => {
45+
form.resetForm()
46+
onClose()
47+
}
48+
49+
return (
50+
<ConfirmDialog
51+
{...dialogProps}
52+
confirmLoading={isPublishing}
53+
onClose={handleClose}
54+
onConfirm={async () => {
55+
await form.submitForm()
56+
}}
57+
hideCancel={false}
58+
type="success"
59+
cancelText="Cancel"
60+
confirmText="Publish"
61+
title="Publish new version"
62+
description={
63+
<Stack>
64+
<p>You are about to publish a new version of this template.</p>
65+
<FormFields>
66+
<TextField
67+
{...getFieldHelpers("name")}
68+
label="Version name"
69+
autoFocus
70+
disabled={isPublishing}
71+
InputLabelProps={{
72+
shrink: true,
73+
}}
74+
/>
75+
76+
<FormControlLabel
77+
label="Promote to default version"
78+
control={
79+
<Checkbox
80+
size="small"
81+
checked={form.values.isActiveVersion}
82+
onChange={async (e) => {
83+
await form.setFieldValue(
84+
"isActiveVersion",
85+
e.target.checked,
86+
)
87+
}}
88+
name="isActiveVersion"
89+
color="primary"
90+
/>
91+
}
92+
/>
93+
</FormFields>
94+
</Stack>
95+
}
96+
/>
97+
)
98+
}

0 commit comments

Comments
 (0)