UPDATE[WebApp]: we can now delete models on the localStorage

This commit is contained in:
Nicolás Hatcher
2024-10-13 14:13:52 +02:00
committed by Nicolás Hatcher Andrés
parent 3058a63e4f
commit 480640dc98
4 changed files with 47 additions and 2 deletions

View File

@@ -8,6 +8,7 @@ import { FileBar } from "./AppComponents/FileBar";
import { get_model, uploadFile } from "./AppComponents/rpc"; import { get_model, uploadFile } from "./AppComponents/rpc";
import { import {
createNewModel, createNewModel,
deleteSelectedModel,
loadModelFromStorageOrCreate, loadModelFromStorageOrCreate,
saveModelToStorage, saveModelToStorage,
saveSelectedModelInStorage, saveSelectedModelInStorage,
@@ -86,6 +87,12 @@ function App() {
setModel(newModel); setModel(newModel);
} }
}} }}
onDelete={() => {
const newModel = deleteSelectedModel();
if (newModel) {
setModel(newModel);
}
}}
/> />
<Workbook model={model} workbookState={workbookState} /> <Workbook model={model} workbookState={workbookState} />
</Wrapper> </Wrapper>

View File

@@ -14,6 +14,7 @@ export function FileBar(properties: {
newModel: () => void; newModel: () => void;
setModel: (key: string) => void; setModel: (key: string) => void;
onModelUpload: (blob: ArrayBuffer, fileName: string) => Promise<void>; onModelUpload: (blob: ArrayBuffer, fileName: string) => Promise<void>;
onDelete: () => void;
}) { }) {
const hiddenInputRef = useRef<HTMLInputElement>(null); const hiddenInputRef = useRef<HTMLInputElement>(null);
const [toast, setToast] = useState(false); const [toast, setToast] = useState(false);
@@ -32,6 +33,7 @@ export function FileBar(properties: {
const fileName = model.getName(); const fileName = model.getName();
await downloadModel(bytes, fileName); await downloadModel(bytes, fileName);
}} }}
onDelete={properties.onDelete}
/> />
<WorkbookTitle <WorkbookTitle
name={properties.model.getName()} name={properties.model.getName()}

View File

@@ -1,6 +1,6 @@
import styled from "@emotion/styled"; import styled from "@emotion/styled";
import { Menu, MenuItem, Modal } from "@mui/material"; import { Menu, MenuItem, Modal } from "@mui/material";
import { FileDown, FileUp, Plus } from "lucide-react"; import { FileDown, FileUp, Plus, Trash2 } from "lucide-react";
import { useRef, useState } from "react"; import { useRef, useState } from "react";
import { UploadFileDialog } from "./UploadFileDialog"; import { UploadFileDialog } from "./UploadFileDialog";
import { getModelsMetadata, getSelectedUuuid } from "./storage"; import { getModelsMetadata, getSelectedUuuid } from "./storage";
@@ -10,6 +10,7 @@ export function FileMenu(props: {
setModel: (key: string) => void; setModel: (key: string) => void;
onDownload: () => void; onDownload: () => void;
onModelUpload: (blob: ArrayBuffer, fileName: string) => Promise<void>; onModelUpload: (blob: ArrayBuffer, fileName: string) => Promise<void>;
onDelete: () => void;
}) { }) {
const [isMenuOpen, setMenuOpen] = useState(false); const [isMenuOpen, setMenuOpen] = useState(false);
const [isImportMenuOpen, setImportMenuOpen] = useState(false); const [isImportMenuOpen, setImportMenuOpen] = useState(false);
@@ -69,6 +70,17 @@ export function FileMenu(props: {
Download (.xlsx) Download (.xlsx)
</MenuItemText> </MenuItemText>
</MenuItemWrapper> </MenuItemWrapper>
<MenuItemWrapper>
<StyledTrash />
<MenuItemText
onClick={() => {
props.onDelete();
setMenuOpen(false);
}}
>
Delete workbook
</MenuItemText>
</MenuItemWrapper>
<MenuDivider /> <MenuDivider />
{elements} {elements}
</Menu> </Menu>
@@ -122,6 +134,13 @@ const StyledFileUp = styled(FileUp)`
padding-right: 10px; padding-right: 10px;
`; `;
const StyledTrash = styled(Trash2)`
width: 16px;
height: 16px;
color: #333333;
padding-right: 10px;
`;
const MenuDivider = styled("div")` const MenuDivider = styled("div")`
width: 80%; width: 80%;
margin: auto; margin: auto;

View File

@@ -99,14 +99,31 @@ export function saveModelToStorage(model: Model) {
localStorage.setItem("models", JSON.stringify(models)); localStorage.setItem("models", JSON.stringify(models));
} }
export function selectModelFromStorage(uuid: string): Model | undefined { export function selectModelFromStorage(uuid: string): Model | null {
localStorage.setItem("selected", uuid); localStorage.setItem("selected", uuid);
const modelBytesString = localStorage.getItem(uuid); const modelBytesString = localStorage.getItem(uuid);
if (modelBytesString) { if (modelBytesString) {
return Model.from_bytes(base64ToBytes(modelBytesString)); return Model.from_bytes(base64ToBytes(modelBytesString));
} }
return null;
} }
export function getSelectedUuuid(): string | null { export function getSelectedUuuid(): string | null {
return localStorage.getItem("selected"); return localStorage.getItem("selected");
} }
export function deleteSelectedModel(): Model | null {
const uuid = localStorage.getItem("selected");
if (!uuid) {
return null;
}
localStorage.removeItem(uuid);
const metadata = getModelsMetadata();
delete metadata[uuid];
localStorage.setItem("models", JSON.stringify(metadata));
const uuids = Object.keys(metadata);
if (uuids.length === 0) {
return createNewModel();
}
return selectModelFromStorage(uuids[0]);
}