From a3dc77fc86753471dee7c5d21fd023a439509548 Mon Sep 17 00:00:00 2001 From: JunHam Date: Tue, 12 Aug 2025 01:39:42 +0800 Subject: [PATCH 01/28] Fixed path routes for group view and artefact editor --- src/main.jsx | 6 ++---- src/pages/ArtefactEditor.jsx | 4 ++-- src/pages/GroupView.jsx | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main.jsx b/src/main.jsx index c37405d..a73c062 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -52,10 +52,8 @@ createRoot(document.getElementById('root')).render( } /> - - } /> - } /> - + } /> + } /> diff --git a/src/pages/ArtefactEditor.jsx b/src/pages/ArtefactEditor.jsx index 5a297fe..e0494cb 100644 --- a/src/pages/ArtefactEditor.jsx +++ b/src/pages/ArtefactEditor.jsx @@ -2,9 +2,9 @@ import { Box, Flex } from "@chakra-ui/react"; import { useParams } from 'react-router-dom'; function ArtefactEditor() { - const { artID } = useParams(); + const { colID, artID } = useParams(); return ( - ArtefactEditor for {artID} + ArtefactEditor for {colID} {artID} ); } diff --git a/src/pages/GroupView.jsx b/src/pages/GroupView.jsx index 575240f..d3fbe4d 100644 --- a/src/pages/GroupView.jsx +++ b/src/pages/GroupView.jsx @@ -1,9 +1,9 @@ import { useParams } from 'react-router-dom'; function GroupView() { - const { artID, colID } = useParams(); + const { colID } = useParams(); - return
GroupView for collection {colID}, {artID}
; + return
GroupView for collection {colID}
; } export default GroupView; From 3aa6174e48a019df396373c398c92aa11deb7f3f Mon Sep 17 00:00:00 2001 From: JunHam Date: Tue, 12 Aug 2025 02:06:51 +0800 Subject: [PATCH 02/28] Added fetch metadata request for artefact editor --- src/pages/ArtefactEditor.jsx | 65 ++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/pages/ArtefactEditor.jsx b/src/pages/ArtefactEditor.jsx index e0494cb..7d6c2b5 100644 --- a/src/pages/ArtefactEditor.jsx +++ b/src/pages/ArtefactEditor.jsx @@ -1,8 +1,73 @@ import { Box, Flex } from "@chakra-ui/react"; import { useParams } from 'react-router-dom'; +import { useEffect, useRef, useState } from "react"; +import ToastWizard from "../components/toastWizard"; +import server, { JSONResponse } from "../networking"; function ArtefactEditor() { const { colID, artID } = useParams(); + + // Metadata fetching states + const [metadata, setMetadata] = useState(null); + const [loading, setLoading] = useState(false); + + // Metadata fetching function + const fetchMetadata = async () => { + + setLoading(true); + + try { + const response = await server.get(`/cdn/artefactMetadata/${artID}`); + console.log(response) + + if (response.data instanceof JSONResponse) { + if (response.data.isErrorStatus()) { + const errObject = { + response: { + data: response.data + } + }; + throw errObject; + } + + // Success case + setMetadata(response.data.raw.data); + } else { + throw new Error("Unexpected response format"); + } + } catch (err) { + if (err.response && err.response.data instanceof JSONResponse) { + if (err.response.data.userErrorType()) { + ToastWizard.standard( + "error", + "We could not load the details", + err.response.data.message || "There was a problem retrieving this item information. Please try again later." + ); + } else { + ToastWizard.standard( + "error", + "Something went wrong", + "We are having trouble loading the information. Please try again in a moment." + ); + } + } else { + ToastWizard.standard( + "error", + "Connection issue", + "We could not connect to the server. Please check your internet connection or try again later." + ); + } + setMetadata(null); + } finally { + setLoading(false); + } + }; + + // Fetch metadata when currentItem changes or modal opens + useEffect(() => { + fetchMetadata(); + }, []); + return ( ArtefactEditor for {colID} {artID} ); From ee52930e99d5dc7dc2409f25ece261eac53054f3 Mon Sep 17 00:00:00 2001 From: JunHam Date: Tue, 12 Aug 2025 15:10:23 +0800 Subject: [PATCH 03/28] Added rough layout for artefact editor --- src/main.jsx | 12 +++---- src/pages/ArtefactEditor.jsx | 67 +++++++++++++++++++++++++++--------- 2 files changed, 56 insertions(+), 23 deletions(-) diff --git a/src/main.jsx b/src/main.jsx index a73c062..1b3c99e 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -49,18 +49,18 @@ createRoot(document.getElementById('root')).render( } /> - - - } /> - } /> - } /> - {/* Protected Pages */} }> } /> } /> + + + } /> + } /> + } /> + diff --git a/src/pages/ArtefactEditor.jsx b/src/pages/ArtefactEditor.jsx index 7d6c2b5..69579f5 100644 --- a/src/pages/ArtefactEditor.jsx +++ b/src/pages/ArtefactEditor.jsx @@ -1,21 +1,18 @@ -import { Box, Flex } from "@chakra-ui/react"; +import { Box, Flex, Text, Center, Spinner } from "@chakra-ui/react"; import { useParams } from 'react-router-dom'; import { useEffect, useRef, useState } from "react"; +import { useSelector } from "react-redux"; import ToastWizard from "../components/toastWizard"; import server, { JSONResponse } from "../networking"; +import CentredSpinner from "../components/CentredSpinner"; function ArtefactEditor() { - const { colID, artID } = useParams(); - - // Metadata fetching states + const { artID } = useParams(); const [metadata, setMetadata] = useState(null); - const [loading, setLoading] = useState(false); + const { loaded } = useSelector(state => state.auth); // Metadata fetching function const fetchMetadata = async () => { - - setLoading(true); - try { const response = await server.get(`/cdn/artefactMetadata/${artID}`); console.log(response) @@ -41,36 +38,72 @@ function ArtefactEditor() { ToastWizard.standard( "error", "We could not load the details", - err.response.data.message || "There was a problem retrieving this item information. Please try again later." + err.response.data.message || "There was a problem retrieving this item information. Please try again later.", + 3000, + true, + fetchMetadata, + 'Retry' ); } else { ToastWizard.standard( "error", "Something went wrong", - "We are having trouble loading the information. Please try again in a moment." + "We are having trouble loading the information. Please try again in a moment.", + 3000, + true, + fetchMetadata, + 'Retry' ); } } else { ToastWizard.standard( "error", "Connection issue", - "We could not connect to the server. Please check your internet connection or try again later." + "We could not connect to the server. Please check your internet connection or try again later.", + 3000, + true, + fetchMetadata, + 'Retry' ); } setMetadata(null); - } finally { - setLoading(false); } }; // Fetch metadata when currentItem changes or modal opens useEffect(() => { - fetchMetadata(); - }, []); + if (loaded) { + fetchMetadata() + } + }, [loaded]); + + // Show loading spinner while data is being fetched + if (!metadata) { + return + } return ( - ArtefactEditor for {colID} {artID} + <> + + Data Studio + {metadata.name} + + + + + + + + + + + + ); } -export default ArtefactEditor; +export default ArtefactEditor; \ No newline at end of file From 55eed68d5fb839be2f9b38d2717a6de23a7fc8b4 Mon Sep 17 00:00:00 2001 From: JunHam Date: Tue, 12 Aug 2025 15:13:22 +0800 Subject: [PATCH 04/28] Fixed metadataDisplay to set metadata based on response.data.raw.data.metadata --- src/components/Catalogue/metadataDisplay.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Catalogue/metadataDisplay.jsx b/src/components/Catalogue/metadataDisplay.jsx index 9e1972a..36e2b31 100644 --- a/src/components/Catalogue/metadataDisplay.jsx +++ b/src/components/Catalogue/metadataDisplay.jsx @@ -113,7 +113,7 @@ function MetadataDisplay({ currentItem, isOpen }) { } // Success case - setMetadata(response.data.raw.data); + setMetadata(response.data.raw.data.metadata); } else { throw new Error("Unexpected response format"); } From 8dba01ef1c62dc176ff257af885fdc19a0695268 Mon Sep 17 00:00:00 2001 From: JunHam Date: Tue, 12 Aug 2025 16:43:59 +0800 Subject: [PATCH 05/28] Added back arrow and chevrons for artefact editor --- src/pages/ArtefactEditor.jsx | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/pages/ArtefactEditor.jsx b/src/pages/ArtefactEditor.jsx index 69579f5..f52f1e7 100644 --- a/src/pages/ArtefactEditor.jsx +++ b/src/pages/ArtefactEditor.jsx @@ -5,6 +5,8 @@ import { useSelector } from "react-redux"; import ToastWizard from "../components/toastWizard"; import server, { JSONResponse } from "../networking"; import CentredSpinner from "../components/CentredSpinner"; +import { FaArrowAltCircleLeft, FaChevronLeft, FaChevronRight } from "react-icons/fa"; +import ArrowOverlay from "../components/Catalogue/arrowOverlay"; function ArtefactEditor() { const { artID } = useParams(); @@ -83,26 +85,33 @@ function ArtefactEditor() { } return ( - <> - - Data Studio - {metadata.name} - - - - + + + + + Data Studio + {metadata.name} + + + + + + + + + + + + + - + ); } From a09a706bf58a4f44caa13ff5c836f3b4848f7afc Mon Sep 17 00:00:00 2001 From: JunHam Date: Tue, 12 Aug 2025 17:05:11 +0800 Subject: [PATCH 06/28] Added image rendering for AE --- src/pages/ArtefactEditor.jsx | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/pages/ArtefactEditor.jsx b/src/pages/ArtefactEditor.jsx index f52f1e7..0bff8d8 100644 --- a/src/pages/ArtefactEditor.jsx +++ b/src/pages/ArtefactEditor.jsx @@ -1,4 +1,4 @@ -import { Box, Flex, Text, Center, Spinner } from "@chakra-ui/react"; +import { Box, Flex, Text, Image } from "@chakra-ui/react"; import { useParams } from 'react-router-dom'; import { useEffect, useRef, useState } from "react"; import { useSelector } from "react-redux"; @@ -6,7 +6,6 @@ import ToastWizard from "../components/toastWizard"; import server, { JSONResponse } from "../networking"; import CentredSpinner from "../components/CentredSpinner"; import { FaArrowAltCircleLeft, FaChevronLeft, FaChevronRight } from "react-icons/fa"; -import ArrowOverlay from "../components/Catalogue/arrowOverlay"; function ArtefactEditor() { const { artID } = useParams(); @@ -84,8 +83,11 @@ function ArtefactEditor() { return } + console.log(metadata) + console.log(`${import.meta.env.VITE_BACKEND_URL}/cdn/artefacts/${artID}`) + return ( - + @@ -94,20 +96,26 @@ function ArtefactEditor() { - - + + - - + + - - + - + From 7c5f36c8b1cace067c4467d5ed92fa90f51f4977 Mon Sep 17 00:00:00 2001 From: JunHam Date: Tue, 12 Aug 2025 17:09:43 +0800 Subject: [PATCH 07/28] Fixed sizing and layout in AE --- src/pages/ArtefactEditor.jsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/pages/ArtefactEditor.jsx b/src/pages/ArtefactEditor.jsx index 0bff8d8..e0a0060 100644 --- a/src/pages/ArtefactEditor.jsx +++ b/src/pages/ArtefactEditor.jsx @@ -92,30 +92,30 @@ function ArtefactEditor() { Data Studio - {metadata.name} + {metadata.name} - - + + - + - + - + From 512c63ef9993e8b9dc3be359ca929660400d891a Mon Sep 17 00:00:00 2001 From: JunHam Date: Tue, 12 Aug 2025 17:29:23 +0800 Subject: [PATCH 08/28] added editorCard --- src/components/DataStudio/editorCard.jsx | 11 +++++++++++ src/pages/ArtefactEditor.jsx | 16 +++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 src/components/DataStudio/editorCard.jsx diff --git a/src/components/DataStudio/editorCard.jsx b/src/components/DataStudio/editorCard.jsx new file mode 100644 index 0000000..b883e74 --- /dev/null +++ b/src/components/DataStudio/editorCard.jsx @@ -0,0 +1,11 @@ +import { Card } from "@chakra-ui/react" + +function EditorCard() { + return ( + + + + ) +} + +export default EditorCard \ No newline at end of file diff --git a/src/pages/ArtefactEditor.jsx b/src/pages/ArtefactEditor.jsx index e0a0060..9017727 100644 --- a/src/pages/ArtefactEditor.jsx +++ b/src/pages/ArtefactEditor.jsx @@ -6,6 +6,7 @@ import ToastWizard from "../components/toastWizard"; import server, { JSONResponse } from "../networking"; import CentredSpinner from "../components/CentredSpinner"; import { FaArrowAltCircleLeft, FaChevronLeft, FaChevronRight } from "react-icons/fa"; +import EditorCard from "../components/DataStudio/editorCard"; function ArtefactEditor() { const { artID } = useParams(); @@ -83,9 +84,6 @@ function ArtefactEditor() { return } - console.log(metadata) - console.log(`${import.meta.env.VITE_BACKEND_URL}/cdn/artefacts/${artID}`) - return ( @@ -97,25 +95,25 @@ function ArtefactEditor() { - + - + - + + - + From f046b57bd72381be68d2ebe686f6d4521c7c6f8f Mon Sep 17 00:00:00 2001 From: JunHam Date: Tue, 12 Aug 2025 18:00:16 +0800 Subject: [PATCH 09/28] Added title and button for editCard --- src/components/DataStudio/editorCard.jsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/DataStudio/editorCard.jsx b/src/components/DataStudio/editorCard.jsx index b883e74..a17d0a8 100644 --- a/src/components/DataStudio/editorCard.jsx +++ b/src/components/DataStudio/editorCard.jsx @@ -1,9 +1,21 @@ -import { Card } from "@chakra-ui/react" +import { Card, Button, Flex } from "@chakra-ui/react" +import { IoInformationCircleOutline } from "react-icons/io5" function EditorCard() { return ( - + + + + Artefact Details + + + + + + ) } From 8b2d04014992adf9a5d4907469bd624fe9f9818d Mon Sep 17 00:00:00 2001 From: JunHam Date: Tue, 12 Aug 2025 18:01:58 +0800 Subject: [PATCH 10/28] Shifted addInfo in metadatadisplay to be before the figure headshot --- src/components/Catalogue/metadataDisplay.jsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/Catalogue/metadataDisplay.jsx b/src/components/Catalogue/metadataDisplay.jsx index 36e2b31..5ab3368 100644 --- a/src/components/Catalogue/metadataDisplay.jsx +++ b/src/components/Catalogue/metadataDisplay.jsx @@ -245,6 +245,14 @@ function MetadataDisplay({ currentItem, isOpen }) { Caption: {metadata.caption || "N/A"} + {/* Additional figure metadata, if present */} + {metadata.addInfo && ( + <> + Additional Info: + {metadata.addInfo} + + )} + {/* Figure headshots (if available) */} {Array.isArray(metadata.figureIDs) && metadata.figureIDs.length > 0 ? ( @@ -277,14 +285,6 @@ function MetadataDisplay({ currentItem, isOpen }) { ) : ( N/A )} - - {/* Additional figure metadata, if present */} - {metadata.addInfo && ( - <> - Additional Info: - {metadata.addInfo} - - )} )} From aa43d21cb0229438bb5fc5e1e7d426b787ab0d7e Mon Sep 17 00:00:00 2001 From: JunHam Date: Tue, 12 Aug 2025 18:53:06 +0800 Subject: [PATCH 11/28] Added metadata toggle --- .../Catalogue/transcriptionToggle.jsx | 2 +- src/components/DataStudio/editorCard.jsx | 15 ++++- src/components/DataStudio/metadataToggle.jsx | 59 +++++++++++++++++++ src/pages/ArtefactEditor.jsx | 2 +- 4 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 src/components/DataStudio/metadataToggle.jsx diff --git a/src/components/Catalogue/transcriptionToggle.jsx b/src/components/Catalogue/transcriptionToggle.jsx index adec14b..b1ec21d 100644 --- a/src/components/Catalogue/transcriptionToggle.jsx +++ b/src/components/Catalogue/transcriptionToggle.jsx @@ -57,7 +57,7 @@ const TranscriptionToggle = ({ value, onChange }) => { p="1" rounded="lg" boxShadow="sm" - gap="00" + gap="0" > diff --git a/src/components/DataStudio/editorCard.jsx b/src/components/DataStudio/editorCard.jsx index a17d0a8..ccaf539 100644 --- a/src/components/DataStudio/editorCard.jsx +++ b/src/components/DataStudio/editorCard.jsx @@ -1,7 +1,11 @@ -import { Card, Button, Flex } from "@chakra-ui/react" +import { Card, Button, Flex, Text } from "@chakra-ui/react" +import { useState } from "react"; import { IoInformationCircleOutline } from "react-icons/io5" +import MetadataToggle from "./metadataToggle"; + +function EditorCard(metadata) { + const [selectedTranscription, setSelectedTranscription] = useState("tradCN"); -function EditorCard() { return ( @@ -14,7 +18,12 @@ function EditorCard() { - + + + ) diff --git a/src/components/DataStudio/metadataToggle.jsx b/src/components/DataStudio/metadataToggle.jsx new file mode 100644 index 0000000..dc7927b --- /dev/null +++ b/src/components/DataStudio/metadataToggle.jsx @@ -0,0 +1,59 @@ +import { SegmentGroup, Text } from "@chakra-ui/react"; + +const MetadataToggle = ({ value, onChange }) => { + const items = [ + { value: "tradCN", label: "Trad CN" }, + { value: "simplifiedCN", label: "Simp CN" }, + { value: "english", label: "ENG" }, + { value: "summary", label: "SUM" }, + ]; + + return ( + onChange(value)} + size="sm" + bg="gray.100" + p="1" + rounded="lg" + boxShadow="sm" + w="100%" + display="flex" + position="relative" + > + + ({ + value: item.value, + label: ( + + {item.label} + + ), + style: { + flex: 1, + minWidth: 0, + position: "relative", + zIndex: 1, + display: "flex", + justifyContent: "center", + alignItems: "center", + }, + }))} + /> + + ); +}; + +export default MetadataToggle; \ No newline at end of file diff --git a/src/pages/ArtefactEditor.jsx b/src/pages/ArtefactEditor.jsx index 9017727..6af0a37 100644 --- a/src/pages/ArtefactEditor.jsx +++ b/src/pages/ArtefactEditor.jsx @@ -110,7 +110,7 @@ function ArtefactEditor() { - + From fd57f372fb22c73f237c436edbe8ee658c8ca70f Mon Sep 17 00:00:00 2001 From: JunHam Date: Tue, 12 Aug 2025 22:53:03 +0800 Subject: [PATCH 12/28] Added rendering of name and mm transcription using text area --- src/components/DataStudio/editorCard.jsx | 26 ++++++++++++++++++++---- src/pages/ArtefactEditor.jsx | 1 - 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/components/DataStudio/editorCard.jsx b/src/components/DataStudio/editorCard.jsx index ccaf539..4ceabb9 100644 --- a/src/components/DataStudio/editorCard.jsx +++ b/src/components/DataStudio/editorCard.jsx @@ -1,9 +1,9 @@ -import { Card, Button, Flex, Text } from "@chakra-ui/react" +import { Card, Button, Flex, Text, Field, Input, Textarea } from "@chakra-ui/react" import { useState } from "react"; import { IoInformationCircleOutline } from "react-icons/io5" import MetadataToggle from "./metadataToggle"; -function EditorCard(metadata) { +function EditorCard({ metadata }) { const [selectedTranscription, setSelectedTranscription] = useState("tradCN"); return ( @@ -17,13 +17,31 @@ function EditorCard(metadata) { Manage Group - - + + + Name: + + + + + + + Transcription: + + +