Skip to content

Commit 7f67000

Browse files
fix(site): send build parameters over the confirmation dialog on restart (#8660)
1 parent 30fe153 commit 7f67000

File tree

4 files changed

+98
-21
lines changed

4 files changed

+98
-21
lines changed

site/src/components/WorkspaceActions/BuildParametersPopover.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export const BuildParametersPopover = ({
4747
return (
4848
<>
4949
<Button
50+
data-testid="build-parameters-button"
5051
disabled={disabled}
5152
color="neutral"
5253
sx={{ px: 0 }}
@@ -159,7 +160,7 @@ const Form = ({
159160
const getFieldHelpers = getFormHelpers(form)
160161

161162
return (
162-
<form onSubmit={form.handleSubmit}>
163+
<form onSubmit={form.handleSubmit} data-testid="build-parameters-form">
163164
<FormFields>
164165
{ephemeralParameters.map((parameter, index) => {
165166
return (
@@ -182,6 +183,7 @@ const Form = ({
182183
</FormFields>
183184
<Box sx={{ py: 3, pb: 1 }}>
184185
<Button
186+
data-testid="build-parameters-submit"
185187
type="submit"
186188
variant="contained"
187189
color="primary"

site/src/pages/WorkspacePage/WorkspacePage.test.tsx

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,4 +411,80 @@ describe("WorkspacePage", () => {
411411
await renderWorkspacePage()
412412
await screen.findByTestId("error-unsupported-workspaces")
413413
})
414+
415+
it("restart the workspace with one time parameters when having the confirmation dialog", async () => {
416+
window.localStorage.removeItem(`${MockUser.id}_ignoredWarnings`)
417+
jest.spyOn(api, "getWorkspaceParameters").mockResolvedValue({
418+
templateVersionRichParameters: [
419+
{
420+
...MockTemplateVersionParameter1,
421+
ephemeral: true,
422+
name: "rebuild",
423+
description: "Rebuild",
424+
required: false,
425+
},
426+
],
427+
buildParameters: [{ name: "rebuild", value: "false" }],
428+
})
429+
const restartWorkspaceSpy = jest.spyOn(api, "restartWorkspace")
430+
const user = userEvent.setup()
431+
await renderWorkspacePage()
432+
await user.click(screen.getByTestId("build-parameters-button"))
433+
const buildParametersForm = await screen.findByTestId(
434+
"build-parameters-form",
435+
)
436+
const rebuildField = within(buildParametersForm).getByLabelText("Rebuild", {
437+
exact: false,
438+
})
439+
await user.clear(rebuildField)
440+
await user.type(rebuildField, "true")
441+
await user.click(screen.getByTestId("build-parameters-submit"))
442+
await user.click(screen.getByTestId("confirm-button"))
443+
await waitFor(() => {
444+
expect(restartWorkspaceSpy).toBeCalledWith({
445+
workspace: MockWorkspace,
446+
buildParameters: [{ name: "rebuild", value: "true" }],
447+
})
448+
})
449+
})
450+
451+
it("restart the workspace with one time parameters without the confirmation dialog", async () => {
452+
window.localStorage.setItem(
453+
`${MockUser.id}_ignoredWarnings`,
454+
JSON.stringify({
455+
restart: new Date().toISOString(),
456+
}),
457+
)
458+
jest.spyOn(api, "getWorkspaceParameters").mockResolvedValue({
459+
templateVersionRichParameters: [
460+
{
461+
...MockTemplateVersionParameter1,
462+
ephemeral: true,
463+
name: "rebuild",
464+
description: "Rebuild",
465+
required: false,
466+
},
467+
],
468+
buildParameters: [{ name: "rebuild", value: "false" }],
469+
})
470+
const restartWorkspaceSpy = jest.spyOn(api, "restartWorkspace")
471+
const user = userEvent.setup()
472+
await renderWorkspacePage()
473+
await user.click(screen.getByTestId("build-parameters-button"))
474+
const buildParametersForm = await screen.findByTestId(
475+
"build-parameters-form",
476+
)
477+
const rebuildField = within(buildParametersForm).getByLabelText("Rebuild", {
478+
exact: false,
479+
})
480+
await user.clear(rebuildField)
481+
await user.type(rebuildField, "true")
482+
await user.click(screen.getByTestId("build-parameters-submit"))
483+
await waitFor(() => {
484+
expect(restartWorkspaceSpy).toBeCalledWith({
485+
workspace: MockWorkspace,
486+
buildParameters: [{ name: "rebuild", value: "true" }],
487+
})
488+
})
489+
})
414490
})

site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@ import {
2727
} from "../../xServices/workspace/workspaceXService"
2828
import { UpdateBuildParametersDialog } from "./UpdateBuildParametersDialog"
2929
import { ChangeVersionDialog } from "./ChangeVersionDialog"
30-
import { useQuery } from "@tanstack/react-query"
31-
import { getTemplateVersions } from "api/api"
32-
import { useRestartWorkspace } from "./hooks"
30+
import { useMutation, useQuery } from "@tanstack/react-query"
31+
import { getTemplateVersions, restartWorkspace } from "api/api"
3332
import {
3433
ConfirmDialog,
3534
ConfirmDialogProps,
@@ -89,7 +88,10 @@ export const WorkspaceReadyPage = ({
8988
enabled: changeVersionDialogOpen,
9089
})
9190
const [isConfirmingUpdate, setIsConfirmingUpdate] = useState(false)
92-
const [isConfirmingRestart, setIsConfirmingRestart] = useState(false)
91+
const [confirmingRestart, setConfirmingRestart] = useState<{
92+
open: boolean
93+
buildParameters?: TypesGen.WorkspaceBuildParameter[]
94+
}>({ open: false })
9395
const user = useMe()
9496
const { isWarningIgnored, ignoreWarning } = useIgnoreWarnings(user.id)
9597
const buildLogs = useBuildLogs(workspace)
@@ -99,10 +101,12 @@ export const WorkspaceReadyPage = ({
99101
workspace.latest_build.status,
100102
)
101103
const {
102-
mutate: restartWorkspace,
104+
mutate: mutateRestartWorkspace,
103105
error: restartBuildError,
104106
isLoading: isRestarting,
105-
} = useRestartWorkspace()
107+
} = useMutation({
108+
mutationFn: restartWorkspace,
109+
})
106110
// keep banner machine in sync with workspace
107111
useEffect(() => {
108112
bannerSend({ type: "REFRESH_WORKSPACE", workspace })
@@ -154,9 +158,9 @@ export const WorkspaceReadyPage = ({
154158
handleDelete={() => workspaceSend({ type: "ASK_DELETE" })}
155159
handleRestart={(buildParameters) => {
156160
if (isWarningIgnored("restart")) {
157-
restartWorkspace({ workspace, buildParameters })
161+
mutateRestartWorkspace({ workspace, buildParameters })
158162
} else {
159-
setIsConfirmingRestart(true)
163+
setConfirmingRestart({ open: true, buildParameters })
160164
}
161165
}}
162166
handleUpdate={() => {
@@ -253,15 +257,18 @@ export const WorkspaceReadyPage = ({
253257
/>
254258

255259
<WarningDialog
256-
open={isConfirmingRestart}
260+
open={confirmingRestart.open}
257261
onConfirm={(shouldIgnore) => {
258262
if (shouldIgnore) {
259263
ignoreWarning("restart")
260264
}
261-
restartWorkspace({ workspace })
262-
setIsConfirmingRestart(false)
265+
mutateRestartWorkspace({
266+
workspace,
267+
buildParameters: confirmingRestart.buildParameters,
268+
})
269+
setConfirmingRestart({ open: false })
263270
}}
264-
onClose={() => setIsConfirmingRestart(false)}
271+
onClose={() => setConfirmingRestart({ open: false })}
265272
title="Confirm restart"
266273
confirmText="Restart"
267274
description="Are you sure you want to restart your workspace? Updating your workspace will stop all running processes and delete non-persistent data."

site/src/pages/WorkspacePage/hooks.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)
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