Skip to content

Commit d7982de

Browse files
committed
fixup! feat: subsection settings
1 parent 35e8675 commit d7982de

7 files changed

Lines changed: 302 additions & 133 deletions

File tree

src/course-outline/data/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ export async function configureCourseSubsection(variables: ConfigureSubsectionDa
258258
is_time_limited: variables.isTimeLimited,
259259
is_proctored_enabled: variables.isProctoredExam || variables.isPracticeExam || variables.isOnboardingExam,
260260
exam_review_rules: variables.examReviewRules,
261-
default_time_limit_minutes: variables.defaultTimeLimitMin,
261+
default_time_limit_minutes: variables.defaultTimeLimitMinutes,
262262
is_onboarding_exam: variables.isOnboardingExam,
263263
start: variables.releaseDate,
264264
},

src/course-outline/data/slice.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ const slice = createSlice({
5858
state.outlineIndexData = payload;
5959
state.sectionsList = payload.courseStructure?.childInfo?.children || [];
6060
state.isCustomRelativeDatesActive = payload.isCustomRelativeDatesActive;
61-
state.enableProctoredExams = payload.courseStructure?.enableProctoredExams;
62-
state.enableTimedExams = payload.courseStructure?.enableTimedExams;
61+
state.enableProctoredExams = true || payload.courseStructure?.enableProctoredExams;
62+
state.enableTimedExams = true || payload.courseStructure?.enableTimedExams;
6363
state.createdOn = payload.createdOn;
6464
},
6565
updateOutlineIndexLoadingStatus: (state: CourseOutlineState, { payload }) => {

src/course-outline/data/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ export interface ConfigureSubsectionData {
109109
isOnboardingExam?: boolean,
110110
isPracticeExam?: boolean,
111111
examReviewRules?: string,
112-
defaultTimeLimitMin?: number,
112+
defaultTimeLimitMinutes?: number,
113113
hideAfterDue: boolean,
114114
showCorrectness: "always" | "never" | "past_due" | "never_but_include_grade",
115115
isPrereq?: boolean,

src/course-outline/outline-sidebar/info-sidebar/SubsectionSettings.tsx

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)