@@ -9,7 +9,10 @@ import { Helmet } from 'react-helmet';
99import { useCourseAuthoringContext } from '@src/CourseAuthoringContext' ;
1010import { STATEFUL_BUTTON_STATES } from '@src/constants' ;
1111import { useCourseSettings } from '@src/data/apiHooks' ;
12+ import { useUserPermissionsWithAuthzCourse } from '@src/authz/hooks' ;
13+ import { getGradingPermissions } from '@src/authz/permissionHelpers' ;
1214import ConnectionErrorAlert from '@src/generic/ConnectionErrorAlert' ;
15+ import PermissionDeniedAlert from '@src/generic/PermissionDeniedAlert' ;
1316import SectionSubHeader from '@src/generic/section-sub-header' ;
1417import SubHeader from '@src/generic/sub-header/SubHeader' ;
1518import AlertMessage from '@src/generic/alert-message' ;
@@ -31,6 +34,12 @@ import messages from './messages';
3134const GradingSettings = ( ) => {
3235 const intl = useIntl ( ) ;
3336 const { courseId, courseDetails } = useCourseAuthoringContext ( ) ;
37+
38+ const {
39+ isLoading : isLoadingUserPermissions ,
40+ permissions : userPermissions ,
41+ } = useUserPermissionsWithAuthzCourse ( courseId , getGradingPermissions ( courseId ) ) ;
42+
3443 const {
3544 data : gradingSettings ,
3645 isLoading : isGradingSettingsLoading ,
@@ -52,7 +61,7 @@ const GradingSettings = () => {
5261 const courseGradingDetails = gradingSettings ?. courseDetails ;
5362 const isLoadingDenied = isGradingSettingsError || isCourseSettingsError ;
5463 const [ showSuccessAlert , setShowSuccessAlert ] = useState ( false ) ;
55- const isLoading = isCourseSettingsLoading || isGradingSettingsLoading ;
64+ const isLoading = isCourseSettingsLoading || isGradingSettingsLoading || isLoadingUserPermissions ;
5665 const [ isQueryPending , setIsQueryPending ] = useState ( false ) ;
5766 const [ showOverrideInternetConnectionAlert , setOverrideInternetConnectionAlert ] = useState ( false ) ;
5867 const [ eligibleGrade , setEligibleGrade ] = useState ( null ) ;
@@ -90,6 +99,10 @@ const GradingSettings = () => {
9099 }
91100 } , [ savePending ] ) ;
92101
102+ if ( ! isLoadingUserPermissions && ! userPermissions . canViewGradingSettings ) {
103+ return < PermissionDeniedAlert /> ;
104+ }
105+
93106 if ( isLoadingDenied ) {
94107 return (
95108 < Container size = "xl" className = "course-unit px-4 mt-4" >
@@ -102,6 +115,8 @@ const GradingSettings = () => {
102115 return null ;
103116 }
104117
118+ const isEditable = ! isLoadingUserPermissions && userPermissions . canEditGradingSettings ;
119+
105120 const handleQueryProcessing = ( ) => {
106121 setShowSuccessAlert ( false ) ;
107122 updateGradingSettings ( gradingData ) ;
@@ -174,6 +189,7 @@ const GradingSettings = () => {
174189 setOverrideInternetConnectionAlert = { setOverrideInternetConnectionAlert }
175190 setEligibleGrade = { setEligibleGrade }
176191 defaultGradeDesignations = { gradingSettings ?. defaultGradeDesignations }
192+ isEditable = { isEditable }
177193 />
178194 </ section >
179195 { courseSettingsData . creditEligibilityEnabled && courseSettingsData . isCreditCourse && (
@@ -188,6 +204,7 @@ const GradingSettings = () => {
188204 minimumGradeCredit = { minimumGradeCredit }
189205 setGradingData = { setGradingData }
190206 setShowSuccessAlert = { setShowSuccessAlert }
207+ isEditable = { isEditable }
191208 />
192209 </ section >
193210 ) }
@@ -201,6 +218,7 @@ const GradingSettings = () => {
201218 gracePeriod = { gracePeriod }
202219 setGradingData = { setGradingData }
203220 setShowSuccessAlert = { setShowSuccessAlert }
221+ isEditable = { isEditable }
204222 />
205223 </ section >
206224 < section >
@@ -219,11 +237,13 @@ const GradingSettings = () => {
219237 setGradingData = { setGradingData }
220238 courseAssignmentLists = { courseAssignmentLists }
221239 setShowSuccessAlert = { setShowSuccessAlert }
240+ isEditable = { isEditable }
222241 />
223242 < Button
224243 variant = "primary"
225244 iconBefore = { IconAdd }
226245 onClick = { handleAddAssignment }
246+ disabled = { ! isEditable }
227247 >
228248 { intl . formatMessage ( messages . addNewAssignmentTypeBtn ) }
229249 </ Button >
@@ -267,6 +287,7 @@ const GradingSettings = () => {
267287 key = "statefulBtn"
268288 onClick = { handleSendGradingSettingsData }
269289 state = { isQueryPending ? STATEFUL_BUTTON_STATES . pending : STATEFUL_BUTTON_STATES . default }
290+ disabled = { ! isEditable }
270291 { ...updateValuesButtonState }
271292 /> ,
272293 ] . filter ( Boolean ) }
0 commit comments