Skip to content

Commit 0b25735

Browse files
committed
fix alterenate morho
fix profile in space switcher
1 parent f2bc99a commit 0b25735

File tree

6 files changed

+311
-301
lines changed

6 files changed

+311
-301
lines changed

src/api/entitycore/types/entities/circuit.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ export type SonataCircuitComponentConfig = {
132132
};
133133
synaptic_models_dir: string;
134134
templates_dir: string;
135+
alternate_morphologies?: Record<string, string>;
135136
};
136137

137138
export type ICircuitSonataConfiguration = {
Lines changed: 114 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { useEffect, useState } from 'react';
1+
import { useQuery } from '@tanstack/react-query';
22
import { useParams } from 'next/navigation';
33
import { match, P } from 'ts-pattern';
44
import { useSetAtom } from 'jotai';
5+
import { useEffect } from 'react';
56

67
import isString from 'lodash/isString';
78
import flatMap from 'lodash/flatMap';
@@ -10,171 +11,161 @@ import map from 'lodash/map';
1011
import get from 'lodash/get';
1112

1213
import { connectivityMetricsContentConfiguration } from '@/ui/segments/explore/circuit/elements/download-panel/content-configuration';
14+
import { NetworkConfigItem } from '@/ui/segments/explore/circuit/elements/download-panel/config-item';
15+
import { SkeletonItem } from '@/ui/segments/explore/circuit/elements/download-panel/skeleton';
16+
import { Error } from '@/ui/segments/explore/circuit/elements/download-panel/error';
1317
import {
1418
countConnectivityPaths,
1519
resolveCircuitConfigAndDirectory,
1620
updateFileCounterAtom,
1721
} from '@/ui/segments/explore/circuit/elements/download-panel/helpers';
18-
import { NetworkConfigItem } from '@/ui/segments/explore/circuit/elements/download-panel/config-item';
19-
import { SkeletonItem } from '@/ui/segments/explore/circuit/elements/download-panel/skeleton';
20-
import { Error } from '@/ui/segments/explore/circuit/elements/download-panel/error';
2122
import { AssetLabel } from '@/api/entitycore/types/shared/global';
2223
import { getAssetElement } from '@/api/entitycore/utils';
24+
import { keyBuilder } from '@/ui/use-query-keys/data';
2325

2426
import type { ConfigItemProps } from '@/ui/segments/explore/circuit/elements/download-panel/config-item';
25-
import type { DirectoryListContent } from '@/api/entitycore/types/shared/global';
2627
import type { WorkspaceContext } from '@/types/common';
2728
import type {
28-
ICircuit,
2929
CircuitConnectivityMatricesConfiguration,
30+
ICircuit,
3031
} from '@/api/entitycore/types/entities/circuit';
3132

3233
const AssetDefaultPath = 'matrix_config.json';
3334

3435
export default function ConnectivityMatrices({ circuit }: { circuit: ICircuit }) {
3536
const { virtualLabId, projectId } = useParams<WorkspaceContext>();
36-
const [connectivityMetrics, mutateConnectivityMetrics] = useState<{
37-
directory: DirectoryListContent['files'] | null;
38-
config: CircuitConnectivityMatricesConfiguration | null;
39-
loading: boolean;
40-
error?:
41-
| {
42-
directory: string | null;
43-
config: string | null;
44-
}
45-
| string
46-
| null;
47-
}>({
48-
directory: {},
49-
config: {},
50-
loading: false,
51-
error: null,
52-
});
37+
5338
const updateFileCounter = useSetAtom(updateFileCounterAtom(circuit.id));
5439
const assets = circuit?.assets;
5540
const configAsset = getAssetElement({
5641
assets,
5742
filter: (asset) => asset.label === AssetLabel.circuit_connectivity_matrices,
5843
});
5944

60-
useEffect(() => {
61-
const getConnectivityMetrics = async () => {
62-
mutateConnectivityMetrics({
63-
loading: true,
64-
directory: null,
65-
config: null,
66-
});
67-
if (circuit && configAsset?.id) {
68-
const result =
69-
await resolveCircuitConfigAndDirectory<CircuitConnectivityMatricesConfiguration>({
70-
entityId: circuit.id,
71-
assetId: configAsset.id,
72-
assetPath: AssetDefaultPath,
73-
context: { virtualLabId, projectId },
74-
});
45+
const connectivityMetrics = useQuery({
46+
queryKey: keyBuilder.circuitConfigAndDirectory({
47+
entityId: circuit.id,
48+
assetId: configAsset!.id,
49+
assetPath: AssetDefaultPath,
50+
context: { virtualLabId, projectId },
51+
}),
52+
queryFn: () =>
53+
resolveCircuitConfigAndDirectory<CircuitConnectivityMatricesConfiguration>({
54+
entityId: circuit.id,
55+
assetId: configAsset!.id,
56+
assetPath: AssetDefaultPath,
57+
context: { virtualLabId, projectId },
58+
}),
59+
enabled: !!circuit && !!configAsset!.id,
60+
select: (result) => {
61+
return {
62+
directory: result.directory,
63+
config: result.config,
64+
connectivity_metrics: countConnectivityPaths(result.config),
65+
error: result.error,
66+
};
67+
},
68+
});
7569

76-
mutateConnectivityMetrics({
77-
directory: result.directory,
78-
config: result.config,
79-
error: result.error,
80-
loading: false,
81-
});
82-
updateFileCounter({ connectivity_metrics: countConnectivityPaths(result.config) });
83-
} else {
84-
mutateConnectivityMetrics({
85-
directory: null,
86-
config: null,
87-
error: 'Could not find circuit connectivity matrices asset',
88-
loading: false,
89-
});
90-
}
91-
};
92-
getConnectivityMetrics();
93-
// eslint-disable-next-line react-hooks/exhaustive-deps
94-
}, [circuit?.id, configAsset?.id, virtualLabId, projectId]);
70+
useEffect(() => {
71+
updateFileCounter({
72+
connectivity_metrics: connectivityMetrics.data?.connectivity_metrics ?? 0,
73+
});
74+
}, [connectivityMetrics.data?.connectivity_metrics, updateFileCounter]);
9575

9676
return match(connectivityMetrics)
97-
.with({ loading: true }, () => <SkeletonItem />)
98-
.with({ error: P.string.select() }, () => {
99-
let err = '';
100-
if (isString(connectivityMetrics.error)) err = connectivityMetrics.error;
101-
else if (connectivityMetrics.error?.directory && connectivityMetrics.error?.config)
102-
err = 'Failed to load connectivity matrices configuration and directory assets';
103-
else if (connectivityMetrics.error?.directory) err = connectivityMetrics.error.directory;
104-
else if (connectivityMetrics.error?.config) err = connectivityMetrics.error.config;
105-
return (
106-
<Error
107-
icon={null}
108-
title="Connectivity matrices"
109-
description={err}
110-
cls={{ container: 'text-white' }}
111-
/>
112-
);
113-
})
114-
.with({ directory: P.nullish, config: P.nonNullable }, () => (
77+
.with({ isLoading: true }, () => <SkeletonItem />)
78+
.with(
79+
{ data: { error: P.string.select('error') }, error: P.select('catchError') },
80+
({ error }) => {
81+
let err = '';
82+
if (isString(connectivityMetrics.error)) err = connectivityMetrics.error;
83+
else if (error?.directory && error?.config)
84+
err = 'Failed to load connectivity matrices configuration and directory assets';
85+
else if (error?.directory) err = error.directory;
86+
else if (error?.config) err = error.config;
87+
return (
88+
<Error
89+
icon={null}
90+
title="Connectivity matrices"
91+
description={err}
92+
cls={{ container: 'text-white' }}
93+
/>
94+
);
95+
}
96+
)
97+
.with({ data: { directory: P.nullish, config: P.nonNullable } }, () => (
11598
<Error
11699
icon={null}
117100
title="Connectivity matrices"
118101
description="No assets directory was found"
119102
cls={{ container: 'text-white' }}
120103
/>
121104
))
122-
.with({ directory: P.nonNullable, config: P.nullish }, () => (
105+
.with({ data: { directory: P.nonNullable, config: P.nullish } }, () => (
123106
<Error
124107
icon={null}
125108
title="Connectivity matrices"
126109
description="No configuration asset was found"
127110
cls={{ container: 'text-white' }}
128111
/>
129112
))
130-
.with({ directory: P.nonNullable, config: P.nonNullable }, ({ directory, config }) => {
131-
const items = flatMap(config || {}, (group) =>
132-
map(group, ({ path, description }) => {
133-
const title = last(path.split('/'));
134-
const mimeType = last(title?.split('.'));
135-
const asset = {
136-
...get(directory, path, {
137-
name: null,
138-
size: null,
139-
last_modified: null,
140-
}),
141-
path,
142-
};
113+
.with(
114+
{
115+
data: {
116+
directory: P.nonNullable.select('directory'),
117+
config: P.nonNullable.select('config'),
118+
},
119+
},
120+
({ directory, config }) => {
121+
const items = flatMap(config || {}, (group) =>
122+
map(group, ({ path, description }) => {
123+
const title = last(path.split('/'));
124+
const mimeType = last(title?.split('.'));
125+
const asset = {
126+
...get(directory, path, {
127+
name: null,
128+
size: null,
129+
last_modified: null,
130+
}),
131+
path,
132+
};
143133

144-
return {
145-
asset,
146-
title,
147-
mimeType,
148-
description,
149-
subItems: null,
150-
};
151-
})
152-
);
153-
const fullConfig = Object.assign(connectivityMetricsContentConfiguration, {
154-
type: 'connectivity_metrics',
155-
showType: 'connectivity matrices',
156-
showPrefix: 'Local connectome',
157-
count: items.length,
158-
items,
159-
}) as unknown as Omit<ConfigItemProps, 'className'>;
134+
return {
135+
asset,
136+
title,
137+
mimeType,
138+
description,
139+
subItems: null,
140+
};
141+
})
142+
);
143+
const fullConfig = Object.assign(connectivityMetricsContentConfiguration, {
144+
type: 'connectivity_metrics',
145+
showType: 'connectivity matrices',
146+
showPrefix: 'Local connectome',
147+
count: items.length,
148+
items,
149+
}) as unknown as Omit<ConfigItemProps, 'className'>;
160150

161-
return (
162-
<NetworkConfigItem
163-
key={fullConfig.key}
164-
name={fullConfig.name}
165-
description={fullConfig.description}
166-
count={fullConfig.count}
167-
mimeType={fullConfig.mimeType}
168-
items={fullConfig.items}
169-
showType={fullConfig.showType}
170-
showPrefix={fullConfig.showPrefix}
171-
downloadConfig={{
172-
entityId: circuit?.id,
173-
assetConfigId: configAsset?.id!,
174-
context: { virtualLabId, projectId },
175-
}}
176-
/>
177-
);
178-
})
151+
return (
152+
<NetworkConfigItem
153+
key={fullConfig.key}
154+
name={fullConfig.name}
155+
description={fullConfig.description}
156+
count={fullConfig.count}
157+
mimeType={fullConfig.mimeType}
158+
items={fullConfig.items}
159+
showType={fullConfig.showType}
160+
showPrefix={fullConfig.showPrefix}
161+
downloadConfig={{
162+
entityId: circuit?.id,
163+
assetConfigId: configAsset?.id!,
164+
context: { virtualLabId, projectId },
165+
}}
166+
/>
167+
);
168+
}
169+
)
179170
.otherwise(() => null);
180171
}

src/ui/segments/explore/circuit/elements/download-panel/helpers.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import type { TCircuitContentConfigurationKeys } from '@/features/entities/circu
1919
import type { DirectoryListContent } from '@/api/entitycore/types/shared/global';
2020
import type {
2121
CircuitConnectivityMatricesConfiguration,
22+
SonataCircuitComponentConfig,
2223
SonataCircuitConfigNetworks,
2324
SonataCircuitNetworkEdgeConfigItem,
2425
SonataCircuitNetworkNodeConfigItem,
@@ -175,9 +176,10 @@ type PopulationWithMorphology = {
175176
};
176177

177178
export const extractWithAlternateMorphologies = (
178-
sections: Array<SonataCircuitNetworkNodeConfigItem>
179+
sections: Array<SonataCircuitNetworkNodeConfigItem>,
180+
components?: SonataCircuitComponentConfig | undefined
179181
): Record<string, PopulationWithMorphology> => {
180-
return sections
182+
let alternateMorpho = sections
181183
.flatMap((section) =>
182184
map(section.populations, (popValue, popName) => ({
183185
name: popName,
@@ -192,6 +194,20 @@ export const extractWithAlternateMorphologies = (
192194
};
193195
return acc;
194196
}, {});
197+
198+
if (Object.keys(alternateMorpho ?? {}).length <= 0) {
199+
alternateMorpho = Object.entries(components?.alternate_morphologies ?? {}).reduce(
200+
(acc, [key, value]) => {
201+
acc[key] = {
202+
type: key,
203+
alternate_morphologies: value,
204+
};
205+
return acc;
206+
},
207+
{} as Record<string, PopulationWithMorphology>
208+
);
209+
}
210+
return alternateMorpho;
195211
};
196212

197213
export async function resolveCircuitConfigAndDirectory<T>({

0 commit comments

Comments
 (0)