diff --git a/src/components/containers/Cassette.test.tsx b/src/components/containers/Cassette.test.tsx
index 8fbf84c..8f54fef 100644
--- a/src/components/containers/Cassette.test.tsx
+++ b/src/components/containers/Cassette.test.tsx
@@ -11,8 +11,8 @@ const defaultSample: components["schemas"]["SampleOut"] = {
shipmentId: 1,
proteinId: 1,
details: {
- concentration: 1
- }
+ concentration: 1,
+ },
};
describe("Cassette", () => {
diff --git a/src/components/containers/Cassette.tsx b/src/components/containers/Cassette.tsx
index 0873536..87c365b 100644
--- a/src/components/containers/Cassette.tsx
+++ b/src/components/containers/Cassette.tsx
@@ -33,7 +33,17 @@ export const Cassette = ({ samples }: CassetteProps) => {
() =>
samples.reduce((selectable, sample) => {
if (sample.subLocation === null) {
- selectable.push({ id: sample.id, name: sample.name || "", data: sample.details });
+ selectable.push({
+ id: sample.id,
+ name: sample.name || "",
+ data: {
+ type: sample.type,
+ displayDetails: [
+ { label: "Grid Box Name", value: sample.containerName },
+ { label: "Location", value: sample.location },
+ ],
+ },
+ });
}
return selectable;
}, [] as TreeData[]),
@@ -94,8 +104,16 @@ export const Cassette = ({ samples }: CassetteProps) => {
borderColor='diamond.700'
w='100%'
>
- {12 - i}
-
+
+ {12 - i}
+
+
{item?.name ?? ""}
@@ -109,6 +127,7 @@ export const Cassette = ({ samples }: CassetteProps) => {
selectedItem={currentItem}
isOpen={isOpen}
onClose={onClose}
+ displayDetails={true}
selectableChildren={selectableSamples}
/>
diff --git a/src/components/containers/ChildSelector.test.tsx b/src/components/containers/ChildSelector.test.tsx
index 6312e5b..342a657 100644
--- a/src/components/containers/ChildSelector.test.tsx
+++ b/src/components/containers/ChildSelector.test.tsx
@@ -153,21 +153,26 @@ describe("Child Selector", () => {
childrenType='sample'
isOpen={true}
onClose={() => {}}
- selectableChildren={[{ id: 1, name: "selectable-child", data: {} }]}
+ selectableChildren={[{ id: 1, name: "selectable-child", data: { type: "Grid" } }]}
/>,
);
expect(screen.getByText("selectable-child")).toBeInTheDocument();
});
- it("should display details if child is sample", () => {
+ it("should display details if displayDetails is set", () => {
renderWithProviders(
{}}
selectableChildren={[
- { id: 1, name: "selectable-child", data: { type: "Sample", concentration: 123 } },
+ {
+ id: 1,
+ name: "selectable-child",
+ data: { type: "Sample", displayDetails: [{ label: "Concentration", value: 123 }] },
+ },
]}
/>,
);
diff --git a/src/components/containers/ChildSelector.tsx b/src/components/containers/ChildSelector.tsx
index 09d5ef5..5534231 100644
--- a/src/components/containers/ChildSelector.tsx
+++ b/src/components/containers/ChildSelector.tsx
@@ -1,7 +1,7 @@
import { TreeData } from "@/components/visualisation/treeView";
import { selectUnassigned } from "@/features/shipment/shipmentSlice";
-import { BaseShipmentItem, getCurrentStepIndex, steps } from "@/mappings/pages";
-import { ChildSelectorProps } from "@/types/generic";
+import { getCurrentStepIndex, steps } from "@/mappings/pages";
+import { ChildSelectorProps, ItemWithDetails } from "@/types/generic";
import {
Box,
Button,
@@ -32,9 +32,10 @@ import { useSelector } from "react-redux";
interface ChildItemDetailsProps {
childType: string;
- childData: TreeData;
+ childData: TreeData;
childId: number;
hasCheckbox?: boolean;
+ displayDetails?: boolean;
}
interface ChildItemDetailsFieldProps {
@@ -58,27 +59,23 @@ const ChildItemDetails = ({
childData,
childId,
hasCheckbox = false,
+ displayDetails,
}: ChildItemDetailsProps) => (
{childType}
{childData.name}
- {childType === "Grid" && (
+ {displayDetails && childData.data.displayDetails && (
-
-
-
-
-
-
+ {childData.data.displayDetails.map((item) => (
+
+ ))}
)}
@@ -92,6 +89,7 @@ const ChildItemDetails = ({
);
export const ChildSelector = ({
+ displayDetails,
selectedItem,
childrenType,
onSelect,
@@ -109,7 +107,7 @@ export const ChildSelector = ({
const [selectedItems, setSelectedItems] = useState([]);
const [isLoading, setIsLoading] = useState(false);
- const unassignedItems: TreeData[] | undefined | null = useMemo(() => {
+ const unassignedItems: TreeData[] | undefined | null = useMemo(() => {
if (selectableChildren) {
return selectableChildren;
}
@@ -209,6 +207,7 @@ export const ChildSelector = ({
childData={item}
childId={i}
hasCheckbox={true}
+ displayDetails={displayDetails}
/>
))}
@@ -220,6 +219,7 @@ export const ChildSelector = ({
childType={childrenTypeData.data.singular}
childData={item}
childId={i}
+ displayDetails={displayDetails}
/>
))}
diff --git a/src/components/containers/GridBox.tsx b/src/components/containers/GridBox.tsx
index 8bb8507..2124321 100644
--- a/src/components/containers/GridBox.tsx
+++ b/src/components/containers/GridBox.tsx
@@ -1,8 +1,8 @@
import { ChildSelector } from "@/components/containers/ChildSelector";
import { TreeData } from "@/components/visualisation/treeView";
-import { selectActiveItem } from "@/features/shipment/shipmentSlice";
+import { selectActiveItem, selectUnassigned } from "@/features/shipment/shipmentSlice";
import { PositionedItem } from "@/mappings/forms/sample";
-import { BaseShipmentItem } from "@/mappings/pages";
+import { BaseShipmentItem, getCurrentStepIndex } from "@/mappings/pages";
import { calcCircumferencePos } from "@/utils/generic";
import { Box, useDisclosure, Alert, AlertDescription, AlertIcon, VStack } from "@chakra-ui/react";
import { useCallback, useMemo, useState } from "react";
@@ -11,7 +11,7 @@ import { ContainerProps, useChildLocationManager } from ".";
import { GenericChildSlot } from "@/components/containers/child";
import { CrossShipmentSelector } from "@/components/containers/CrossShipmentSelector";
import Image from "next/image";
-import { ContainerItem } from "@/types/generic";
+import { ContainerItem, ItemDetails } from "@/types/generic";
const GRID_BOX_TYPES: Record = {
"1": [
@@ -61,6 +61,7 @@ export const GridBox = ({
containerSubType,
}: Omit) => {
const { isOpen, onOpen, onClose } = useDisclosure();
+ const unassigned = useSelector(selectUnassigned);
const currentGridBox = useSelector(selectActiveItem);
const [currentSample, setCurrentSample] = useState | null>(null);
const [currentPosition, setCurrentPosition] = useState(0);
@@ -86,6 +87,25 @@ export const GridBox = ({
return { samples: newSamples, sampleOverload };
}, [currentGridBox, containerSubType]);
+ const selectableSamples = useMemo(
+ () =>
+ unassigned[0].children![getCurrentStepIndex("Grid")].children?.map((grid) => ({
+ ...grid,
+ data: {
+ ...grid.data,
+ displayDetails: [
+ { label: "Concentration", value: grid.data.concentration, measurementUnit: "mg/ml" },
+ { label: "Buffer", value: grid.data.buffer },
+ { label: "Support Material", value: grid.data.supportMaterial },
+ { label: "Foil", value: grid.data.foil },
+ { label: "Mesh", value: grid.data.mesh },
+ { label: "Hole Diameter", value: grid.data.hole },
+ ] as ItemDetails[],
+ },
+ })),
+ [unassigned],
+ );
+
const setLocation = useChildLocationManager({
parentId,
parent: "containers",
@@ -143,6 +163,8 @@ export const GridBox = ({
))}
{parentType === "shipment" ? (
[]) => Promise;
+ onSelect?: (child: TreeData[]) => Promise;
}
export interface SingleChildSelectorProps extends BaseChildSelectorProps {
/** Enable multiple children to be selected */
acceptMultiple?: false;
/** Callback for item selection event */
- onSelect?: (child: TreeData) => Promise;
+ onSelect?: (child: TreeData) => Promise;
}
export interface BaseChildSelectorProps extends Omit {
@@ -41,7 +51,9 @@ export interface BaseChildSelectorProps extends Omit {
/** Disable editing controls */
readOnly?: boolean;
/** Selectable children. If not provided, unassigned items are used */
- selectableChildren?: TreeData[];
+ selectableChildren?: TreeData[];
+ /** Whether to display child details (data of passed children) underneath child name*/
+ displayDetails?: boolean;
}
export interface SessionParams {