diff --git a/src/components/DataStudio/FigureItem.jsx b/src/components/DataStudio/FigureItem.jsx new file mode 100644 index 0000000..0b070d9 --- /dev/null +++ b/src/components/DataStudio/FigureItem.jsx @@ -0,0 +1,110 @@ +import { Button, CloseButton, Dialog, Field, Image, Input, Portal, Text, VStack } from '@chakra-ui/react' +import { useState } from 'react' +import ToastWizard from '../toastWizard'; +import server, { JSONResponse } from '../../networking'; + +function FigureItem({ figureID, label, reloadInfo }) { + const [dialogOpen, setDialogOpen] = useState(false); + const [updatingLabel, setUpdatingLabel] = useState(false); + const [newLabel, setNewLabel] = useState(label); + + const handleUpdateLabel = async () => { + if (!newLabel) { + ToastWizard.standard("error", "All fields are required.") + return; + } + if (newLabel === label) { + ToastWizard.standard("error", "Please enter a different label to update.") + return; + } + + const newValue = newLabel; + + setUpdatingLabel(true); + + try { + const response = await server.post('/gallery/updateFigure', { + figureID: figureID, + label: newValue + }); + + if (response.data instanceof JSONResponse) { + if (response.data.isErrorStatus()) { + const errObject = { + response: { + data: response.data + } + }; + throw new Error(errObject); + } + + // Success case + setDialogOpen(false); + reloadInfo(); + ToastWizard.standard("success", "Label updated", `The figure's label has been changed to '${newValue}'.`); + } else { + throw new Error("Unexpected response format"); + } + } catch (err) { + if (err.response && err.response.data instanceof JSONResponse) { + console.log("Error response in figure label update request:", err.response.data.fullMessage()); + if (err.response.data.userErrorType()) { + ToastWizard.standard("error", "Label update failed.", err.response.data.message); + } else { + ToastWizard.standard("error", "Something went wrong", "Couldn't update the figure's label. Please try again."); + } + } else { + console.log("Unexpected error in figure label update request:", err); + ToastWizard.standard("error", "Something went wrong", "Couldn't update the figure's label. Please try again."); + } + } finally { + setUpdatingLabel(false); + } + } + + const handleEnterKey = (e) => { + if (e.key === 'Enter') { + handleUpdateLabel(); + } + } + + return ( + setDialogOpen(e.open)}> + + + + 15 ? 'xs' : 'md'}>{label} + + + + + + + + Update Label + + + Is '{label}' not quite right? Update the label for this auto-detected figure. + + Figure Name + setNewLabel(e.target.value)} onKeyDown={handleEnterKey} /> + This change will be reflected across the system. + + + + + + + + + + + + + + + + ) +} + +export default FigureItem \ No newline at end of file diff --git a/src/components/Sidebar.jsx b/src/components/Sidebar.jsx index e82df02..fc42c5f 100644 --- a/src/components/Sidebar.jsx +++ b/src/components/Sidebar.jsx @@ -42,15 +42,11 @@ function Sidebar({ isOpen, onOpenChange }) { Catalogue Browser - } - - {username && (