@@ -12,7 +12,10 @@ import { Helmet } from 'react-helmet';
1212import { useCourseAuthoringContext } from '@src/CourseAuthoringContext' ;
1313import { STATEFUL_BUTTON_STATES } from '@src/constants' ;
1414import { useCourseSettings } from '@src/data/apiHooks' ;
15+ import { useUserPermissionsWithAuthzCourse } from '@src/authz/hooks' ;
16+ import { getGradingPermissions } from '@src/authz/permissionHelpers' ;
1517import ConnectionErrorAlert from '@src/generic/ConnectionErrorAlert' ;
18+ import PermissionDeniedAlert from '@src/generic/PermissionDeniedAlert' ;
1619import SectionSubHeader from '@src/generic/section-sub-header' ;
1720import SubHeader from '@src/generic/sub-header/SubHeader' ;
1821import AlertMessage from '@src/generic/alert-message' ;
@@ -34,6 +37,12 @@ import messages from './messages';
3437const GradingSettings = ( ) => {
3538 const intl = useIntl ( ) ;
3639 const { courseId, courseDetails } = useCourseAuthoringContext ( ) ;
40+
41+ const {
42+ isLoading : isLoadingUserPermissions ,
43+ permissions : userPermissions ,
44+ } = useUserPermissionsWithAuthzCourse ( courseId , getGradingPermissions ( courseId ) ) ;
45+
3746 const {
3847 data : gradingSettings ,
3948 isLoading : isGradingSettingsLoading ,
@@ -55,7 +64,7 @@ const GradingSettings = () => {
5564 const courseGradingDetails = gradingSettings ?. courseDetails ;
5665 const isLoadingDenied = isGradingSettingsError || isCourseSettingsError ;
5766 const [ showSuccessAlert , setShowSuccessAlert ] = useState ( false ) ;
58- const isLoading = isCourseSettingsLoading || isGradingSettingsLoading ;
67+ const isLoading = isCourseSettingsLoading || isGradingSettingsLoading || isLoadingUserPermissions ;
5968 const [ isQueryPending , setIsQueryPending ] = useState ( false ) ;
6069 const [ showOverrideInternetConnectionAlert , setOverrideInternetConnectionAlert ] = useState ( false ) ;
6170 const [ eligibleGrade , setEligibleGrade ] = useState ( null ) ;
@@ -93,6 +102,10 @@ const GradingSettings = () => {
93102 }
94103 } , [ savePending ] ) ;
95104
105+ if ( ! isLoadingUserPermissions && ! userPermissions . canViewGradingSettings ) {
106+ return < PermissionDeniedAlert /> ;
107+ }
108+
96109 if ( isLoadingDenied ) {
97110 return (
98111 < Container size = "xl" className = "course-unit px-4 mt-4" >
@@ -105,6 +118,8 @@ const GradingSettings = () => {
105118 return null ;
106119 }
107120
121+ const isEditable = ! isLoadingUserPermissions && userPermissions . canEditGradingSettings ;
122+
108123 const handleQueryProcessing = ( ) => {
109124 setShowSuccessAlert ( false ) ;
110125 updateGradingSettings ( gradingData ) ;
@@ -177,6 +192,7 @@ const GradingSettings = () => {
177192 setOverrideInternetConnectionAlert = { setOverrideInternetConnectionAlert }
178193 setEligibleGrade = { setEligibleGrade }
179194 defaultGradeDesignations = { gradingSettings ?. defaultGradeDesignations }
195+ isEditable = { isEditable }
180196 />
181197 </ section >
182198 { courseSettingsData . creditEligibilityEnabled && courseSettingsData . isCreditCourse && (
@@ -191,6 +207,7 @@ const GradingSettings = () => {
191207 minimumGradeCredit = { minimumGradeCredit }
192208 setGradingData = { setGradingData }
193209 setShowSuccessAlert = { setShowSuccessAlert }
210+ isEditable = { isEditable }
194211 />
195212 </ section >
196213 ) }
@@ -204,6 +221,7 @@ const GradingSettings = () => {
204221 gracePeriod = { gracePeriod }
205222 setGradingData = { setGradingData }
206223 setShowSuccessAlert = { setShowSuccessAlert }
224+ isEditable = { isEditable }
207225 />
208226 </ section >
209227 < section >
@@ -222,11 +240,13 @@ const GradingSettings = () => {
222240 setGradingData = { setGradingData }
223241 courseAssignmentLists = { courseAssignmentLists }
224242 setShowSuccessAlert = { setShowSuccessAlert }
243+ isEditable = { isEditable }
225244 />
226245 < Button
227246 variant = "primary"
228247 iconBefore = { IconAdd }
229248 onClick = { handleAddAssignment }
249+ disabled = { ! isEditable }
230250 >
231251 { intl . formatMessage ( messages . addNewAssignmentTypeBtn ) }
232252 </ Button >
@@ -270,6 +290,7 @@ const GradingSettings = () => {
270290 key = "statefulBtn"
271291 onClick = { handleSendGradingSettingsData }
272292 state = { isQueryPending ? STATEFUL_BUTTON_STATES . pending : STATEFUL_BUTTON_STATES . default }
293+ disabled = { ! isEditable }
273294 { ...updateValuesButtonState }
274295 /> ,
275296 ] . filter ( Boolean ) }
0 commit comments