Skip to content

Commit 2f3cce0

Browse files
committed
Refactor delete workspace
1 parent 22759e3 commit 2f3cce0

File tree

8 files changed

+42
-72
lines changed

8 files changed

+42
-72
lines changed

site/src/pages/WorkspacePage/WorkspaceDeleteDialog/WorkspaceDeleteDialog.stories.tsx renamed to site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
import type { Meta, StoryObj } from "@storybook/react";
22
import { MockFailedWorkspace, MockWorkspace } from "testHelpers/entities";
33
import { WorkspaceDeleteDialog } from "./WorkspaceDeleteDialog";
4+
import { daysAgo } from "utils/time";
45

56
const meta: Meta<typeof WorkspaceDeleteDialog> = {
6-
title: "pages/WorkspacePage/WorkspaceDeleteDialog",
7+
title: "modules/workspaces/WorkspaceDeleteDialog",
78
component: WorkspaceDeleteDialog,
89
args: {
9-
workspace: MockWorkspace,
10-
canUpdateTemplate: false,
10+
workspace: {
11+
...MockWorkspace,
12+
latest_build: {
13+
...MockWorkspace.latest_build,
14+
created_at: daysAgo(2),
15+
},
16+
},
17+
canDeleteFailedWorkspace: false,
1118
isOpen: true,
12-
onCancel: () => {},
13-
onConfirm: () => {},
14-
workspaceBuildDateStr: "2 days ago",
1519
},
1620
};
1721

