1- import { Close , Edit , EditNote , FileCopy , Save } from '@mui/icons-material' ;
1+ import { Close , Edit , EditNote , FileCopy , Star , Save } from '@mui/icons-material' ;
22import {
33 Button ,
44 Dialog ,
@@ -81,12 +81,19 @@ const TimetableTabContextMenu: React.FC<TimetableTabContextMenuProps> = ({ ancho
8181 // Handler for deleting a timetable
8282 const handleDeleteTimetable = ( targetIndex : number ) => {
8383 if ( displayTimetables [ term ] . length > 1 ) {
84+ if ( displayTimetables [ term ] . findIndex ( ( t : TimetableData , index : number ) => t . isPrimary ) === targetIndex ) {
85+ setAlertMsg ( 'You cannot delete the primary timetable.' ) ;
86+ setErrorVisibility ( true ) ;
87+ return ;
88+ }
89+
8490 prevTimetables = {
8591 selected : selectedTimetable ,
8692 timetables : displayTimetables [ term ] . map ( ( timetable : TimetableData ) => {
8793 return {
8894 name : timetable . name ,
8995 id : timetable . id ,
96+ isPrimary : timetable . isPrimary ,
9097 selectedCourses : timetable . selectedCourses ,
9198 selectedClasses : duplicateClasses ( timetable . selectedClasses ) ,
9299 createdEvents : timetable . createdEvents ,
@@ -99,7 +106,7 @@ const TimetableTabContextMenu: React.FC<TimetableTabContextMenuProps> = ({ ancho
99106
100107 const newDisplayTimetables = {
101108 ...displayTimetables ,
102- [ term ] : displayTimetables [ term ] . filter ( ( timetable : TimetableData , index : number ) => index !== targetIndex ) ,
109+ [ term ] : displayTimetables [ term ] . filter ( ( _ : TimetableData , index : number ) => index !== targetIndex ) ,
103110 } ;
104111 // Updating the timetables state to the new timetable index
105112 setDisplayTimetables ( newDisplayTimetables ) ;
@@ -128,7 +135,7 @@ const TimetableTabContextMenu: React.FC<TimetableTabContextMenuProps> = ({ ancho
128135 return ;
129136 } ) ;
130137 } else {
131- setAlertMsg ( 'Must have at least 1 timetable' ) ;
138+ setAlertMsg ( 'Must have at least 1 timetable. ' ) ;
132139 setErrorVisibility ( true ) ;
133140 }
134141 } ;
@@ -183,6 +190,7 @@ const TimetableTabContextMenu: React.FC<TimetableTabContextMenuProps> = ({ ancho
183190 const handleDuplicateTimetable = ( ) => {
184191 if ( displayTimetables [ term ] . length >= TIMETABLE_LIMIT ) {
185192 setAlertMsg ( 'Maximum timetables reached' ) ;
193+
186194 setErrorVisibility ( true ) ;
187195 } else {
188196 const currentTimetable = displayTimetables [ term ] [ selectedTimetable ] ;
@@ -215,6 +223,24 @@ const TimetableTabContextMenu: React.FC<TimetableTabContextMenuProps> = ({ ancho
215223 }
216224 } ;
217225
226+ const handleSetPrimary = ( ) => {
227+ if ( displayTimetables [ term ] . findIndex ( ( t : TimetableData , _ : number ) => t . isPrimary ) === selectedTimetable ) {
228+ return ;
229+ }
230+ displayTimetables [ term ] . forEach ( ( e ) => {
231+ e . isPrimary = false ;
232+ } ) ;
233+ displayTimetables [ term ] [ selectedTimetable ] . isPrimary = true ;
234+ storage . set ( 'timetables' , displayTimetables ) ;
235+ handleMenuClose ( ) ;
236+ } ;
237+
238+ const isPrimarySelected = ( ) => {
239+ return displayTimetables [ term ] !== undefined
240+ ? displayTimetables [ term ] . findIndex ( ( t : TimetableData , _ : number ) => t . isPrimary ) === selectedTimetable
241+ : false ;
242+ } ;
243+
218244 /**
219245 * Menu shortcut (hotkey) event listeners
220246 */
@@ -330,6 +356,14 @@ const TimetableTabContextMenu: React.FC<TimetableTabContextMenuProps> = ({ ancho
330356 onClose = { handleMenuClose }
331357 autoFocus = { false }
332358 >
359+ < Tooltip title = { isPrimarySelected ( ) ? 'This timetable is already primary' : '' } >
360+ < MenuItem onClick = { handleSetPrimary } sx = { { opacity : isPrimarySelected ( ) ? 0.5 : 1 } } >
361+ < ListItemIcon >
362+ < Star fontSize = "small" />
363+ </ ListItemIcon >
364+ < ListItemText > Set as primary</ ListItemText >
365+ </ MenuItem >
366+ </ Tooltip >
333367 < MenuItem onClick = { handleRenameOpen } >
334368 < ListItemIcon >
335369 < Edit fontSize = "small" />
0 commit comments