@@ -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