From 9371d709a53924d4f208a706ddc34c091ad37aad Mon Sep 17 00:00:00 2001 From: Pierre Hubert Date: Thu, 26 Oct 2023 12:04:55 +0200 Subject: [PATCH] Can remove disks files from UI --- virtweb_frontend/src/api/VMApi.ts | 7 ++ .../src/widgets/forms/VMDisksList.tsx | 107 ++++++++++++++---- 2 files changed, 94 insertions(+), 20 deletions(-) diff --git a/virtweb_frontend/src/api/VMApi.ts b/virtweb_frontend/src/api/VMApi.ts index 897a9b9..c655a2b 100644 --- a/virtweb_frontend/src/api/VMApi.ts +++ b/virtweb_frontend/src/api/VMApi.ts @@ -27,6 +27,7 @@ export interface VMDisk { // application attribute new?: boolean; + deleteType?: "keepfile" | "deletefile"; } interface VMInfoInterface { @@ -137,6 +138,12 @@ export class VMApi { * Update the information about a single VM */ static async UpdateSingle(vm: VMInfo): Promise { + // Process disks list, looking for removal + vm.disks = vm.disks.filter((d) => d.deleteType !== "keepfile"); + vm.disks.forEach((d) => { + if (d.deleteType === "deletefile") d.delete = true; + }); + const data = ( await APIClient.exec({ uri: `/vm/${vm.uuid!}`, diff --git a/virtweb_frontend/src/widgets/forms/VMDisksList.tsx b/virtweb_frontend/src/widgets/forms/VMDisksList.tsx index 1fcbb8a..3e760d1 100644 --- a/virtweb_frontend/src/widgets/forms/VMDisksList.tsx +++ b/virtweb_frontend/src/widgets/forms/VMDisksList.tsx @@ -1,18 +1,23 @@ +import { mdiHarddisk } from "@mdi/js"; +import Icon from "@mdi/react"; +import CheckCircleIcon from "@mui/icons-material/CheckCircle"; +import DeleteIcon from "@mui/icons-material/Delete"; import { Avatar, Button, + IconButton, ListItem, ListItemAvatar, ListItemText, Paper, + Tooltip, } from "@mui/material"; -import { VMDisk, VMInfo } from "../../api/VMApi"; import { filesize } from "filesize"; -import Icon from "@mdi/react"; -import { mdiHarddisk } from "@mdi/js"; -import { TextInput } from "./TextInput"; import { ServerApi } from "../../api/ServerApi"; +import { VMDisk, VMInfo } from "../../api/VMApi"; +import { useConfirm } from "../../hooks/providers/ConfirmDialogProvider"; import { SelectInput } from "./SelectInput"; +import { TextInput } from "./TextInput"; export function VMDisksList(p: { vm: VMInfo; @@ -39,6 +44,10 @@ export function VMDisksList(p: { editable={p.editable} disk={d} onChange={p.onChange} + removeFromList={() => { + p.vm.disks.splice(num, 1); + p.onChange?.(); + }} /> ))} @@ -51,22 +60,74 @@ function DiskInfo(p: { editable: boolean; disk: VMDisk; onChange?: () => void; + removeFromList: () => void; }): React.ReactElement { + const confirm = useConfirm(); + const deleteDisk = async () => { + if (p.disk.deleteType) { + p.disk.deleteType = undefined; + p.onChange?.(); + return; + } + + const keepFile = await confirm( + `You asked to delete the disk ${p.disk.name}. Do you want to keep the block file or not ? `, + "Delete disk", + "Keep the file", + "Delete the file" + ); + + if (!(await confirm("Do you really want to delete this disk?"))) return; + + p.disk.deleteType = keepFile ? "keepfile" : "deletefile"; + p.onChange?.(); + }; + if (!p.editable || !p.disk.new) return ( - + + {p.disk.deleteType ? ( + + + + ) : ( + + + + )} + + ) + } + > + {p.disk.name}{" "} + {p.disk.deleteType && ( + + {p.disk.deleteType === "deletefile" + ? "Remove, DELETING block file" + : "Remove, keeping block file"} + + )} + + } secondary={`${filesize(p.disk.size * 1000 * 1000)} - ${ p.disk.alloc_type }`} /> - {/* TODO delete disk if editable */} ); @@ -96,19 +157,25 @@ function DiskInfo(p: { type="number" /> - { - p.disk.alloc_type = v as any; - p.onChange?.(); - }} - /> +
+ { + p.disk.alloc_type = v as any; + p.onChange?.(); + }} + /> + + + + +
); }