From 45580666acf7e6cf03c3acb792552878a5f12673 Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Wed, 14 Dec 2022 15:28:28 +0000 Subject: [PATCH 1/5] Fetch default ttl - wip --- .../components/WorkspaceScheduleForm/WorkspaceScheduleForm.tsx | 3 ++- site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx | 2 ++ site/src/pages/WorkspaceSchedulePage/ttl.ts | 2 -- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/site/src/components/WorkspaceScheduleForm/WorkspaceScheduleForm.tsx b/site/src/components/WorkspaceScheduleForm/WorkspaceScheduleForm.tsx index 3a65036188ec6..74b9c4fb5b1e4 100644 --- a/site/src/components/WorkspaceScheduleForm/WorkspaceScheduleForm.tsx +++ b/site/src/components/WorkspaceScheduleForm/WorkspaceScheduleForm.tsx @@ -21,7 +21,6 @@ import { defaultSchedule, emptySchedule, } from "pages/WorkspaceSchedulePage/schedule" -import { defaultTTL } from "pages/WorkspaceSchedulePage/ttl" import { ChangeEvent, FC } from "react" import * as Yup from "yup" import { getFormHelpers } from "../../util/formUtils" @@ -81,6 +80,7 @@ export interface WorkspaceScheduleFormProps { onSubmit: (values: WorkspaceScheduleFormValues) => void // for storybook initialTouched?: FormikTouched + defaultTTL: number } export interface WorkspaceScheduleFormValues { @@ -192,6 +192,7 @@ export const WorkspaceScheduleForm: FC< onCancel, onSubmit, initialTouched, + defaultTTL }) => { const styles = useStyles() diff --git a/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx b/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx index ad48166dea9c7..a33616535e183 100644 --- a/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx +++ b/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx @@ -35,6 +35,7 @@ export const WorkspaceSchedulePage: React.FC = () => { getWorkspaceError, permissions, workspace, + template } = scheduleState.context // Get workspace on mount and whenever the args for getting a workspace change. @@ -103,6 +104,7 @@ export const WorkspaceSchedulePage: React.FC = () => { submitScheduleError={submitScheduleError} initialValues={{ ...autoStart, ...autoStop }} isLoading={scheduleState.tags.has("loading")} + defaultTTL={template.default_ttl_ms} onCancel={() => { navigate(`/@${username}/${workspaceName}`) }} diff --git a/site/src/pages/WorkspaceSchedulePage/ttl.ts b/site/src/pages/WorkspaceSchedulePage/ttl.ts index 6acf783e80cb6..743c1a0c1838c 100644 --- a/site/src/pages/WorkspaceSchedulePage/ttl.ts +++ b/site/src/pages/WorkspaceSchedulePage/ttl.ts @@ -5,8 +5,6 @@ export interface AutoStop { export const emptyTTL = 0 -export const defaultTTL = 12 - const msToHours = (ms: number) => Math.round(ms / (1000 * 60 * 60)) export const ttlMsToAutoStop = (ttl_ms?: number): AutoStop => From 01780a42bf2ac3c6d4bcca1e202f03c2e5ceedd5 Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Wed, 21 Dec 2022 16:15:26 +0000 Subject: [PATCH 2/5] Convert ms to hours --- .../pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx b/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx index 8b37a5241403f..c019264d429ef 100644 --- a/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx +++ b/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx @@ -3,6 +3,7 @@ import { useMachine } from "@xstate/react" import { AlertBanner } from "components/AlertBanner/AlertBanner" import { ConfirmDialog } from "components/Dialogs/ConfirmDialog/ConfirmDialog" import { Margins } from "components/Margins/Margins" +import dayjs from "dayjs" import { scheduleToAutoStart } from "pages/WorkspaceSchedulePage/schedule" import { ttlMsToAutoStop } from "pages/WorkspaceSchedulePage/ttl" import React, { useEffect } from "react" @@ -61,7 +62,7 @@ export const WorkspaceSchedulePage: React.FC = () => { return } - if (scheduleState.hasTag("loading")) { + if (scheduleState.hasTag("loading") || !template) { return } @@ -105,7 +106,7 @@ export const WorkspaceSchedulePage: React.FC = () => { ...getAutoStop(workspace), }} isLoading={scheduleState.tags.has("loading")} - defaultTTL={template.default_ttl_ms} + defaultTTL={dayjs.duration(template.default_ttl_ms, "ms").asHours()} onCancel={() => { navigate(`/@${username}/${workspaceName}`) }} From 8a2e8fb1f8e5af22241c267f9374de194ce568d8 Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Wed, 21 Dec 2022 16:15:47 +0000 Subject: [PATCH 3/5] Format --- .../components/WorkspaceScheduleForm/WorkspaceScheduleForm.tsx | 2 +- site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/site/src/components/WorkspaceScheduleForm/WorkspaceScheduleForm.tsx b/site/src/components/WorkspaceScheduleForm/WorkspaceScheduleForm.tsx index 74b9c4fb5b1e4..56884e54cda94 100644 --- a/site/src/components/WorkspaceScheduleForm/WorkspaceScheduleForm.tsx +++ b/site/src/components/WorkspaceScheduleForm/WorkspaceScheduleForm.tsx @@ -192,7 +192,7 @@ export const WorkspaceScheduleForm: FC< onCancel, onSubmit, initialTouched, - defaultTTL + defaultTTL, }) => { const styles = useStyles() diff --git a/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx b/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx index c019264d429ef..744c18a38706e 100644 --- a/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx +++ b/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx @@ -47,7 +47,7 @@ export const WorkspaceSchedulePage: React.FC = () => { getTemplateError, permissions, workspace, - template + template, } = scheduleState.context // Get workspace on mount and whenever the args for getting a workspace change. From 2f92099ed4a23f69bfcf24aaf4ae3b119eaa7199 Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Wed, 21 Dec 2022 18:56:58 +0000 Subject: [PATCH 4/5] Fix story --- .../WorkspaceScheduleForm/WorkspaceScheduleForm.stories.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/src/components/WorkspaceScheduleForm/WorkspaceScheduleForm.stories.tsx b/site/src/components/WorkspaceScheduleForm/WorkspaceScheduleForm.stories.tsx index 82149d09ed5a6..801960defb963 100644 --- a/site/src/components/WorkspaceScheduleForm/WorkspaceScheduleForm.stories.tsx +++ b/site/src/components/WorkspaceScheduleForm/WorkspaceScheduleForm.stories.tsx @@ -7,7 +7,7 @@ import { defaultSchedule, emptySchedule, } from "pages/WorkspaceSchedulePage/schedule" -import { defaultTTL, emptyTTL } from "pages/WorkspaceSchedulePage/ttl" +import { emptyTTL } from "pages/WorkspaceSchedulePage/ttl" import { makeMockApiError } from "testHelpers/entities" import { WorkspaceScheduleForm, @@ -39,7 +39,7 @@ const defaultInitialValues = { autoStartEnabled: true, ...defaultSchedule(), autoStopEnabled: true, - ttl: defaultTTL, + ttl: 24, } export const AllDisabled = Template.bind({}) From 154dd2e298055c4ba114efe06db847a9f194de4e Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Thu, 22 Dec 2022 17:32:07 +0000 Subject: [PATCH 5/5] Add test --- .../WorkspaceSchedulePage.test.tsx | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.test.tsx b/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.test.tsx index a228d399849e0..f8fc349c25875 100644 --- a/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.test.tsx +++ b/site/src/pages/WorkspaceSchedulePage/WorkspaceSchedulePage.test.tsx @@ -21,6 +21,8 @@ import { } from "components/WorkspaceScheduleForm/WorkspaceScheduleForm" import { WorkspaceSchedulePage } from "./WorkspaceSchedulePage" import i18next from "i18next" +import { server } from "testHelpers/server" +import { rest } from "msw" const { t } = i18next @@ -295,4 +297,37 @@ describe("WorkspaceSchedulePage", () => { expect(dialog).not.toBeInTheDocument() }) }) + + describe("autostop", () => { + it("uses template default ttl when first enabled", async () => { + // have auto-stop disabled + server.use( + rest.get( + "/api/v2/users/:userId/workspace/:workspaceName", + (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ ...MockWorkspace, ttl_ms: 0 }), + ) + }, + ), + ) + renderWithAuth(, { + route: `/@${MockUser.username}/${MockWorkspace.name}/schedule`, + path: "/@:username/:workspace/schedule", + }) + const user = userEvent.setup() + const autoStopToggle = await screen.findByLabelText( + FormLanguage.stopSwitch, + ) + // enable auto-stop + await user.click(autoStopToggle) + // find helper text that describes the mock template's 24 hour default + const autoStopHelperText = await screen.findByText( + "Your workspace will shut down a day after", + { exact: false }, + ) + expect(autoStopHelperText).toBeDefined() + }) + }) })