1- import React from 'react' ;
1+ import React , { useState , useEffect } from 'react' ;
22import { Accordion , AccordionItem } from '@carbon/react' ;
33import { useTranslation } from 'react-i18next' ;
44import * as styles from './styles/Diagnoses.module.scss' ;
@@ -12,6 +12,38 @@ import { DiagnosesByDate } from '@/types/diagnosis';
1212const DiagnosesControl : React . FC = ( ) => {
1313 const { t } = useTranslation ( ) ;
1414 const { diagnosesByDate, isLoading, isError } = useDiagnoses ( ) ;
15+ const [ expandedItems , setExpandedItems ] = useState < Set < string > > ( new Set ( ) ) ;
16+ const [ isMainAccordionExpanded , setIsMainAccordionExpanded ] = useState ( true ) ;
17+
18+ // Set the last two visits (first two date groups) to be expanded by default
19+ useEffect ( ( ) => {
20+ if ( diagnosesByDate . length > 0 ) {
21+ const lastTwoVisits = new Set < string > ( ) ;
22+
23+ // Add the first two date groups (most recent visits) to expanded set
24+ for ( let i = 0 ; i < Math . min ( 2 , diagnosesByDate . length ) ; i ++ ) {
25+ lastTwoVisits . add ( diagnosesByDate [ i ] . rawDate ) ;
26+ }
27+
28+ setExpandedItems ( lastTwoVisits ) ;
29+ }
30+ } , [ diagnosesByDate ] ) ;
31+
32+ const handleAccordionChange = ( rawDate : string ) => {
33+ setExpandedItems ( prev => {
34+ const newSet = new Set ( prev ) ;
35+ if ( newSet . has ( rawDate ) ) {
36+ newSet . delete ( rawDate ) ;
37+ } else {
38+ newSet . add ( rawDate ) ;
39+ }
40+ return newSet ;
41+ } ) ;
42+ } ;
43+
44+ const handleMainAccordionChange = ( ) => {
45+ setIsMainAccordionExpanded ( prev => ! prev ) ;
46+ } ;
1547
1648 if ( isLoading && diagnosesByDate . length === 0 ) {
1749 return < div > { t ( 'DIAGNOSES_LOADING' ) } </ div > ;
@@ -21,39 +53,49 @@ const DiagnosesControl: React.FC = () => {
2153 return < div > { t ( 'DIAGNOSES_ERROR_LOADING' ) } </ div > ;
2254 }
2355
24- if ( ! isLoading && diagnosesByDate . length === 0 ) {
25- return < div className = { styles . noData } > { t ( 'DIAGNOSES_NO_DIAGNOSES' ) } </ div > ;
26- }
27-
2856 return (
2957 < section className = { styles . diagnosesWrapper } data-testid = "diagnoses-control" >
3058 < Accordion >
31- < AccordionItem title = { t ( 'DIAGNOSES_FORM_TITLE' ) } className = { styles . accordionItem } >
32- { /* Table Header */ }
33- < div className = { styles . tableHeader } >
34- < div className = { styles . diagnosesColumn } > Diagnoses</ div >
35- < div className = { styles . recordedByColumn } > Recorded by</ div >
36- </ div >
37-
38- { /* Date Groups */ }
39- < Accordion align = "start" size = "lg" >
40- { diagnosesByDate . map ( ( dateGroup : DiagnosesByDate ) => (
41- < AccordionItem
42- key = { dateGroup . rawDate }
43- className = { styles . accordionItem }
44- title = { dateGroup . date }
45- >
46- < div >
47- { dateGroup . diagnoses . map ( ( diagnosis , diagnosisIndex ) => (
48- < DiagnosisItem
49- key = { diagnosis . id || diagnosisIndex }
50- diagnosis = { diagnosis }
51- />
52- ) ) }
53- </ div >
54- </ AccordionItem >
55- ) ) }
56- </ Accordion >
59+ < AccordionItem
60+ title = { t ( 'DIAGNOSES_FORM_TITLE' ) }
61+ className = { styles . accordionItem }
62+ open = { isMainAccordionExpanded }
63+ onHeadingClick = { handleMainAccordionChange }
64+ >
65+ { ! isLoading && diagnosesByDate . length === 0 ? (
66+ // Show no data message inside the accordion when there are no diagnoses
67+ < div className = { styles . noData } > { t ( 'DIAGNOSES_NO_DIAGNOSES' ) } </ div >
68+ ) : (
69+ < >
70+ { /* Table Header */ }
71+ < div className = { styles . tableHeader } >
72+ < div className = { styles . diagnosesColumn } > Diagnoses</ div >
73+ < div className = { styles . recordedByColumn } > Recorded by</ div >
74+ </ div >
75+
76+ { /* Date Groups */ }
77+ < Accordion align = "start" size = "lg" >
78+ { diagnosesByDate . map ( ( dateGroup : DiagnosesByDate ) => (
79+ < AccordionItem
80+ key = { dateGroup . rawDate }
81+ className = { styles . accordionItem }
82+ title = { dateGroup . date }
83+ open = { expandedItems . has ( dateGroup . rawDate ) }
84+ onHeadingClick = { ( ) => handleAccordionChange ( dateGroup . rawDate ) }
85+ >
86+ < div >
87+ { dateGroup . diagnoses . map ( ( diagnosis , diagnosisIndex ) => (
88+ < DiagnosisItem
89+ key = { diagnosis . id || diagnosisIndex }
90+ diagnosis = { diagnosis }
91+ />
92+ ) ) }
93+ </ div >
94+ </ AccordionItem >
95+ ) ) }
96+ </ Accordion >
97+ </ >
98+ ) }
5799 </ AccordionItem >
58100 </ Accordion >
59101 </ section >
0 commit comments