From f95764f4db48dea170bff4992a3ef994a77a6b12 Mon Sep 17 00:00:00 2001 From: Prakhar Trivedi Date: Fri, 15 Aug 2025 11:27:41 +0800 Subject: [PATCH 1/3] fixed bug where login welcome back toast had undefined username --- src/pages/Login.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Login.jsx b/src/pages/Login.jsx index f8a7763..06ae436 100644 --- a/src/pages/Login.jsx +++ b/src/pages/Login.jsx @@ -57,7 +57,7 @@ function Login() { navigate("/catalogue"); ToastWizard.standard( "success", - (res.data.raw.fname && res.data.raw.lname) ? `Welcome back, ${res.data.raw.fname} ${res.data.raw.lname}!` : `Welcome back, ${res.data.raw.username}!`, + (res.data.raw.fname && res.data.raw.lname) ? `Welcome back, ${res.data.raw.fname} ${res.data.raw.lname}!` : `Welcome back, ${res.data.raw.username || 'User'}!`, "Login successful.", 5000, true From 766f935d27b6c98dd04fa3ab7f7cbc7c15e1cc41 Mon Sep 17 00:00:00 2001 From: Prakhar Trivedi Date: Fri, 15 Aug 2025 16:46:18 +0800 Subject: [PATCH 2/3] idek tbh --- src/components/Catalogue/catalogueItemView.jsx | 6 +++--- src/components/Catalogue/metadataDisplay.jsx | 2 +- src/components/DataImport/ArtefactUploadView.jsx | 10 +++++++++- src/components/DataImport/BatchCard.jsx | 5 +---- src/components/DataStudio/figureDisplay.jsx | 2 +- src/pages/ArtefactEditor.jsx | 10 ++++++++-- 6 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/components/Catalogue/catalogueItemView.jsx b/src/components/Catalogue/catalogueItemView.jsx index e75adc7..e7623bb 100644 --- a/src/components/Catalogue/catalogueItemView.jsx +++ b/src/components/Catalogue/catalogueItemView.jsx @@ -356,7 +356,7 @@ const CatalogueItemView = ({ isOpen, onClose, title, sectionId, items, setDialog gap={2} > {item.title} @@ -491,8 +491,8 @@ const CatalogueItemView = ({ isOpen, onClose, title, sectionId, items, setDialog > - {metadata.figureInfo[id] || "No Label"} + {metadata.figureInfo[id] && metadata.figureInfo[id].length <= 20 ? metadata.figureInfo[id] : "No Label"} ))} diff --git a/src/components/DataImport/ArtefactUploadView.jsx b/src/components/DataImport/ArtefactUploadView.jsx index 5a06d0c..6a9dc9a 100644 --- a/src/components/DataImport/ArtefactUploadView.jsx +++ b/src/components/DataImport/ArtefactUploadView.jsx @@ -1,7 +1,7 @@ import { Button, Flex, Box, Text, Field, Input } from "@chakra-ui/react"; import { useEffect, useRef, useState } from "react"; import { HiUpload } from "react-icons/hi"; -import server from "../../networking"; +import server, { JSONResponse } from "../../networking"; import ToastWizard from "../toastWizard"; import FileItem from "./FileItem"; import { IoArrowBackCircleSharp } from "react-icons/io5"; @@ -101,6 +101,14 @@ function ArtefactUploadView({ batch, setBatchID, fetchBatches, onBackToPending } ); } catch (err) { console.log(`Non-success response in file upload to batch ${batchID || 'New Batch'}`, err) + + if (err.response && err.response.data instanceof JSONResponse) { + if (err.response.data.userErrorType()) { + ToastWizard.standard("error", "Upload Failed", err.response.data.message); + return; + } + } + const updates = err?.response?.data?.raw?.updates; if (updates) { setFileStatuses(updates); diff --git a/src/components/DataImport/BatchCard.jsx b/src/components/DataImport/BatchCard.jsx index e9121a9..174bc6e 100644 --- a/src/components/DataImport/BatchCard.jsx +++ b/src/components/DataImport/BatchCard.jsx @@ -137,11 +137,10 @@ function BatchCard({ batchData, formatTimestamp, fetchBatches }) { } } - console.log(batchData) - useEffect(() => { if (batchData) { var newContent = { ...content }; + newContent.name = batchData.name || "No name"; if (batchData.stage === "upload_pending") { newContent.displayMessage = `${batchData.artefactSummary.total || 0} Uploaded (Upload more if you wish)` // newContent.progress = Math.round((batchData.artefactSummary.unprocessed || 0) / (batchData.artefactSummary.total || 1) * 100); @@ -184,8 +183,6 @@ function BatchCard({ batchData, formatTimestamp, fetchBatches }) { } }, [batchData]); - console.log(content); - return ( diff --git a/src/components/DataStudio/figureDisplay.jsx b/src/components/DataStudio/figureDisplay.jsx index df6a7d7..e8992b2 100644 --- a/src/components/DataStudio/figureDisplay.jsx +++ b/src/components/DataStudio/figureDisplay.jsx @@ -178,7 +178,7 @@ function FigureDisplaySection({ artefactId, figureInfo, getArtefactData, isEditi fontSize={10} lineClamp={1} > - {figureInfo[id] || "No Label"} + {figureInfo[id] && figureInfo[id].length <= 20 ? figureInfo[id] : "No Label"} ))} diff --git a/src/pages/ArtefactEditor.jsx b/src/pages/ArtefactEditor.jsx index bf222cf..9c5c0fb 100644 --- a/src/pages/ArtefactEditor.jsx +++ b/src/pages/ArtefactEditor.jsx @@ -1,4 +1,4 @@ -import { Box, Flex, Text, Image, useBreakpointValue } from "@chakra-ui/react"; +import { Box, Flex, Text, Image, useBreakpointValue, Button } from "@chakra-ui/react"; import { useParams, useNavigate } from 'react-router-dom'; import { useEffect, useState } from "react"; import { useSelector } from "react-redux"; @@ -16,6 +16,7 @@ function ArtefactEditor() { const { loaded } = useSelector(state => state.auth); const navigate = useNavigate(); const [isInvalid, setIsInvalid] = useState(false); + const [vetted, setVetted] = useState(false); // Responsive layout values const isMobile = useBreakpointValue({ base: true, md: false }); @@ -120,7 +121,7 @@ function ArtefactEditor() { // Metadata fetching function const fetchMetadata = async () => { try { - const response = await server.get(`/cdn/artefactMetadata/${artID}`); + const response = await server.get(`/cdn/artefactMetadata/${artID}?colID=${colID}`); if (response.data instanceof JSONResponse) { if (response.data.isErrorStatus()) { @@ -137,6 +138,9 @@ function ArtefactEditor() { ...response.data.raw.data, figureInfo: response.data.raw.figureInfo || {} }); + if (response.data.raw.vetted instanceof Boolean) { + setVetted(response.data.raw.vetted); + } } else { throw new Error("Unexpected response format"); } @@ -226,6 +230,8 @@ function ArtefactEditor() { Data Studio {metadata.name} + + {vetted && } {isMobile ? ( From d3e3a7f127b9509ae7e09a3558ae004fb35f028b Mon Sep 17 00:00:00 2001 From: Prakhar Trivedi Date: Fri, 15 Aug 2025 17:05:55 +0800 Subject: [PATCH 3/3] did confirm artefact --- src/components/Navbar.jsx | 6 ++- src/pages/ArtefactEditor.jsx | 83 +++++++++++++++++++++++++++++------- 2 files changed, 72 insertions(+), 17 deletions(-) diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx index f50511a..51dd4df 100644 --- a/src/components/Navbar.jsx +++ b/src/components/Navbar.jsx @@ -12,7 +12,11 @@ function Navbar() { const { username, accountID } = useSelector(state => state.auth); const handleLogoClick = () => { - navigate('/'); + if (username) { + navigate('/catalogue') + } else { + navigate('/'); + } } const handleProfileClick = () => { diff --git a/src/pages/ArtefactEditor.jsx b/src/pages/ArtefactEditor.jsx index 9c5c0fb..5f1120d 100644 --- a/src/pages/ArtefactEditor.jsx +++ b/src/pages/ArtefactEditor.jsx @@ -1,4 +1,4 @@ -import { Box, Flex, Text, Image, useBreakpointValue, Button } from "@chakra-ui/react"; +import { Box, Flex, Text, Image, useBreakpointValue, Button, Spacer } from "@chakra-ui/react"; import { useParams, useNavigate } from 'react-router-dom'; import { useEffect, useState } from "react"; import { useSelector } from "react-redux"; @@ -16,7 +16,8 @@ function ArtefactEditor() { const { loaded } = useSelector(state => state.auth); const navigate = useNavigate(); const [isInvalid, setIsInvalid] = useState(false); - const [vetted, setVetted] = useState(false); + const [vetted, setVetted] = useState(true); + const [markingVetted, setMarkingVetted] = useState(false); // Responsive layout values const isMobile = useBreakpointValue({ base: true, md: false }); @@ -138,7 +139,8 @@ function ArtefactEditor() { ...response.data.raw.data, figureInfo: response.data.raw.figureInfo || {} }); - if (response.data.raw.vetted instanceof Boolean) { + console.log("New vetted info:", response.data.raw.vetted); + if (response.data.raw.vetted !== null && response.data.raw.vetted !== undefined) { setVetted(response.data.raw.vetted); } } else { @@ -215,6 +217,53 @@ function ArtefactEditor() { } }, [collection, metadata, artID]); + const handleMarkVetted = async () => { + if (vetted) { + ToastWizard.standard("error", "Already vetted", "This artefact has already been marked as vetted."); + return; + } + + setMarkingVetted(true); + + try { + const response = await server.post('/dataImport/vetting/confirm', { + batchID: colID, + artefactID: artID + }) + + if (response.data instanceof JSONResponse) { + if (response.data.isErrorStatus()) { + const errObject = { + response: { + data: response.data + } + }; + throw new Error(errObject); + } + + // Success case + fetchMetadata(); + ToastWizard.standard("success", "Marked as vetted", "Artefact marked as vetted successfully!"); + } else { + throw new Error("Unexpected response format"); + } + } catch (err) { + if (err.response && err.response.data instanceof JSONResponse) { + console.log("Error response in mark vetted request:", err.response.data.fullMessage()); + if (err.response.data.userErrorType()) { + ToastWizard.standard("error", "Login failed.", err.response.data.message); + } else { + ToastWizard.standard("error", "Something went wrong", "Couldn't mark artefact as vetted. Please try again.") + } + } else { + console.log("Unexpected error in mark vetted request:", err); + ToastWizard.standard("error", "Something went wrong", "Couldn't mark artefact as vetted. Please try again."); + } + } finally { + setMarkingVetted(false); + } + } + // Show loading spinner while data is being fetched if (!metadata || !collection || isInvalid) { return @@ -227,26 +276,28 @@ function ArtefactEditor() { navigate(-1)} size={40} color='darkBlue' /> - Data Studio - {metadata.name} + Data Studio + {metadata.name} - {vetted && } + + + {!vetted && } {isMobile ? ( - - + - + - - + ) : ( - - + -