diff --git a/src/components/ui/Accordion.tsx b/src/components/ui/Accordion.tsx
new file mode 100644
index 0000000..e737319
--- /dev/null
+++ b/src/components/ui/Accordion.tsx
@@ -0,0 +1,39 @@
+import React, { ReactElement, useState } from "react";
+import classNames from "classnames";
+
+interface AccordionProps {
+ title: string;
+ children: React.ReactNode;
+ defaultOpen?: boolean;
+ className?: string;
+}
+
+export function Accordion({
+ title,
+ children,
+ defaultOpen = false,
+ className,
+}: AccordionProps): ReactElement {
+ const [isOpen, setIsOpen] = useState(defaultOpen);
+
+ return (
+
+
+ {isOpen &&
{children}
}
+
+ );
+}
diff --git a/src/pages/RecordCrossmatchDetails.tsx b/src/pages/RecordCrossmatchDetails.tsx
index 94cf807..c59c5cc 100644
--- a/src/pages/RecordCrossmatchDetails.tsx
+++ b/src/pages/RecordCrossmatchDetails.tsx
@@ -4,6 +4,11 @@ import { AladinViewer } from "../components/ui/Aladin";
import { Loading } from "../components/ui/Loading";
import { ErrorPage } from "../components/ui/ErrorPage";
import { CatalogData } from "../components/ui/CatalogData";
+import {
+ CommonTable,
+ Column,
+ CellPrimitive,
+} from "../components/ui/CommonTable";
import { getRecordCrossmatch } from "../clients/admin/sdk.gen";
import {
GetRecordCrossmatchResponse,
@@ -15,6 +20,7 @@ import { Schema as BackendSchema } from "../clients/backend/types.gen";
import { getResource } from "../resources/resources";
import { Link } from "../components/ui/Link";
import { CopyButton } from "../components/ui/CopyButton";
+import { Accordion } from "../components/ui/Accordion";
import { useDataFetching } from "../hooks/useDataFetching";
import { adminClient } from "../clients/config";
@@ -120,10 +126,32 @@ interface RecordCrossmatchDetailsProps {
data: GetRecordCrossmatchResponse;
}
+function OriginalData({
+ data,
+}: {
+ data: { [key: string]: unknown };
+}): ReactElement {
+ const columns: Column[] = [{ name: "Column" }, { name: "Value" }];
+ const tableData: Record[] = Object.entries(data).map(
+ ([key, value]) => ({
+ Column: key,
+ Value: value === null || value === undefined ? "NULL" : String(value),
+ }),
+ );
+
+ return ;
+}
+
function RecordCrossmatchDetails({
data,
}: RecordCrossmatchDetailsProps): ReactElement {
- const { crossmatch, candidates, schema } = data;
+ const {
+ crossmatch,
+ candidates,
+ schema,
+ table_name: tableName,
+ original_data: originalData,
+ } = data;
const recordCatalogs = crossmatch.catalogs;
const backendSchema = convertAdminSchemaToBackendSchema(schema);
const candidateSources = convertCandidatesToAdditionalSources(
@@ -156,6 +184,9 @@ function RecordCrossmatchDetails({
{crossmatch.record_id}
+
+ Table: {tableName}
+
Status:{" "}
{getResource(`crossmatch.status.${crossmatch.status}`).Title}
@@ -165,22 +196,29 @@ function RecordCrossmatchDetails({
+ {originalData && (
+
+
+
+ )}
+
{candidates.length > 0 && (
Crossmatch Candidates
{candidates.map((candidate, index) => (
-
-
- Candidate {index + 1}:{" "}
- {`PGC ${candidate.pgc}`}
-
+
+ {`PGC ${candidate.pgc}`}
-
+
))}
)}