From 5bc48df3dced414f7511ecd1f108d289dbe0db75 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Tue, 11 Jul 2023 18:46:09 +0000 Subject: [PATCH 01/12] Add base --- coderd/apidoc/docs.go | 3 +++ coderd/apidoc/swagger.json | 3 +++ coderd/database/queries.sql.go | 5 ++++- coderd/database/queries/templateversions.sql | 3 ++- coderd/templateversions.go | 5 +++++ codersdk/templateversions.go | 3 ++- docs/api/schemas.md | 8 +++++--- docs/api/templates.md | 1 + site/src/api/typesGenerated.ts | 1 + .../PublishTemplateVersionDialog.tsx | 12 ++++++++++++ ...dHelpTooltip.tsx => WorkspaceOutdatedTooltip.tsx} | 7 +++---- site/src/components/Tooltips/index.ts | 2 +- .../src/components/WorkspaceStats/WorkspaceStats.tsx | 4 ++-- .../src/components/WorkspacesTable/WorkspacesRow.tsx | 4 ++-- .../TemplateVersionEditorPage/types.ts | 1 + .../TemplateVersionPage/TemplateVersionPageView.tsx | 6 ++++++ .../templateVersionEditorXService.ts | 4 ++-- 17 files changed, 55 insertions(+), 17 deletions(-) rename site/src/components/Tooltips/{OutdatedHelpTooltip.tsx => WorkspaceOutdatedTooltip.tsx} (91%) diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index 47ea6ba415526..503eabf18662a 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -8219,6 +8219,9 @@ const docTemplate = `{ "codersdk.PatchTemplateVersionRequest": { "type": "object", "properties": { + "message": { + "type": "string" + }, "name": { "type": "string" } diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index e0428e6676d33..47dbc7df85b1d 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -7381,6 +7381,9 @@ "codersdk.PatchTemplateVersionRequest": { "type": "object", "properties": { + "message": { + "type": "string" + }, "name": { "type": "string" } diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 32d85aa9d6516..1946df2a91d6a 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -4688,7 +4688,8 @@ UPDATE SET template_id = $2, updated_at = $3, - name = $4 + name = $4, + message = $5 WHERE id = $1 RETURNING id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, git_auth_providers, message ` @@ -4698,6 +4699,7 @@ type UpdateTemplateVersionByIDParams struct { TemplateID uuid.NullUUID `db:"template_id" json:"template_id"` UpdatedAt time.Time `db:"updated_at" json:"updated_at"` Name string `db:"name" json:"name"` + Message string `db:"message" json:"message"` } func (q *sqlQuerier) UpdateTemplateVersionByID(ctx context.Context, arg UpdateTemplateVersionByIDParams) (TemplateVersion, error) { @@ -4706,6 +4708,7 @@ func (q *sqlQuerier) UpdateTemplateVersionByID(ctx context.Context, arg UpdateTe arg.TemplateID, arg.UpdatedAt, arg.Name, + arg.Message, ) var i TemplateVersion err := row.Scan( diff --git a/coderd/database/queries/templateversions.sql b/coderd/database/queries/templateversions.sql index 2245ef72fec1c..e60fe42604ec6 100644 --- a/coderd/database/queries/templateversions.sql +++ b/coderd/database/queries/templateversions.sql @@ -91,7 +91,8 @@ UPDATE SET template_id = $2, updated_at = $3, - name = $4 + name = $4, + message = $5 WHERE id = $1 RETURNING *; diff --git a/coderd/templateversions.go b/coderd/templateversions.go index 37a7bba98b2be..19f82a001413e 100644 --- a/coderd/templateversions.go +++ b/coderd/templateversions.go @@ -106,12 +106,17 @@ func (api *API) patchTemplateVersion(rw http.ResponseWriter, r *http.Request) { TemplateID: templateVersion.TemplateID, UpdatedAt: database.Now(), Name: templateVersion.Name, + Message: templateVersion.Message, } if params.Name != "" { updateParams.Name = params.Name } + if params.Message != "" { + updateParams.Message = params.Message + } + errTemplateVersionNameConflict := xerrors.New("template version name must be unique for a template") var updatedTemplateVersion database.TemplateVersion diff --git a/codersdk/templateversions.go b/codersdk/templateversions.go index de3719fce53c0..bb9e11fe2eb39 100644 --- a/codersdk/templateversions.go +++ b/codersdk/templateversions.go @@ -87,7 +87,8 @@ type TemplateVersionVariable struct { } type PatchTemplateVersionRequest struct { - Name string `json:"name" validate:"omitempty,template_version_name"` + Name string `json:"name" validate:"omitempty,template_version_name"` + Message string `json:"message" validate:"omitempty"` } // TemplateVersion returns a template version by ID. diff --git a/docs/api/schemas.md b/docs/api/schemas.md index 7cde3c40f934a..fae347f1b770d 100644 --- a/docs/api/schemas.md +++ b/docs/api/schemas.md @@ -3222,15 +3222,17 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in ```json { + "message": "string", "name": "string" } ``` ### Properties -| Name | Type | Required | Restrictions | Description | -| ------ | ------ | -------- | ------------ | ----------- | -| `name` | string | false | | | +| Name | Type | Required | Restrictions | Description | +| --------- | ------ | -------- | ------------ | ----------- | +| `message` | string | false | | | +| `name` | string | false | | | ## codersdk.PatchWorkspaceProxy diff --git a/docs/api/templates.md b/docs/api/templates.md index 4d2cf8d4874b7..032c620900834 100644 --- a/docs/api/templates.md +++ b/docs/api/templates.md @@ -1249,6 +1249,7 @@ curl -X PATCH http://coder-server:8080/api/v2/templateversions/{templateversion} ```json { + "message": "string", "name": "string" } ``` diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 3048dbf2ae643..d85109d16599a 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -644,6 +644,7 @@ export interface PatchGroupRequest { // From codersdk/templateversions.go export interface PatchTemplateVersionRequest { readonly name: string + readonly message: string } // From codersdk/workspaceproxy.go diff --git a/site/src/components/TemplateVersionEditor/PublishTemplateVersionDialog.tsx b/site/src/components/TemplateVersionEditor/PublishTemplateVersionDialog.tsx index c64cc31a1386f..8fcd96bcce157 100644 --- a/site/src/components/TemplateVersionEditor/PublishTemplateVersionDialog.tsx +++ b/site/src/components/TemplateVersionEditor/PublishTemplateVersionDialog.tsx @@ -32,10 +32,12 @@ export const PublishTemplateVersionDialog: FC< const form = useFormik({ initialValues: { name: defaultName, + message: "", isActiveVersion: false, }, validationSchema: Yup.object({ name: Yup.string().required(), + message: Yup.string(), isActiveVersion: Yup.boolean(), }), onSubmit: onConfirm, @@ -70,6 +72,16 @@ export const PublishTemplateVersionDialog: FC< disabled={isPublishing} /> + + > = ({ - onUpdateVersion, - ariaLabel, -}) => { +export const WorkspaceOutdatedTooltip: FC< + React.PropsWithChildren +> = ({ onUpdateVersion, ariaLabel }) => { const styles = useStyles() return ( diff --git a/site/src/components/Tooltips/index.ts b/site/src/components/Tooltips/index.ts index a0f00ee3b8764..a1b1d768038da 100644 --- a/site/src/components/Tooltips/index.ts +++ b/site/src/components/Tooltips/index.ts @@ -1,4 +1,4 @@ export { AuditHelpTooltip } from "./AuditHelpTooltip" -export { OutdatedHelpTooltip } from "./OutdatedHelpTooltip" +export { WorkspaceOutdatedTooltip } from "./WorkspaceOutdatedTooltip" export { UserRoleHelpTooltip } from "./UserRoleHelpTooltip" export { WorkspaceHelpTooltip } from "./WorkspaceHelpTooltip" diff --git a/site/src/components/WorkspaceStats/WorkspaceStats.tsx b/site/src/components/WorkspaceStats/WorkspaceStats.tsx index c7d2f1a941de9..44ce4b83909ff 100644 --- a/site/src/components/WorkspaceStats/WorkspaceStats.tsx +++ b/site/src/components/WorkspaceStats/WorkspaceStats.tsx @@ -1,5 +1,5 @@ import Link from "@mui/material/Link" -import { OutdatedHelpTooltip } from "components/Tooltips" +import { WorkspaceOutdatedTooltip } from "components/Tooltips" import { FC, useRef, useState } from "react" import { Link as RouterLink } from "react-router-dom" import { createDayString } from "utils/createDayString" @@ -101,7 +101,7 @@ export const WorkspaceStats: FC = ({ {workspace.outdated && ( - diff --git a/site/src/components/WorkspacesTable/WorkspacesRow.tsx b/site/src/components/WorkspacesTable/WorkspacesRow.tsx index 7dd637b1afda7..dc17616ef1f85 100644 --- a/site/src/components/WorkspacesTable/WorkspacesRow.tsx +++ b/site/src/components/WorkspacesTable/WorkspacesRow.tsx @@ -9,7 +9,7 @@ import { useNavigate } from "react-router-dom" import { getDisplayWorkspaceTemplateName } from "utils/workspace" import { LastUsed } from "../LastUsed/LastUsed" import { Workspace } from "api/typesGenerated" -import { OutdatedHelpTooltip } from "components/Tooltips/OutdatedHelpTooltip" +import { WorkspaceOutdatedTooltip } from "components/Tooltips/WorkspaceOutdatedTooltip" import { Avatar } from "components/Avatar/Avatar" import { Stack } from "components/Stack/Stack" import { useClickableTableRow } from "hooks/useClickableTableRow" @@ -34,7 +34,7 @@ export const WorkspacesRow: FC<{ {workspace.name} {workspace.outdated && ( - { onUpdateWorkspace(workspace) }} diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/types.ts b/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/types.ts index ca8dc50c48ebe..f3ab9aa537e3e 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/types.ts +++ b/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/types.ts @@ -1,4 +1,5 @@ export type PublishVersionData = { name: string + message: string isActiveVersion: boolean } diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx index ca51318043d17..5a87a120f77ae 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx @@ -6,6 +6,7 @@ import { Margins } from "components/Margins/Margins" import { PageHeader, PageHeaderCaption, + PageHeaderSubtitle, PageHeaderTitle, } from "components/PageHeader/PageHeader" import { Stack } from "components/Stack/Stack" @@ -52,6 +53,11 @@ export const TemplateVersionPageView: FC = ({ > {t("header.caption")} {versionName} + {currentVersion && + currentVersion.message && + currentVersion.message !== "" && ( + {currentVersion.message} + )} {!currentFiles && !error && } diff --git a/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts b/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts index 853b417423f90..1173dbff64b3a 100644 --- a/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts +++ b/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts @@ -387,7 +387,7 @@ export const templateVersionEditorMachine = createMachine( }, publishingVersion: async ( { version, templateId }, - { name, isActiveVersion }, + { name, message, isActiveVersion }, ) => { if (!version) { throw new Error("Version is not set") @@ -398,7 +398,7 @@ export const templateVersionEditorMachine = createMachine( await Promise.all([ // Only do a patch if the name is different name !== version.name - ? API.patchTemplateVersion(version.id, { name }) + ? API.patchTemplateVersion(version.id, { name, message }) : Promise.resolve(), isActiveVersion ? API.updateActiveTemplateVersion(templateId, { From 42643b63f703d211ed7e20e681bc8195d8b50ae5 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Tue, 11 Jul 2023 19:27:01 +0000 Subject: [PATCH 02/12] Add more info to outdated tooltip --- .../Tooltips/WorkspaceOutdatedTooltip.tsx | 79 ++++++++++++++++++- .../WorkspaceStats/WorkspaceStats.tsx | 1 + .../WorkspacesTable/WorkspacesRow.tsx | 1 + 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/site/src/components/Tooltips/WorkspaceOutdatedTooltip.tsx b/site/src/components/Tooltips/WorkspaceOutdatedTooltip.tsx index 23c3bb88a46d4..1b9fc789fb470 100644 --- a/site/src/components/Tooltips/WorkspaceOutdatedTooltip.tsx +++ b/site/src/components/Tooltips/WorkspaceOutdatedTooltip.tsx @@ -10,6 +10,11 @@ import { import InfoIcon from "@mui/icons-material/InfoOutlined" import { makeStyles } from "@mui/styles" import { colors } from "theme/colors" +import { useQuery } from "@tanstack/react-query" +import { getTemplate, getTemplateVersion } from "api/api" +import Box from "@mui/material/Box" +import Skeleton from "@mui/material/Skeleton" +import Link from "@mui/material/Link" export const Language = { outdatedLabel: "Outdated", @@ -20,13 +25,24 @@ export const Language = { interface TooltipProps { onUpdateVersion: () => void + templateId: string ariaLabel?: string } -export const WorkspaceOutdatedTooltip: FC< - React.PropsWithChildren -> = ({ onUpdateVersion, ariaLabel }) => { +export const WorkspaceOutdatedTooltip: FC = ({ + onUpdateVersion, + ariaLabel, + templateId, +}) => { const styles = useStyles() + const { data: activeVersion } = useQuery({ + queryFn: async () => { + const template = await getTemplate(templateId) + const activeVersion = await getTemplateVersion(template.active_version_id) + return activeVersion + }, + queryKey: ["templates", templateId, "activeVersion"], + }) return ( {Language.outdatedLabel} {Language.versionTooltipText} + + + + theme.palette.text.primary, + fontWeight: 600, + }} + > + New version + + + {activeVersion ? ( + theme.palette.primary.light }} + > + {activeVersion.name} + + ) : ( + + )} + + + + + theme.palette.text.primary, + fontWeight: 600, + }} + > + Message + + + {activeVersion ? ( + activeVersion.message === "" ? ( + "No message" + ) : ( + activeVersion.message + ) + ) : ( + + )} + + + + = ({ {workspace.outdated && ( diff --git a/site/src/components/WorkspacesTable/WorkspacesRow.tsx b/site/src/components/WorkspacesTable/WorkspacesRow.tsx index dc17616ef1f85..0dcb7f72f2579 100644 --- a/site/src/components/WorkspacesTable/WorkspacesRow.tsx +++ b/site/src/components/WorkspacesTable/WorkspacesRow.tsx @@ -35,6 +35,7 @@ export const WorkspacesRow: FC<{ {workspace.name} {workspace.outdated && ( { onUpdateWorkspace(workspace) }} From 3936a13f33d71a7f0acd64062d4915672e1adedc Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Wed, 12 Jul 2023 13:20:10 +0000 Subject: [PATCH 03/12] Fix link --- site/src/components/Tooltips/WorkspaceOutdatedTooltip.tsx | 4 +++- site/src/components/WorkspaceStats/WorkspaceStats.tsx | 1 + site/src/components/WorkspacesTable/WorkspacesRow.tsx | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/site/src/components/Tooltips/WorkspaceOutdatedTooltip.tsx b/site/src/components/Tooltips/WorkspaceOutdatedTooltip.tsx index 1b9fc789fb470..a00ab665b5854 100644 --- a/site/src/components/Tooltips/WorkspaceOutdatedTooltip.tsx +++ b/site/src/components/Tooltips/WorkspaceOutdatedTooltip.tsx @@ -26,6 +26,7 @@ export const Language = { interface TooltipProps { onUpdateVersion: () => void templateId: string + templateName: string ariaLabel?: string } @@ -33,6 +34,7 @@ export const WorkspaceOutdatedTooltip: FC = ({ onUpdateVersion, ariaLabel, templateId, + templateName, }) => { const styles = useStyles() const { data: activeVersion } = useQuery({ @@ -75,7 +77,7 @@ export const WorkspaceOutdatedTooltip: FC = ({ {activeVersion ? ( theme.palette.primary.light }} > diff --git a/site/src/components/WorkspaceStats/WorkspaceStats.tsx b/site/src/components/WorkspaceStats/WorkspaceStats.tsx index 6f2724d9ce692..9a474d152f83e 100644 --- a/site/src/components/WorkspaceStats/WorkspaceStats.tsx +++ b/site/src/components/WorkspaceStats/WorkspaceStats.tsx @@ -102,6 +102,7 @@ export const WorkspaceStats: FC = ({ {workspace.outdated && ( { onUpdateWorkspace(workspace) From 3496e4d301958afeccc8536ec7575058bb76423a Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Wed, 12 Jul 2023 13:23:48 +0000 Subject: [PATCH 04/12] Fix test --- .../TemplateVersionEditorPage.test.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx index 39c01932d7d8c..f06c105ab9a24 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx @@ -16,7 +16,7 @@ jest.mock("components/TemplateResourcesTable/TemplateResourcesTable", () => { } }) -test("Use custom name and set it as active when publishing", async () => { +test("Use custom name, message and set it as active when publishing", async () => { const user = userEvent.setup() renderWithAuth(, { extraRoutes: [ @@ -64,6 +64,9 @@ test("Use custom name and set it as active when publishing", async () => { const nameField = within(publishDialog).getByLabelText("Version name") await user.clear(nameField) await user.type(nameField, "v1.0") + const messageField = within(publishDialog).getByLabelText("Message") + await user.clear(messageField) + await user.type(messageField, "Informative message") await user.click( within(publishDialog).getByLabelText("Promote to default version"), ) @@ -73,6 +76,7 @@ test("Use custom name and set it as active when publishing", async () => { await waitFor(() => { expect(patchTemplateVersion).toBeCalledWith("new-version-id", { name: "v1.0", + message: "Informative message", }) }) expect(updateActiveTemplateVersion).toBeCalledWith("test-template", { @@ -134,6 +138,7 @@ test("Do not mark as active if promote is not checked", async () => { await waitFor(() => { expect(patchTemplateVersion).toBeCalledWith("new-version-id", { name: "v1.0", + message: "", }) }) expect(updateActiveTemplateVersion).toBeCalledTimes(0) From e01ac01a8ed812700a5115686050b96ac9a8815e Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Wed, 12 Jul 2023 13:58:44 +0000 Subject: [PATCH 05/12] feat(coderd): allow template version message to be set to empty --- coderd/templateversions.go | 4 +- coderd/templateversions_test.go | 65 +++++++++++++++++++++++++++++++++ codersdk/templateversions.go | 4 +- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/coderd/templateversions.go b/coderd/templateversions.go index 19f82a001413e..f90de5639135a 100644 --- a/coderd/templateversions.go +++ b/coderd/templateversions.go @@ -113,8 +113,8 @@ func (api *API) patchTemplateVersion(rw http.ResponseWriter, r *http.Request) { updateParams.Name = params.Name } - if params.Message != "" { - updateParams.Message = params.Message + if params.Message != nil { + updateParams.Message = *params.Message } errTemplateVersionNameConflict := xerrors.New("template version name must be unique for a template") diff --git a/coderd/templateversions_test.go b/coderd/templateversions_test.go index cef88235a08a4..5826d31b06286 100644 --- a/coderd/templateversions_test.go +++ b/coderd/templateversions_test.go @@ -1223,6 +1223,71 @@ func TestTemplateVersionPatch(t *testing.T) { assert.NotEqual(t, updatedVersion.Name, version.Name) }) + t.Run("Update the message", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, nil) + user := coderdtest.CreateFirstUser(t, client) + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil, func(req *codersdk.CreateTemplateVersionRequest) { + req.Message = "Example message" + }) + coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + wantMessage := "Updated message" + updatedVersion, err := client.UpdateTemplateVersion(ctx, version.ID, codersdk.PatchTemplateVersionRequest{ + Message: &wantMessage, + }) + + require.NoError(t, err) + assert.Equal(t, wantMessage, updatedVersion.Message) + }) + + t.Run("Remove the message", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, nil) + user := coderdtest.CreateFirstUser(t, client) + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil, func(req *codersdk.CreateTemplateVersionRequest) { + req.Message = "Example message" + }) + coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + wantMessage := "" + updatedVersion, err := client.UpdateTemplateVersion(ctx, version.ID, codersdk.PatchTemplateVersionRequest{ + Message: &wantMessage, + }) + + require.NoError(t, err) + assert.Equal(t, wantMessage, updatedVersion.Message) + }) + + t.Run("Keep the message", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, nil) + user := coderdtest.CreateFirstUser(t, client) + wantMessage := "Example message" + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil, func(req *codersdk.CreateTemplateVersionRequest) { + req.Message = wantMessage + }) + coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + + t.Log(version.Message) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + updatedVersion, err := client.UpdateTemplateVersion(ctx, version.ID, codersdk.PatchTemplateVersionRequest{ + Message: nil, + }) + + require.NoError(t, err) + assert.Equal(t, wantMessage, updatedVersion.Message) + }) + t.Run("Use the same name if a new name is not passed", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, nil) diff --git a/codersdk/templateversions.go b/codersdk/templateversions.go index bb9e11fe2eb39..86a62541550ef 100644 --- a/codersdk/templateversions.go +++ b/codersdk/templateversions.go @@ -87,8 +87,8 @@ type TemplateVersionVariable struct { } type PatchTemplateVersionRequest struct { - Name string `json:"name" validate:"omitempty,template_version_name"` - Message string `json:"message" validate:"omitempty"` + Name string `json:"name" validate:"omitempty,template_version_name"` + Message *string `json:"message,omitempty" validate:"omitempty,lt=1048577"` } // TemplateVersion returns a template version by ID. From 273061aca053e37ed0edf1373881ea158e78168b Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Wed, 12 Jul 2023 13:59:12 +0000 Subject: [PATCH 06/12] fix(coderd): fix bug in template creation that resets the message --- coderd/database/dbfake/dbfake.go | 1 + coderd/templates.go | 1 + 2 files changed, 2 insertions(+) diff --git a/coderd/database/dbfake/dbfake.go b/coderd/database/dbfake/dbfake.go index 810f8e0b929d9..3b8015ae110e1 100644 --- a/coderd/database/dbfake/dbfake.go +++ b/coderd/database/dbfake/dbfake.go @@ -4748,6 +4748,7 @@ func (q *fakeQuerier) UpdateTemplateVersionByID(_ context.Context, arg database. templateVersion.TemplateID = arg.TemplateID templateVersion.UpdatedAt = arg.UpdatedAt templateVersion.Name = arg.Name + templateVersion.Message = arg.Message q.templateVersions[index] = templateVersion return templateVersion, nil } diff --git a/coderd/templates.go b/coderd/templates.go index b2cfb4bf3c229..3404a3ee16677 100644 --- a/coderd/templates.go +++ b/coderd/templates.go @@ -336,6 +336,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque }, UpdatedAt: database.Now(), Name: templateVersion.Name, + Message: templateVersion.Message, }) if err != nil { return xerrors.Errorf("insert template version: %s", err) From ebd8e0d4e8d2fa3cb1591053da6212ee0a374982 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Wed, 12 Jul 2023 14:00:06 +0000 Subject: [PATCH 07/12] make gen --- site/src/api/typesGenerated.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index d85109d16599a..20d7751c93e07 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -644,7 +644,7 @@ export interface PatchGroupRequest { // From codersdk/templateversions.go export interface PatchTemplateVersionRequest { readonly name: string - readonly message: string + readonly message?: string } // From codersdk/workspaceproxy.go From 5904c6d1821e9aba0e733757e791ea4f01a2dff5 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Wed, 12 Jul 2023 16:08:15 +0000 Subject: [PATCH 08/12] fix patch in template editor --- .../templateVersionEditor/templateVersionEditorXService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts b/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts index 1173dbff64b3a..76c4074c93e44 100644 --- a/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts +++ b/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts @@ -397,7 +397,7 @@ export const templateVersionEditorMachine = createMachine( } await Promise.all([ // Only do a patch if the name is different - name !== version.name + name !== version.name || message !== version.message ? API.patchTemplateVersion(version.id, { name, message }) : Promise.resolve(), isActiveVersion From 9cdce40c61edc6df8d93b161003cf677aed945eb Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Wed, 12 Jul 2023 16:10:53 +0000 Subject: [PATCH 09/12] fix comment --- .../templateVersionEditor/templateVersionEditorXService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts b/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts index 76c4074c93e44..f5e9d83f2f6fc 100644 --- a/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts +++ b/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts @@ -396,7 +396,7 @@ export const templateVersionEditorMachine = createMachine( throw new Error("Template is not set") } await Promise.all([ - // Only do a patch if the name is different + // Only do a patch if the data has changed. name !== version.name || message !== version.message ? API.patchTemplateVersion(version.id, { name, message }) : Promise.resolve(), From 46ac0d629482ee03b18b2c071d31fbb2b685782a Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Wed, 12 Jul 2023 16:25:07 +0000 Subject: [PATCH 10/12] Fix test --- .../TemplateVersionEditorPage.test.tsx | 17 ++++++++++++----- .../templateVersionEditorXService.ts | 4 ++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx index f06c105ab9a24..8eb6e880b1229 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx @@ -144,7 +144,11 @@ test("Do not mark as active if promote is not checked", async () => { expect(updateActiveTemplateVersion).toBeCalledTimes(0) }) -test("Patch request is not send when the name is not updated", async () => { +test("Patch request is not send when there are no changes", async () => { + const MockTemplateVersionWithEmptyMessage = { + ...MockTemplateVersion, + message: "", + } const user = userEvent.setup() renderWithAuth(, { extraRoutes: [ @@ -160,10 +164,13 @@ test("Patch request is not send when the name is not updated", async () => { jest.spyOn(api, "uploadTemplateFile").mockResolvedValueOnce({ hash: "hash" }) jest .spyOn(api, "createTemplateVersion") - .mockResolvedValueOnce(MockTemplateVersion) + .mockResolvedValueOnce(MockTemplateVersionWithEmptyMessage) jest .spyOn(api, "getTemplateVersion") - .mockResolvedValue({ ...MockTemplateVersion, id: "new-version-id" }) + .mockResolvedValue({ + ...MockTemplateVersionWithEmptyMessage, + id: "new-version-id", + }) jest .spyOn(api, "watchBuildLogsByTemplateVersionId") .mockImplementation((_, options) => { @@ -179,7 +186,7 @@ test("Patch request is not send when the name is not updated", async () => { // Publish const patchTemplateVersion = jest .spyOn(api, "patchTemplateVersion") - .mockResolvedValue(MockTemplateVersion) + .mockResolvedValue(MockTemplateVersionWithEmptyMessage) await within(topbar).findByText("Success") const publishButton = within(topbar).getByRole("button", { name: "Publish version", @@ -188,7 +195,7 @@ test("Patch request is not send when the name is not updated", async () => { const publishDialog = await screen.findByTestId("dialog") // It is using the name from the template version const nameField = within(publishDialog).getByLabelText("Version name") - expect(nameField).toHaveValue(MockTemplateVersion.name) + expect(nameField).toHaveValue(MockTemplateVersionWithEmptyMessage.name) // Publish await user.click( within(publishDialog).getByRole("button", { name: "Publish" }), diff --git a/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts b/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts index f5e9d83f2f6fc..e540ec39317c8 100644 --- a/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts +++ b/site/src/xServices/templateVersionEditor/templateVersionEditorXService.ts @@ -395,9 +395,9 @@ export const templateVersionEditorMachine = createMachine( if (!templateId) { throw new Error("Template is not set") } + const haveChanges = name !== version.name || message !== version.message await Promise.all([ - // Only do a patch if the data has changed. - name !== version.name || message !== version.message + haveChanges ? API.patchTemplateVersion(version.id, { name, message }) : Promise.resolve(), isActiveVersion From 434cf2b462babade197d62f0ad8e009ef292e92c Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Wed, 12 Jul 2023 16:28:11 +0000 Subject: [PATCH 11/12] Fix fmt --- .../TemplateVersionEditorPage.test.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx index 8eb6e880b1229..b969363951fc8 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx @@ -165,12 +165,10 @@ test("Patch request is not send when there are no changes", async () => { jest .spyOn(api, "createTemplateVersion") .mockResolvedValueOnce(MockTemplateVersionWithEmptyMessage) - jest - .spyOn(api, "getTemplateVersion") - .mockResolvedValue({ - ...MockTemplateVersionWithEmptyMessage, - id: "new-version-id", - }) + jest.spyOn(api, "getTemplateVersion").mockResolvedValue({ + ...MockTemplateVersionWithEmptyMessage, + id: "new-version-id", + }) jest .spyOn(api, "watchBuildLogsByTemplateVersionId") .mockImplementation((_, options) => { From 4fff5e2a9460cdbf1c8628bac7fc922499eb1f4d Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Wed, 12 Jul 2023 16:42:26 +0000 Subject: [PATCH 12/12] Fix storybook --- site/.storybook/preview.jsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/site/.storybook/preview.jsx b/site/.storybook/preview.jsx index dce12e9ca603c..72917ee1ed150 100644 --- a/site/.storybook/preview.jsx +++ b/site/.storybook/preview.jsx @@ -6,6 +6,7 @@ import { dark } from "../src/theme" import "../src/theme/globalFonts" import "../src/i18n" import { LocalPreferencesProvider } from "../src/contexts/LocalPreferencesContext" +import { QueryClient, QueryClientProvider } from "@tanstack/react-query" export const decorators = [ (Story) => ( @@ -31,6 +32,13 @@ export const decorators = [ ) }, + (Story) => { + return ( + + + + ) + }, ] export const parameters = {