@@ -27,6 +27,7 @@ import { Session } from '../../../session-store';
2727import { useAuthOptionalLogin } from '../../../auth/auth_utils' ;
2828
2929import ReviewModal from './ReviewModal' ;
30+ import CourseEval from './CourseEval' ;
3031
3132enum PageStatus {
3233 Loading ,
@@ -43,6 +44,7 @@ export const Course = () => {
4344 const [ similarCourses , setSimilarCourses ] = useState < Recommendation [ ] > ( ) ;
4445 const [ pageStatus , setPageStatus ] = useState < PageStatus > ( PageStatus . Loading ) ;
4546 const [ scrolled , setScrolled ] = useState ( false ) ;
47+ const [ reviewTabSelected , setReviewTabSelected ] = useState ( true ) ;
4648 const [ screenWidth , setScreenWidth ] = useState ( window . innerWidth ) ;
4749 const [ visibleCourseReviews , setVisibleCourseReviews ] = useState < Review [ ] > (
4850 [ ]
@@ -321,73 +323,98 @@ export const Course = () => {
321323 />
322324 </ div >
323325 < div className = { styles . rightPanel } >
324- < div className = { styles . reviewscontainer } >
325- < div className = { styles . bar } >
326- < h2 className = { styles . title } >
327- Past Reviews ({ visibleCourseReviews . length } ){ ' ' }
328- </ h2 >
329- < div >
330- < div className = { styles [ 'select-container' ] } >
331- < div className = { styles [ 'filter-container' ] } >
332- < label
333- htmlFor = "sort-reviews"
334- style = { { whiteSpace : 'nowrap' } }
335- >
336- Sort by:{ ' ' }
337- </ label >
338- < select
339- name = "sort-reviews"
340- id = "sort-reviews"
341- onChange = { sortReviewsBy }
342- className = { styles . filtertext }
343- >
344- < option value = "helpful" > Most Helpful</ option >
345- < option value = "recent" > Recent</ option >
346- { selectedProf . current === 'none' && (
347- < option value = "professor" > Professor Name</ option >
348- ) }
349- </ select >
350- </ div >
351- < div className = { styles . filterContainer } >
352- < label
353- htmlFor = "filter-by-prof"
354- style = { { whiteSpace : 'nowrap' } }
355- >
356- Filter by professor:{ ' ' }
357- </ label >
358- < select
359- name = "filter-by-prof"
360- id = "filter-by-prof"
361- onChange = { filterByProf }
362- className = { styles . filtertext }
363- >
364- < option value = "none" > None</ option >
365- { [ ...pastProfs . current ]
366- . sort ( )
367- ?. filter ( ( o ) => o !== 'Not Listed' )
368- . map ( ( o ) => < option value = { o } > { o } </ option > ) }
369- </ select >
326+ { /* Custom Tab Component Structure */ }
327+ < div className = { styles . tabs } >
328+ < button
329+ className = { reviewTabSelected ? styles . tabactivetitle : styles . tabtitle }
330+ onClick = { ( ) => setReviewTabSelected ( true ) }
331+ >
332+ Past Reviews ({ visibleCourseReviews . length } )
333+ </ button >
334+ { courseEval !== null && (
335+ < button
336+ className = { reviewTabSelected ? styles . tabtitle : styles . tabactivetitle }
337+ onClick = { ( ) => setReviewTabSelected ( false ) }
338+ >
339+ Course Evaluation Data
340+ </ button >
341+ ) }
342+
343+ { /* Add a gray background line spanning the full width */ }
344+ < div className = { styles . tabIndicator } > </ div >
345+
346+ { /* Add a blue active indicator that moves */ }
347+ < div className = { `${ courseEval != null ? styles . activeIndicator : styles . noEvalsIndicator } ${ reviewTabSelected ? styles . firstTab : styles . secondTab } ` } > </ div >
348+ </ div >
349+ { reviewTabSelected && (
350+ < div className = { styles . reviewscontainer } >
351+ < div className = { styles . bar } >
352+ < div >
353+ < div className = { styles [ 'select-container' ] } >
354+ < div className = { styles [ 'filter-container' ] } >
355+ < label
356+ htmlFor = "sort-reviews"
357+ style = { { whiteSpace : 'nowrap' } }
358+ >
359+ Sort by:{ ' ' }
360+ </ label >
361+ < select
362+ name = "sort-reviews"
363+ id = "sort-reviews"
364+ onChange = { sortReviewsBy }
365+ className = { styles . filtertext }
366+ >
367+ < option value = "helpful" > Most Helpful</ option >
368+ < option value = "recent" > Recent</ option >
369+ { selectedProf . current === 'none' && (
370+ < option value = "professor" > Professor Name</ option >
371+ ) }
372+ </ select >
373+ </ div >
374+ < div className = { styles . filterContainer } >
375+ < label
376+ htmlFor = "filter-by-prof"
377+ style = { { whiteSpace : 'nowrap' } }
378+ >
379+ Filter by professor:{ ' ' }
380+ </ label >
381+ < select
382+ name = "filter-by-prof"
383+ id = "filter-by-prof"
384+ onChange = { filterByProf }
385+ className = { styles . filtertext }
386+ >
387+ < option value = "none" > None</ option >
388+ { [ ...pastProfs . current ]
389+ . sort ( )
390+ ?. filter ( ( o ) => o !== 'Not Listed' )
391+ . map ( ( o ) => < option value = { o } > { o } </ option > ) }
392+ </ select >
393+ </ div >
370394 </ div >
371395 </ div >
372396 </ div >
373- </ div >
374- < div className = { styles . reviews } >
375- < CourseReviews
376- reviews = { visibleCourseReviews }
377- isPreview = { false }
378- isProfile = { false }
379- token = { token }
380- />
381- </ div >
382- </ div >
397+ < div className = { styles . reviews } >
398+ < CourseReviews
399+ reviews = { visibleCourseReviews }
400+ isPreview = { false }
401+ isProfile = { false }
402+ token = { token }
403+ />
404+ </ div >
405+ </ div > ) }
406+ { ! reviewTabSelected && courseEval != null && (
407+ < CourseEval courseEval = { courseEval } />
408+ ) }
383409 < SimilarCoursesSection
384410 similarCourses = { similarCourses }
385411 isVisible = { screenWidth <= 768 }
386412 />
387413 </ div >
388414 </ div >
389415
390- { /* Fixed Bottom-Right Review Button */ }
416+ { /* Fixed Bottom-Right Review Button */
417+ }
391418 < button
392419 className = { `${ ! scrolled && styles . hide } ${ styles . fixedreviewbutton } ` }
393420 onClick = { ( ) => setOpen ( true ) }
@@ -404,7 +431,8 @@ export const Course = () => {
404431 }
405432 />
406433 </ div >
407- ) ;
434+ )
435+ ;
408436 }
409437
410438 return < Loading /> ;
0 commit comments