@@ -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 { useCourseUserPermissions } 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,13 @@ import messages from './messages';
3437const GradingSettings = ( ) => {
3538 const intl = useIntl ( ) ;
3639 const { courseId, courseDetails } = useCourseAuthoringContext ( ) ;
40+
41+ const {
42+ isLoading : isLoadingUserPermissions ,
43+ canViewGradingSettings,
44+ canEditGradingSettings,
45+ } = useCourseUserPermissions ( courseId , getGradingPermissions ( courseId ) ) ;
46+
3747 const {
3848 data : gradingSettings ,
3949 isLoading : isGradingSettingsLoading ,
@@ -55,7 +65,7 @@ const GradingSettings = () => {
5565 const courseGradingDetails = gradingSettings ?. courseDetails ;
5666 const isLoadingDenied = isGradingSettingsError || isCourseSettingsError ;
5767 const [ showSuccessAlert , setShowSuccessAlert ] = useState ( false ) ;
58- const isLoading = isCourseSettingsLoading || isGradingSettingsLoading ;
68+ const isLoading = isCourseSettingsLoading || isGradingSettingsLoading || isLoadingUserPermissions ;
5969 const [ isQueryPending , setIsQueryPending ] = useState ( false ) ;
6070 const [ showOverrideInternetConnectionAlert , setOverrideInternetConnectionAlert ] = useState ( false ) ;
6171 const [ eligibleGrade , setEligibleGrade ] = useState ( null ) ;
@@ -93,6 +103,10 @@ const GradingSettings = () => {
93103 }
94104 } , [ savePending ] ) ;
95105
106+ if ( ! isLoadingUserPermissions && ! canViewGradingSettings ) {
107+ return < PermissionDeniedAlert /> ;
108+ }
109+
96110 if ( isLoadingDenied ) {
97111 return (
98112 < Container size = "xl" className = "course-unit px-4 mt-4" >
@@ -105,6 +119,8 @@ const GradingSettings = () => {
105119 return null ;
106120 }
107121
122+ const isEditable = ! isLoadingUserPermissions && canEditGradingSettings ;
123+
108124 const handleQueryProcessing = ( ) => {
109125 setShowSuccessAlert ( false ) ;
110126 updateGradingSettings ( gradingData ) ;
@@ -177,6 +193,7 @@ const GradingSettings = () => {
177193 setOverrideInternetConnectionAlert = { setOverrideInternetConnectionAlert }
178194 setEligibleGrade = { setEligibleGrade }
179195 defaultGradeDesignations = { gradingSettings ?. defaultGradeDesignations }
196+ isEditable = { isEditable }
180197 />
181198 </ section >
182199 { courseSettingsData . creditEligibilityEnabled && courseSettingsData . isCreditCourse && (
@@ -191,6 +208,7 @@ const GradingSettings = () => {
191208 minimumGradeCredit = { minimumGradeCredit }
192209 setGradingData = { setGradingData }
193210 setShowSuccessAlert = { setShowSuccessAlert }
211+ isEditable = { isEditable }
194212 />
195213 </ section >
196214 ) }
@@ -204,6 +222,7 @@ const GradingSettings = () => {
204222 gracePeriod = { gracePeriod }
205223 setGradingData = { setGradingData }
206224 setShowSuccessAlert = { setShowSuccessAlert }
225+ isEditable = { isEditable }
207226 />
208227 </ section >
209228 < section >
@@ -222,11 +241,13 @@ const GradingSettings = () => {
222241 setGradingData = { setGradingData }
223242 courseAssignmentLists = { courseAssignmentLists }
224243 setShowSuccessAlert = { setShowSuccessAlert }
244+ isEditable = { isEditable }
225245 />
226246 < Button
227247 variant = "primary"
228248 iconBefore = { IconAdd }
229249 onClick = { handleAddAssignment }
250+ disabled = { ! isEditable }
230251 >
231252 { intl . formatMessage ( messages . addNewAssignmentTypeBtn ) }
232253 </ Button >
@@ -270,6 +291,7 @@ const GradingSettings = () => {
270291 key = "statefulBtn"
271292 onClick = { handleSendGradingSettingsData }
272293 state = { isQueryPending ? STATEFUL_BUTTON_STATES . pending : STATEFUL_BUTTON_STATES . default }
294+ disabled = { ! isEditable }
273295 { ...updateValuesButtonState }
274296 /> ,
275297 ] . filter ( Boolean ) }
0 commit comments