@@ -48,6 +48,7 @@ export default function ClassEnrollmentDetails() {
4848 const [ sortQuery , setSortQuery ] = useState < string > (
4949 FilterResidentNames [ 'Resident Name (A-Z)' ]
5050 ) ;
51+ const [ viewMode , setViewMode ] = useState < 'enrolled' | 'other' > ( 'enrolled' ) ;
5152 const [ filterStatus , setFilterStatus ] = useState < string > ( 'all' ) ;
5253 const [ page , setPage ] = useState ( 1 ) ;
5354 const [ perPage , setPerPage ] = useState ( 20 ) ;
@@ -58,19 +59,37 @@ export default function ClassEnrollmentDetails() {
5859 const confirmStateChangeModal = useRef < HTMLDialogElement > ( null ) ;
5960 const completionDetailsModal = useRef < HTMLDialogElement > ( null ) ;
6061 const reasonModalRef = useRef < HTMLDialogElement > ( null ) ;
61- const [ showOthers , setShowOthers ] = useState ( false ) ;
6262 const requiresReason = ( status ?: string ) =>
6363 [
6464 'incomplete: withdrawn' ,
6565 'incomplete: dropped' ,
6666 'incomplete: failed to complete'
6767 ] . includes ( status ?. toLowerCase ( ) ?? '' ) ;
6868
69+ const getStatusParam = ( ) => {
70+ if ( viewMode === 'enrolled' ) {
71+ return 'enrolled' ;
72+ }
73+ if ( filterStatus === 'all' || filterStatus === '' ) {
74+ return 'not_enrolled' ;
75+ }
76+ return filterStatus ;
77+ } ;
78+
79+ const status = getStatusParam ( ) ;
6980 const { data, error, isLoading, mutate } = useSWR <
7081 ServerResponseMany < ClassEnrollment > ,
7182 Error
7283 > (
73- `/api/program-classes/${ class_id } /enrollments?search=${ searchTerm } &page=${ page } &per_page=${ perPage } &order_by=${ sortQuery } &status=${ filterStatus } `
84+ `/api/program-classes/${ class_id } /enrollments?search=${ searchTerm } &page=${ page } &per_page=${ perPage } &order_by=${ sortQuery } &status=${ status } `
85+ ) ;
86+
87+ const otherStatus = viewMode === 'enrolled' ? 'not_enrolled' : 'enrolled' ;
88+ const { data : otherData } = useSWR <
89+ ServerResponseMany < ClassEnrollment > ,
90+ Error
91+ > (
92+ `/api/program-classes/${ class_id } /enrollments?per_page=1&status=${ otherStatus } `
7493 ) ;
7594 if ( error || redirect ) {
7695 navigate (
@@ -85,6 +104,22 @@ export default function ClassEnrollmentDetails() {
85104 const enrollments = data ?. data ?? [ ] ;
86105 const meta = data ?. meta ;
87106
107+ const enrolledCount =
108+ viewMode === 'enrolled'
109+ ? meta ?. total ?? 0
110+ : otherData ?. meta ?. total ?? 0 ;
111+ const otherCount =
112+ viewMode === 'enrolled'
113+ ? otherData ?. meta ?. total ?? 0
114+ : meta ?. total ?? 0 ;
115+
116+ const handleViewModeChange = ( mode : 'enrolled' | 'other' ) => {
117+ setViewMode ( mode ) ;
118+ setPage ( 1 ) ;
119+ setSelectedResidents ( [ ] ) ;
120+ setFilterStatus ( 'all' ) ;
121+ } ;
122+
88123 const handleChange = ( value : string , enrollment : ClassEnrollment ) => {
89124 setSelectedResidents ( [ ] ) ;
90125 setChangeStatusValue ( {
@@ -236,6 +271,28 @@ export default function ClassEnrollmentDetails() {
236271 < div className = "flex flex-col gap-8" >
237272 < div className = "flex flex-row justify-between items-center" >
238273 < div className = "flex flex-row gap-2 items-center" >
274+ < div className = "inline-flex rounded-md border border-grey-2 h-12" >
275+ < button
276+ onClick = { ( ) => handleViewModeChange ( 'enrolled' ) }
277+ className = { `px-4 text-sm font-medium transition-colors ${
278+ viewMode === 'enrolled'
279+ ? 'bg-teal-3 text-white hover:bg-teal-4'
280+ : 'bg-transparent text-body-text hover:bg-teal-1'
281+ } rounded-l-md`}
282+ >
283+ Enrolled ({ enrolledCount } )
284+ </ button >
285+ < button
286+ onClick = { ( ) => handleViewModeChange ( 'other' ) }
287+ className = { `px-4 text-sm font-medium transition-colors border-l border-grey-2 ${
288+ viewMode === 'other'
289+ ? 'bg-teal-3 text-white hover:bg-teal-4'
290+ : 'bg-transparent text-body-text hover:bg-teal-1'
291+ } rounded-r-md`}
292+ >
293+ Graduated/Other ({ otherCount } )
294+ </ button >
295+ </ div >
239296 < SearchBar
240297 searchTerm = { searchTerm }
241298 changeCallback = { ( term ) => {
@@ -256,24 +313,25 @@ export default function ClassEnrollmentDetails() {
256313 'Enrollment Date (Desc)' : 'start_dt desc'
257314 } }
258315 />
259- < DropdownControl
260- customCallback = { ( value ) => {
261- setFilterStatus ( value ) ;
262- setPage ( 1 ) ;
263- } }
264- enumType = { {
265- All : 'all' ,
266- Enrolled : 'enrolled' ,
267- Completed : 'completed' ,
268- Withdrawn : 'incomplete: withdrawn' ,
269- Dropped : 'incomplete: dropped' ,
270- 'Failed To Complete' :
271- 'incomplete: failed to complete' ,
272- Transferred : 'incomplete: transferred' ,
273- Segregated : 'incomplete: segregated' ,
274- Cancelled : 'incomplete: cancelled'
275- } }
276- />
316+ { viewMode === 'other' && (
317+ < DropdownControl
318+ customCallback = { ( value ) => {
319+ setFilterStatus ( value ) ;
320+ setPage ( 1 ) ;
321+ } }
322+ enumType = { {
323+ All : 'all' ,
324+ Completed : 'completed' ,
325+ Withdrawn : 'incomplete: withdrawn' ,
326+ Dropped : 'incomplete: dropped' ,
327+ 'Failed To Complete' :
328+ 'incomplete: failed to complete' ,
329+ Transferred : 'incomplete: transferred' ,
330+ Segregated : 'incomplete: segregated' ,
331+ Cancelled : 'cancelled'
332+ } }
333+ />
334+ ) }
277335 </ div >
278336 < div
279337 className = { `flex gap-2 ${ blockEdits ? 'tooltip tooltip-left' : '' } ` }
@@ -316,8 +374,7 @@ export default function ClassEnrollmentDetails() {
316374 isEditable = { isEditable }
317375 handleChange = { handleChange }
318376 handleShowCompletionDetails = { handleShowCompletionDetails }
319- showOthers = { showOthers }
320- setShowOthers = { setShowOthers }
377+ viewMode = { viewMode }
321378 classInfo = { clsInfo }
322379 onEnrollmentUpdate = { ( ) => void mutate ( ) }
323380 />
0 commit comments