@@ -30,14 +34,14 @@ export const Unhealthy: Story = {
3034
// Should look the same as `Example`
3135
export const AdminView: Story = {
3236
args: {
33-
canUpdateTemplate: true,
37+
canDeleteFailedWorkspace: true,
3438
},
3539
};
3640

3741
// Should show the `--orphan` option
3842
export const UnhealthyAdminView: Story = {
3943
args: {
4044
workspace: MockFailedWorkspace,
41-
canUpdateTemplate: true,
45+
canDeleteFailedWorkspace: true,
4246
},
4347
};

site/src/pages/WorkspacePage/WorkspaceDeleteDialog/WorkspaceDeleteDialog.tsx renamed to site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {
77
Workspace,
88
} from "api/typesGenerated";
99
import { ConfirmDialog } from "components/Dialogs/ConfirmDialog/ConfirmDialog";
10+
import dayjs from "dayjs";
1011
import { type FC, type FormEvent, useId, useState } from "react";
1112
import { docs } from "utils/docs";
1213

@@ -16,7 +17,6 @@ interface WorkspaceDeleteDialogProps {
1617
isOpen: boolean;
1718
onCancel: () => void;
1819
onConfirm: (arg: CreateWorkspaceBuildRequest["orphan"]) => void;
19-
workspaceBuildDateStr: string;
2020
}
2121

2222
export const WorkspaceDeleteDialog: FC<WorkspaceDeleteDialogProps> = ({
@@ -25,7 +25,6 @@ export const WorkspaceDeleteDialog: FC<WorkspaceDeleteDialogProps> = ({
2525
isOpen,
2626
onCancel,
2727
onConfirm,
28-
workspaceBuildDateStr,
2928
}) => {
3029
const hookId = useId();
3130
const [userConfirmationText, setUserConfirmationText] = useState("");
@@ -62,7 +61,7 @@ export const WorkspaceDeleteDialog: FC<WorkspaceDeleteDialogProps> = ({
6261
<p className="label">workspace</p>
6362
</div>
6463
<div css={{ textAlign: "right" }}>
65-
<p className="info">{workspaceBuildDateStr}</p>
64+
<p className="info">{dayjs(workspace.created_at).fromNow()}</p>
6665
<p className="label">created</p>
6766
</div>
6867
</div>

site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { MissingBuildParameters } from "api/api";
2-
import { changeVersion } from "api/queries/workspaces";
2+
import { changeVersion, deleteWorkspace } from "api/queries/workspaces";
33
import type { Workspace } from "api/typesGenerated";
44
import { Button } from "components/Button/Button";
55
import {
@@ -23,16 +23,15 @@ import { useState, type FC } from "react";
2323
import { useMutation, useQueryClient } from "react-query";
2424
import { Link as RouterLink } from "react-router-dom";
2525
import { ChangeWorkspaceVersionDialog } from "./ChangeWorkspaceVersionDialog";
26+
import { WorkspaceDeleteDialog } from "./WorkspaceDeleteDialog";
27+
import type { WorkspacePermissions } from "../permissions";
2628

2729
type WorkspaceMoreActionsProps = {
2830
workspace: Workspace;
2931
isDuplicationReady: boolean;
32+
permissions: WorkspacePermissions;
3033
disabled?: boolean;
31-
permissions?: {
32-
changeWorkspaceVersion?: boolean;
33-
};
3434
onDuplicate: () => void;
35-
onDelete: () => void;
3635
};
3736

3837
export const WorkspaceMoreActions: FC<WorkspaceMoreActionsProps> = ({
@@ -41,7 +40,6 @@ export const WorkspaceMoreActions: FC<WorkspaceMoreActionsProps> = ({
4140
permissions,
4241
isDuplicationReady,
4342
onDuplicate,
44-
onDelete,
4543
}) => {
4644
const queryClient = useQueryClient();
4745

@@ -54,6 +52,12 @@ export const WorkspaceMoreActions: FC<WorkspaceMoreActionsProps> = ({
5452
changeVersion(workspace, queryClient),
5553
);
5654

55+
// Delete
56+
const [isConfirmingDelete, setIsConfirmingDelete] = useState(false);
57+
const deleteWorkspaceMutation = useMutation(
58+
deleteWorkspace(workspace, queryClient),
59+
);
60+
5761
return (
5862
<>
5963
<DropdownMenu>
@@ -78,7 +82,7 @@ export const WorkspaceMoreActions: FC<WorkspaceMoreActionsProps> = ({
7882
</RouterLink>
7983
</DropdownMenuItem>
8084

81-
{permissions?.changeWorkspaceVersion && (
85+
{permissions.updateWorkspaceVersion && (
8286
<DropdownMenuItem
8387
onClick={() => {
8488
setChangeVersionDialogOpen(true);
@@ -106,7 +110,9 @@ export const WorkspaceMoreActions: FC<WorkspaceMoreActionsProps> = ({
106110

107111
<DropdownMenuItem
108112
className="text-content-destructive focus:text-content-destructive"
109-
onClick={onDelete}
113+
onClick={() => {
114+
setIsConfirmingDelete(true);
115+
}}
110116
data-testid="delete-button"
111117
>
112118
<TrashIcon />
@@ -152,6 +158,19 @@ export const WorkspaceMoreActions: FC<WorkspaceMoreActionsProps> = ({
152158
changeVersionMutation.mutate({ versionId: version.id });
153159
}}
154160
/>
161+
162+
<WorkspaceDeleteDialog
163+
workspace={workspace}
164+
canDeleteFailedWorkspace={permissions.deleteFailedWorkspace}
165+
isOpen={isConfirmingDelete}
166+
onCancel={() => {
167+
setIsConfirmingDelete(false);
168+
}}
169+
onConfirm={(orphan) => {
170+
deleteWorkspaceMutation.mutate({ orphan });
171+
setIsConfirmingDelete(false);
172+
}}
173+
/>
155174
</>
156175
);
157176
};

site/src/pages/WorkspacePage/Workspace.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ export interface WorkspaceProps {
3131
handleStart: (buildParameters?: TypesGen.WorkspaceBuildParameter[]) => void;
3232
handleStop: () => void;
3333
handleRestart: (buildParameters?: TypesGen.WorkspaceBuildParameter[]) => void;
34-
handleDelete: () => void;
3534
handleUpdate: () => void;
3635
handleCancel: () => void;
3736
handleSettings: () => void;
@@ -61,7 +60,6 @@ export const Workspace: FC<WorkspaceProps> = ({
6160
handleStart,
6261
handleStop,
6362
handleRestart,
64-
handleDelete,
6563
handleUpdate,
6664
handleCancel,
6765
handleSettings,
@@ -141,7 +139,6 @@ export const Workspace: FC<WorkspaceProps> = ({
141139
handleStart={handleStart}
142140
handleStop={handleStop}
143141
handleRestart={handleRestart}
144-
handleDelete={handleDelete}
145142
handleUpdate={handleUpdate}
146143
handleCancel={handleCancel}
147144
handleSettings={handleSettings}

site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import DownloadOutlined from "@mui/icons-material/DownloadOutlined";
22
import DuplicateIcon from "@mui/icons-material/FileCopyOutlined";
3-
import HistoryIcon from "@mui/icons-material/HistoryOutlined";
43
import SettingsIcon from "@mui/icons-material/SettingsOutlined";
54
import type { Workspace, WorkspaceBuildParameter } from "api/typesGenerated";
65
import { Button } from "components/Button/Button";
@@ -12,7 +11,6 @@ import {
1211
DropdownMenuTrigger,
1312
} from "components/DropdownMenu/DropdownMenu";
1413
import { useAuthenticated } from "hooks/useAuthenticated";
15-
import { TrashIcon } from "lucide-react";
1614
import { EllipsisVertical } from "lucide-react";
1715
import {
1816
type ActionType,
@@ -34,7 +32,6 @@ import {
3432
UpdateButton,
3533
} from "./Buttons";
3634
import { DebugButton } from "./DebugButton";
37-
import { DownloadLogsDialog } from "./DownloadLogsDialog";
3835
import { RetryButton } from "./RetryButton";
3936

4037
export interface WorkspaceActionsProps {
@@ -43,7 +40,6 @@ export interface WorkspaceActionsProps {
4340
handleStart: (buildParameters?: WorkspaceBuildParameter[]) => void;
4441
handleStop: () => void;
4542
handleRestart: (buildParameters?: WorkspaceBuildParameter[]) => void;
46-
handleDelete: () => void;
4743
handleUpdate: () => void;
4844
handleCancel: () => void;
4945
handleSettings: () => void;
@@ -63,7 +59,6 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
6359
handleStart,
6460
handleStop,
6561
handleRestart,
66-
handleDelete,
6762
handleUpdate,
6863
handleCancel,
6964
handleSettings,
@@ -78,8 +73,6 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
7873
const { duplicateWorkspace, isDuplicationReady } =
7974
useWorkspaceDuplication(workspace);
8075

81-
const [isDownloadDialogOpen, setIsDownloadDialogOpen] = useState(false);
82-
8376
const { user } = useAuthenticated();
8477
const isOwner =
8578
user.roles.find((role) => role.name === "owner") !== undefined;
@@ -205,30 +198,8 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
205198
<DuplicateIcon />
206199
Duplicate&hellip;
207200
</DropdownMenuItem>
208-
209-
<DropdownMenuItem onClick={() => setIsDownloadDialogOpen(true)}>
210-
<DownloadOutlined />
211-
Download logs&hellip;
212-
</DropdownMenuItem>
213-
214-
<DropdownMenuSeparator />
215-
216-
<DropdownMenuItem
217-
className="text-content-destructive focus:text-content-destructive"
218-
onClick={handleDelete}
219-
data-testid="delete-button"
220-
>
221-
<TrashIcon />
222-
Delete&hellip;
223-
</DropdownMenuItem>
224201
</DropdownMenuContent>
225202
</DropdownMenu>
226-
227-
<DownloadLogsDialog
228-
workspace={workspace}
229-
open={isDownloadDialogOpen}
230-
onClose={() => setIsDownloadDialogOpen(false)}
231-
/>
232203
</div>
233204
);
234205
};

site/src/pages/WorkspacePage/WorkspaceDeleteDialog/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ export const WorkspaceReadyPage: FC<WorkspaceReadyPageProps> = ({
109109
latestVersion,
110110
});
111111

112+
// Delete workspace
112113
const [isConfirmingDelete, setIsConfirmingDelete] = useState(false);
113114
const deleteWorkspaceMutation = useMutation(
114115
deleteWorkspace(workspace, queryClient),
@@ -223,9 +224,6 @@ export const WorkspaceReadyPage: FC<WorkspaceReadyPageProps> = ({
223224
handleStop={() => {
224225
stopWorkspaceMutation.mutate({});
225226
}}
226-
handleDelete={() => {
227-
setIsConfirmingDelete(true);
228-
}}
229227
handleRestart={(buildParameters) => {
230228
setConfirmingRestart({ open: true, buildParameters });
231229
}}
@@ -258,20 +256,6 @@ export const WorkspaceReadyPage: FC<WorkspaceReadyPageProps> = ({
258256
timings={timingsQuery.data}
259257
/>
260258

261-
<WorkspaceDeleteDialog
262-
workspace={workspace}
263-
canDeleteFailedWorkspace={permissions.deleteFailedWorkspace}
264-
isOpen={isConfirmingDelete}
265-
onCancel={() => {
266-
setIsConfirmingDelete(false);
267-
}}
268-
onConfirm={(orphan) => {
269-
deleteWorkspaceMutation.mutate({ orphan });
270-
setIsConfirmingDelete(false);
271-
}}
272-
workspaceBuildDateStr={dayjs(workspace.created_at).fromNow()}
273-
/>
274-
275259
<WarningDialog
276260
open={confirmingRestart.open}
277261
onConfirm={() => {

site/src/pages/WorkspacePage/WorkspaceTopbar.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ export interface WorkspaceProps {
4141
handleStart: (buildParameters?: TypesGen.WorkspaceBuildParameter[]) => void;
4242
handleStop: () => void;
4343
handleRestart: (buildParameters?: TypesGen.WorkspaceBuildParameter[]) => void;
44-
handleDelete: () => void;
4544
handleUpdate: () => void;
4645
handleCancel: () => void;
4746
handleSettings: () => void;
@@ -63,7 +62,6 @@ export const WorkspaceTopbar: FC<WorkspaceProps> = ({
6362
handleStart,
6463
handleStop,
6564
handleRestart,
66-
handleDelete,
6765
handleUpdate,
6866
handleCancel,
6967
handleSettings,
@@ -243,7 +241,6 @@ export const WorkspaceTopbar: FC<WorkspaceProps> = ({
243241
handleStart={handleStart}
244242
handleStop={handleStop}
245243
handleRestart={handleRestart}
246-
handleDelete={handleDelete}
247244
handleUpdate={handleUpdate}
248245
handleCancel={handleCancel}
249246
handleSettings={handleSettings}

0 commit comments

Comments
 (0)