Skip to content

Commit de4acb4

Browse files
authored
Merge pull request #214 from ELIXIR-NO/fix/dashboard/norm-atlas/year-sync
2 parents ab1974e + 2e9eb63 commit de4acb4

File tree

1 file changed

+86
-28
lines changed

1 file changed

+86
-28
lines changed

src/app/dashboards/norm-atlas/atlas.tsx

Lines changed: 86 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,13 @@ export default function Atlas({
7171
data: NormDataRecord[];
7272
geoData: GeoJson;
7373
}) {
74-
const [selectedMicrobe, setSelectedMicrobe] =
75-
useState<string>("Enterobacter");
76-
const [selectedAntibiotic, setSelectedAntibiotic] =
77-
useState<string>("Cefotaxim");
74+
const [selectedMicrobe, setSelectedMicrobe] = useState<string>();
75+
const [selectedAntibiotic, setSelectedAntibiotic] = useState<string>();
7876
const [selectedRegions, setSelectedRegions] = useState<string[]>(["Norge"]);
7977
const [selectedDataSet, setSelectedDataSet] = useState<
8078
"Blod" | "Sår" | "Urin" | "Luft"
8179
>("Blod");
82-
const [selectedYear, setSelectedYear] = useState<number>(2022);
80+
const [selectedYear, setSelectedYear] = useState<number>();
8381
const [hoveredRegion, setHoveredRegion] = useState<string[] | null>(null);
8482
const [chartCall, setChartCall] = useState<string>("");
8583

@@ -100,6 +98,53 @@ export default function Atlas({
10098
return Array.from(years).sort((a, b) => a - b);
10199
}, [filteredData, selectedMicrobe, selectedAntibiotic]);
102100

101+
useEffect(() => {
102+
if (availableYears.length > 0) {
103+
setSelectedYear(availableYears[availableYears.length - 1]);
104+
}
105+
}, [availableYears]);
106+
107+
useEffect(() => {
108+
if (filteredData.length === 0) return;
109+
110+
const microbes = Array.from(
111+
new Set(filteredData.map((r) => r.Mikrobe))
112+
).sort();
113+
114+
if (microbes.length === 0) return;
115+
116+
const firstMicrobe = microbes[0];
117+
118+
const antibioticsForMicrobe = Array.from(
119+
new Set(
120+
filteredData
121+
.filter((r) => r.Mikrobe === firstMicrobe)
122+
.map((r) => r.Antibiotika)
123+
)
124+
).sort();
125+
126+
const firstAntibiotic = antibioticsForMicrobe[0] ?? "";
127+
128+
const years = Array.from(
129+
new Set(
130+
filteredData
131+
.filter(
132+
(r) =>
133+
r.Mikrobe === firstMicrobe && r.Antibiotika === firstAntibiotic
134+
)
135+
.map((r) => parseInt(r.ProveAar))
136+
)
137+
).sort((a, b) => a - b);
138+
139+
const latestYear = years[years.length - 1] ?? 2022;
140+
141+
setSelectedMicrobe(firstMicrobe);
142+
setSelectedAntibiotic(firstAntibiotic);
143+
setSelectedYear(latestYear);
144+
}, [filteredData]);
145+
146+
if (!selectedMicrobe || !selectedAntibiotic || !selectedYear) return null;
147+
103148
const handleSelectionChange = (microbe: string, antibiotic: string) => {
104149
setSelectedMicrobe(microbe);
105150
setSelectedAntibiotic(antibiotic);
@@ -238,36 +283,49 @@ export function MicrobeSelector({
238283
onSelectionChange(microbe, antibiotic);
239284
};
240285

286+
const [openMicrobe, setOpenMicrobe] = useState<string | undefined>(
287+
selectedMicrobe
288+
);
289+
290+
useMemo(() => {
291+
setOpenMicrobe(selectedMicrobe);
292+
}, [selectedMicrobe]);
293+
241294
return (
242295
<ScrollArea className="h-[600px] rounded-md border p-4">
243-
<Accordion type="single" collapsible className="w-full">
296+
<Accordion
297+
type="single"
298+
collapsible
299+
className="w-full"
300+
value={openMicrobe}
301+
onValueChange={setOpenMicrobe}
302+
>
244303
{Object.entries(microbeAntibiotics)
245304
.sort()
246305
.map(([microbe, antibiotics]) => (
247306
<AccordionItem key={microbe} value={microbe}>
248-
<AccordionTrigger className="inline-flex items-center justify-between gap-2 rounded-md px-2 text-sm hover:bg-accent/50 hover:no-underline">
249-
<div className="flex items-center gap-2">
250-
<span>{microbe}</span>
251-
252-
<TooltipProvider>
253-
<Tooltip>
254-
<TooltipTrigger asChild>
255-
<div className="justify-self-end">
256-
<Info size={16} />
257-
</div>
258-
</TooltipTrigger>
259-
<TooltipContent side="right">
260-
{getDescription(microbe)}
261-
<TooltipArrow
262-
className="-my-px border-none fill-[var(--tooltip-color)] drop-shadow-[0_1px_0_white]"
263-
width={11}
264-
height={5}
265-
/>
266-
</TooltipContent>
267-
</Tooltip>
268-
</TooltipProvider>
269-
</div>
307+
<AccordionTrigger className="inline-flex items-center justify-start gap-2 rounded-md px-2 text-sm hover:bg-accent/50 hover:no-underline">
308+
<span>{microbe}</span>
309+
310+
<TooltipProvider>
311+
<Tooltip>
312+
<TooltipTrigger asChild>
313+
<div className="ml-auto">
314+
<Info size={16} />
315+
</div>
316+
</TooltipTrigger>
317+
<TooltipContent side="right">
318+
{getDescription(microbe)}
319+
<TooltipArrow
320+
className="-my-px border-none fill-[var(--tooltip-color)] drop-shadow-[0_1px_0_white]"
321+
width={11}
322+
height={5}
323+
/>
324+
</TooltipContent>
325+
</Tooltip>
326+
</TooltipProvider>
270327
</AccordionTrigger>
328+
271329
<AccordionContent>
272330
<div className="flex flex-col space-y-1">
273331
{antibiotics.map((antibiotic) => (

0 commit comments

Comments
 (0)