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
-