@@ -112,7 +112,7 @@ const GradingSection = ({ subsectionId, onChange }: SubProps) => {
112112 < Form . Control
113113 as = "select"
114114 defaultValue = { itemData ?. format }
115- onChange = { ( e ) => setLocalState ( { ...localState , graderType : e . target . value } ) }
115+ onChange = { ( e ) => setLocalState ( ( prev ) => ( { ...prev , graderType : e . target . value } ) ) }
116116 data-testid = "grader-type-select"
117117 >
118118 < option key = "notgraded" value = "notgraded" >
@@ -129,15 +129,15 @@ const GradingSection = ({ subsectionId, onChange }: SubProps) => {
129129 value = { localState ?. dueDate }
130130 label = { intl . formatMessage ( messages . subsectionGradingDueDateLabel ) }
131131 controlName = "state-date"
132- onChange = { ( val ) => setLocalState ( { ...localState , dueDate : val } ) }
132+ onChange = { ( val ) => setLocalState ( ( prev ) => ( { ...prev , dueDate : val } ) ) }
133133 data-testid = "due-date-picker"
134134 />
135135 < DatepickerControl
136136 type = { DATEPICKER_TYPES . time }
137137 value = { localState ?. dueDate }
138138 label = { intl . formatMessage ( messages . subsectionGradingDueTimeLabel ) }
139139 controlName = "start-time"
140- onChange = { ( val ) => setLocalState ( { ...localState , dueDate : val } ) }
140+ onChange = { ( val ) => setLocalState ( ( prev ) => ( { ...prev , dueDate : val } ) ) }
141141 />
142142 </ Stack >
143143 }
@@ -163,29 +163,29 @@ const VisibilitySection = ({ subsectionId, onChange }: SubProps) => {
163163 < ButtonGroup toggle >
164164 < Button
165165 variant = { localState ?. isVisibleToStaffOnly ? 'outline-primary' : 'primary' }
166- onClick = { ( ) => setLocalState ( { ...localState , isVisibleToStaffOnly : false } ) }
166+ onClick = { ( ) => setLocalState ( ( prev ) => ( { ...prev , isVisibleToStaffOnly : false } ) ) }
167167 >
168168 < FormattedMessage { ...messages . subsectionVisibilityStudentVisible } />
169169 </ Button >
170170 < Button
171171 variant = { localState ?. isVisibleToStaffOnly ? 'primary' : 'outline-primary' }
172- onClick = { ( ) => setLocalState ( {
173- ...localState ,
172+ onClick = { ( ) => setLocalState ( ( prev ) => ( {
173+ ...prev ,
174174 isVisibleToStaffOnly : true ,
175175 hideAfterDue : false ,
176- } ) }
176+ } ) ) }
177177 >
178178 < FormattedMessage { ...messages . subsectionVisibilityStaffOnly } />
179179 </ Button >
180180 </ ButtonGroup >
181181 { ! localState ?. isVisibleToStaffOnly && < Form . Checkbox
182182 checked = { localState ?. hideAfterDue }
183183 className = "mt-2"
184- onChange = { ( e ) => setLocalState ( {
185- ...localState ,
184+ onChange = { ( e ) => setLocalState ( ( prev ) => ( {
185+ ...prev ,
186186 hideAfterDue : e . target . checked ,
187187 isVisibleToStaffOnly : false ,
188- } ) }
188+ } ) ) }
189189 >
190190 < FormattedMessage { ...messages . subsectionVisibilityHideAfterDueLabel } />
191191 </ Form . Checkbox > }
@@ -243,30 +243,35 @@ const SpecialExamSection = ({ subsectionId, onChange }: SubProps) => {
243243 const enableProctoredExams = useSelector ( getProctoredExamsFlag ) ;
244244 const [ localState , setLocalState ] = useStateWithCallback < Partial < ConfigureSubsectionData > > (
245245 {
246- showCorrectness : itemData ?. showCorrectness ,
246+ isProctoredExam : itemData ?. isProctoredExam ,
247+ isTimeLimited : itemData ?. isTimeLimited ,
248+ isOnboardingExam : itemData ?. isOnboardingExam ,
249+ isPracticeExam : itemData ?. isPracticeExam ,
250+ defaultTimeLimitMinutes : itemData ?. defaultTimeLimitMinutes ,
251+ examReviewRules : itemData ?. examReviewRules ,
247252 } ,
248- ( val ) => onChange ( val || { } )
253+ ( val ) => onChange ( val || { } ) ,
249254 ) ;
250255
251256 const setFieldValue = ( key : keyof ConfigureSubsectionData , value : any ) => {
252- setLocalState ( {
253- ...localState ,
257+ setLocalState ( ( prev ) => ( {
258+ ...prev ,
254259 [ key ] : value ,
255- } )
256- }
260+ } ) ) ;
261+ } ;
257262
258263 return (
259264 < SidebarSection
260265 title = { intl . formatMessage ( messages . subsectionSpecialExamTitle ) }
261266 >
262267 < AdvancedTab
263268 values = { {
264- isProctoredExam : itemData ?. isProctoredExam ,
265- isTimeLimited : itemData ?. isTimeLimited ,
266- isOnboardingExam : itemData ?. isOnboardingExam ,
267- isPracticeExam : itemData ?. isPracticeExam ,
268- defaultTimeLimitMinutes : itemData ?. defaultTimeLimitMinutes ,
269- examReviewRules : itemData ?. examReviewRules ,
269+ isProctoredExam : localState ?. isProctoredExam ,
270+ isTimeLimited : localState ?. isTimeLimited ,
271+ isOnboardingExam : localState ?. isOnboardingExam ,
272+ isPracticeExam : localState ?. isPracticeExam ,
273+ defaultTimeLimitMinutes : localState ?. defaultTimeLimitMinutes ,
274+ examReviewRules : localState ?. examReviewRules ,
270275 } }
271276 setFieldValue = { setFieldValue }
272277 prereqs = { itemData ?. prereqs }
@@ -278,6 +283,8 @@ const SpecialExamSection = ({ subsectionId, onChange }: SubProps) => {
278283 showReviewRules = { itemData ?. showReviewRules }
279284 wasProctoredExam = { itemData ?. isProctoredExam }
280285 onlineProctoringRules = { itemData ?. onlineProctoringRules }
286+ hideTitle
287+ useBtnGroup
281288 />
282289 </ SidebarSection >
283290 ) ;
@@ -306,7 +313,7 @@ export const SubsectionSettings = ({ subsectionId }: Props) => {
306313 isOnboardingExam : itemData . isOnboardingExam ,
307314 isPracticeExam : itemData . isPracticeExam ,
308315 examReviewRules : itemData . examReviewRules ,
309- defaultTimeLimitMin : itemData . defaultTimeLimitMinutes ,
316+ defaultTimeLimitMinutes : itemData . defaultTimeLimitMinutes ,
310317 hideAfterDue : itemData . hideAfterDue === undefined ? false : itemData . hideAfterDue ,
311318 showCorrectness : itemData . showCorrectness ,
312319 isPrereq : itemData . isPrereq ,
0 commit comments