diff --git a/app/controllers/gradebooks_controller.rb b/app/controllers/gradebooks_controller.rb
index 38eba05330e..84afcc06da9 100644
--- a/app/controllers/gradebooks_controller.rb
+++ b/app/controllers/gradebooks_controller.rb
@@ -137,7 +137,7 @@ class GradebooksController < ApplicationController
student_enrollment.find_score(course_score: true)
end
- js_hash[:effective_final_grade] = total_score.effective_final_grade if total_score.overridden?
+ js_hash[:effective_final_score] = total_score.effective_final_score if total_score.overridden?
end
js_env(js_hash)
diff --git a/app/jsx/grading/GradeSummary.js b/app/jsx/grading/GradeSummary.js
index 1ce82caca83..ee72e75e2bf 100644
--- a/app/jsx/grading/GradeSummary.js
+++ b/app/jsx/grading/GradeSummary.js
@@ -361,11 +361,26 @@ function calculateTotals (calculatedGrades, currentOrFinal, groupWeightingScheme
const scoreAsPercent = calculateGrade(finalScore, finalPossible)
let finalGrade
+ let letterGrade
let teaserText
- if (!gradeChanged && ENV.grading_scheme && ENV.effective_final_grade) {
- finalGrade = formatPercentGrade(gradeToScoreLowerBound(ENV.effective_final_grade, ENV.grading_scheme))
+ if (gradingSchemeEnabled()) {
+ const scoreToUse = overrideScorePresent() ?
+ ENV.effective_final_score :
+ calculatePercentGrade(finalScore, finalPossible)
+
+ letterGrade = scoreToGrade(scoreToUse, ENV.grading_scheme)
+ $('.final_grade .letter_grade').text(letterGrade)
+ }
+
+ if (!gradeChanged && overrideScorePresent()) {
teaserText = scoreAsPoints
+
+ if (gradingSchemeEnabled()) {
+ finalGrade = formatPercentGrade(gradeToScoreLowerBound(letterGrade, ENV.grading_scheme))
+ } else {
+ finalGrade = formatPercentGrade(ENV.effective_final_score)
+ }
} else if (showTotalGradeAsPoints && groupWeightingScheme !== 'percent') {
finalGrade = scoreAsPoints
teaserText = scoreAsPercent
@@ -391,15 +406,21 @@ function calculateTotals (calculatedGrades, currentOrFinal, groupWeightingScheme
$.screenReaderFlashMessageExclusive(msg)
}
- if (ENV.grading_scheme) {
- $('.final_letter_grade .grade').text(
- ENV.effective_final_grade || scoreToGrade(calculatePercentGrade(finalScore, finalPossible), ENV.grading_scheme)
- )
- }
-
$('.revert_all_scores').showIf($('#grades_summary .revert_score_link').length > 0)
}
+// This element is only rendered by the erb if the course has enabled grading
+// schemes. We can't rely on only checking for the presence of
+// ENV.grading_scheme as that, in this case, always returns Canvas's default
+// grading scheme even if grading schemes are not enabled.
+function gradingSchemeEnabled() {
+ return $('.final_grade .letter_grade').length > 0 && ENV.grading_scheme
+}
+
+function overrideScorePresent() {
+ return ENV.effective_final_score != null
+}
+
function updateStudentGrades () {
const droppedMessage = I18n.t('This assignment is dropped and will not be considered in the total calculation')
const ignoreUngradedSubmissions = $('#only_consider_graded_assignments').attr('checked')
diff --git a/app/views/gradebooks/grade_summary.html.erb b/app/views/gradebooks/grade_summary.html.erb
index 39bccf6f336..8104d829e51 100644
--- a/app/views/gradebooks/grade_summary.html.erb
+++ b/app/views/gradebooks/grade_summary.html.erb
@@ -36,9 +36,7 @@
-
(
-
+ –
)
-
@@ -349,38 +347,81 @@ QUnit.module('GradeSummary.calculateTotals', (suiteHooks) => {
QUnit.module('final grade override', (contextHooks) => {
contextHooks.beforeEach(() => {
exampleGrades = createExampleGrades()
+ exampleGrades.current = {score: 23, possible: 100}
ENV.grading_scheme = [['A', 0.90], ['B', 0.80], ['C', 0.70], ['D', 0.60], ['F', 0]]
})
- test('sets the final letter grade to the effective final grade, if present', () => {
- ENV.effective_final_grade = 'D-'
+ test('sets the percent grade to the corresponding lower bound of the effective grade', () => {
+ ENV.effective_final_score = 72
GradeSummary.calculateTotals(exampleGrades, 'current', 'percent')
- const $grade = $fixtures.find('.final_letter_grade .grade')
- strictEqual($grade.text(), 'D-')
- })
-
- test('sets the final letter grade to the calculated final grade, if not present', () => {
- GradeSummary.calculateTotals(exampleGrades, 'current', 'percent')
- const $grade = $fixtures.find('.final_letter_grade .grade')
- strictEqual($grade.text(), 'F')
- })
-
- test('sets the percent grade to the corresponding value of the effective grade, if present', () => {
- ENV.effective_final_grade = 'C'
- GradeSummary.calculateTotals(exampleGrades, 'current', 'percent')
- const $grade = $fixtures.find('.student_assignment.final_grade .grade').first()
+ const $grade = $fixtures.find('.final_grade .grade').first()
strictEqual($grade.text(), '70%')
})
+ test('sets the letter grade to the effective grade', () => {
+ ENV.effective_final_score = 72
+ GradeSummary.calculateTotals(exampleGrades, 'current', 'percent')
+ const $grade = $fixtures.find('.final_grade .letter_grade')
+ strictEqual($grade.text(), 'C')
+ })
+
+ test('sets the percent grade to the calculated percent grade, if overrides not present', () => {
+ GradeSummary.calculateTotals(exampleGrades, 'current', 'percent')
+ const $grade = $fixtures.find('.final_grade .grade').first()
+ strictEqual($grade.text(), '23%')
+ })
+
+ test('sets the letter grade to the calculated letter grade, if overrides not present', () => {
+ GradeSummary.calculateTotals(exampleGrades, 'current', 'percent')
+ const $grade = $fixtures.find('.final_grade .letter_grade')
+ strictEqual($grade.text(), 'F')
+ })
+
test('changed What-If scores take precedence over the effective grade', () => {
- ENV.effective_final_grade = 'C'
- exampleGrades.current = {score: 3, possible: 10 }
+ ENV.effective_final_score = 72
+ exampleGrades.current = {score: 3, possible: 10}
const changedGrade = '3'
$fixtures.find('.score_holder .tooltip').html(changedGrade)
GradeSummary.calculateTotals(exampleGrades, 'current', 'percent')
- const $grade = $fixtures.find('.student_assignment.final_grade .grade').first()
+ const $grade = $fixtures.find('.final_grade .grade').first()
strictEqual($grade.text(), '30%')
})
+
+ test('override score of 0 results in a 0%', () => {
+ ENV.effective_final_score = 0
+ GradeSummary.calculateTotals(exampleGrades, 'current', 'percent')
+ const $grade = $fixtures.find('.final_grade .grade').first()
+ strictEqual($grade.text(), '0%')
+ })
+
+ test('override score of 0 results in an F letter grade', () => {
+ ENV.effective_final_score = 0
+ GradeSummary.calculateTotals(exampleGrades, 'current', 'percent')
+ const $grade = $fixtures.find('.final_grade .letter_grade').first()
+ strictEqual($grade.text(), 'F')
+ })
+
+ // At present, ENV.grading_scheme is always present, but that may change
+ // some day if there's no longer a need to always send it back (in other
+ // parts of Canvas, it's only present when a grading scheme is enabled),
+ // so this is a defensive test.
+ test('when a grading scheme is not present, but an override is, the raw override score is shown', () => {
+ delete ENV.grading_scheme
+ ENV.effective_final_score = 72
+ GradeSummary.calculateTotals(exampleGrades, 'current', 'percent')
+ const $grade = $fixtures.find('.final_grade .grade').first()
+ strictEqual($grade.text(), '72%')
+ })
+
+ // This test is necessary because GradeSummary determines if a grading
+ // scheme is present via the presence of this span.
+ test('when the .letter_grade span is not present, the raw override score is shown', () => {
+ $('.final_grade .letter_grade').remove()
+ ENV.effective_final_score = 72
+ GradeSummary.calculateTotals(exampleGrades, 'current', 'percent')
+ const $grade = $fixtures.find('.final_grade .grade').first()
+ strictEqual($grade.text(), '72%')
+ })
})
})
diff --git a/spec/selenium/grades/grade_override/grade_override_spec.rb b/spec/selenium/grades/grade_override/grade_override_spec.rb
index 13ae490de74..60631c888ea 100644
--- a/spec/selenium/grades/grade_override/grade_override_spec.rb
+++ b/spec/selenium/grades/grade_override/grade_override_spec.rb
@@ -103,7 +103,6 @@ describe 'Final Grade Override' do
end
it 'displays overridden grade for student grades', priority: '1', test_id: 3682131 do
- skip('GRADE-1931')
user_session(@students.first)
StudentGradesPage.visit_as_student(@course)
expect(StudentGradesPage.final_grade.text).to eql "90%"