diff --git a/applications/visualizer/frontend/src/components/ViewerContainer/CustomListItem.tsx b/applications/visualizer/frontend/src/components/ViewerContainer/CustomListItem.tsx
index 8f470fe9..d1220264 100644
--- a/applications/visualizer/frontend/src/components/ViewerContainer/CustomListItem.tsx
+++ b/applications/visualizer/frontend/src/components/ViewerContainer/CustomListItem.tsx
@@ -1,7 +1,6 @@
import { Add as AddIcon, DeleteOutlined as DeleteOutlinedIcon, HelpOutline as HelpOutlineIcon } from "@mui/icons-material";
import { Box, FormControlLabel, IconButton, Stack, Tooltip, Typography } from "@mui/material";
import { useState } from "react";
-import { ViewerType, type Workspace } from "../../models";
import { vars } from "../../theme/variables.ts";
import CustomSwitch from "./CustomSwitch";
import PickerWrapper from "./PickerWrapper";
@@ -14,6 +13,7 @@ interface CustomListItemProps {
checked: boolean;
helpText?: string;
description?: string;
+ color?: string;
};
showTooltip?: boolean;
listType: string;
@@ -21,7 +21,7 @@ interface CustomListItemProps {
onSwitchChange?: (id: string, checked: boolean) => void;
onDelete?: (id: string) => void;
deleteTooltipTitle?: string;
- workspace?: Workspace;
+ onColorChange?: (id: string, color: string) => void;
}
const CustomListItem = ({
data,
@@ -31,11 +31,11 @@ const CustomListItem = ({
onSwitchChange,
onDelete,
deleteTooltipTitle,
- workspace,
+ onColorChange,
}: CustomListItemProps) => {
const [anchorEl, setAnchorEl] = useState(null);
const [open, setOpen] = useState(false);
- const [selectedColor, setSelectedColor] = useState("#9FEE9A");
+ const [selectedColor, setSelectedColor] = useState(data.color);
const [itemHovered, setItemHovered] = useState(false);
const isNeurons = listType === "neurons";
@@ -58,9 +58,8 @@ const CustomListItem = ({
};
const handleColorChange = (color) => {
- const hexColor = color.hex;
- setSelectedColor(hexColor);
- workspace.changeNeuronColorForViewers(data.id, hexColor, [ViewerType.ThreeD, ViewerType.EM]);
+ setSelectedColor(color.hex);
+ onColorChange(data.id, color);
};
const handleOnMouseEnter = () => {
diff --git a/applications/visualizer/frontend/src/components/ViewerContainer/Neurons.tsx b/applications/visualizer/frontend/src/components/ViewerContainer/Neurons.tsx
index c428c0b5..a4c5a1ec 100644
--- a/applications/visualizer/frontend/src/components/ViewerContainer/Neurons.tsx
+++ b/applications/visualizer/frontend/src/components/ViewerContainer/Neurons.tsx
@@ -3,7 +3,7 @@ import { Box, IconButton, Stack, Typography } from "@mui/material";
import Tooltip from "@mui/material/Tooltip";
import { useState } from "react";
import { useGlobalContext } from "../../contexts/GlobalContext.tsx";
-import { type ViewerData, Visibility } from "../../models/models.ts";
+import { type ViewerData, ViewerType, Visibility } from "../../models/models.ts";
import type { Neuron } from "../../rest";
import { vars } from "../../theme/variables.ts";
import CustomEntitiesDropdown from "./CustomEntitiesDropdown.tsx";
@@ -15,6 +15,12 @@ const mapToListItem = (neuron: string, visibility: ViewerData) => ({
label: neuron,
checked: Object.values(visibility).every((e) => e === undefined || e.visibility === Visibility.Visible),
});
+const mapNeuronsToListItem = (neuron: string, visibility: ViewerData) => ({
+ id: neuron,
+ label: neuron,
+ checked: Object.values(visibility).every((e) => e === undefined || e.visibility === Visibility.Visible),
+ color: visibility[ViewerType.ThreeD]?.color || visibility[ViewerType.EM]?.color || "#000000",
+});
const neuronToOption = (neuron: Neuron) => ({
id: neuron.name,
@@ -59,6 +65,9 @@ const Neurons = ({ children }) => {
);
setNeurons(filteredNeurons);
};
+ const handleColorChange = (neuronId, color) => {
+ currentWorkspace.changeNeuronColorForViewers(neuronId, color.hex);
+ };
const autoCompleteOptions = Object.values(neurons)
.map((neuron: Neuron) => neuronToOption(neuron))
@@ -116,14 +125,14 @@ const Neurons = ({ children }) => {
{Array.from(activeNeurons).map((neuronId) => (
))}
@@ -151,7 +160,7 @@ const Neurons = ({ children }) => {
onSwitchChange={handleSwitchChange}
onDelete={() => console.log("delete")}
deleteTooltipTitle="Remove group from the workspace"
- workspace={currentWorkspace}
+ onColorChange={handleColorChange}
/>
))}
diff --git a/applications/visualizer/frontend/src/models/workspace.ts b/applications/visualizer/frontend/src/models/workspace.ts
index 773b7d2a..c9edbd42 100644
--- a/applications/visualizer/frontend/src/models/workspace.ts
+++ b/applications/visualizer/frontend/src/models/workspace.ts
@@ -258,15 +258,11 @@ export class Workspace {
return Array.from(this.activeNeurons).filter((neuronId) => this.visibilities[neuronId]?.[ViewerType.ThreeD]?.visibility === Visibility.Visible);
}
- changeNeuronColorForViewers(neuronId: string, color: string, viewerTypes: ViewerType[] = [ViewerType.ThreeD, ViewerType.EM]): void {
- const unsupportedTypes = viewerTypes.filter((type) => type !== ViewerType.ThreeD && type !== ViewerType.EM);
-
- if (unsupportedTypes.length > 0) {
- throw new Error(`Unsupported viewer types: ${unsupportedTypes.join(", ")}`);
- }
+ changeNeuronColorForViewers(neuronId: string, color: string): void {
+ const viewers: ViewerType[] = [ViewerType.ThreeD, ViewerType.EM];
const updated = produce(this, (draft: Workspace) => {
- viewerTypes.forEach((viewerType) => {
+ viewers.forEach((viewerType) => {
if (viewerType in draft.visibilities[neuronId]) {
draft.visibilities[neuronId][viewerType].color = color;
}