Bypass "Calculation of totals has been disabled" for canvas

Calculates totals when canvas doesn't want to

As of 2022-09-13. See the latest version.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name        Bypass "Calculation of totals has been disabled" for canvas
// @namespace   https://boehs.org
// @match       https://*.instructure.com/courses/*/grades
// @grant       none
// @version     1.1.0
// @author      Evan Boehs
// @description Calculates totals when canvas doesn't want to
// @supportURL  https://gist.github.com/boehs/883fda113facb902ac440cab26b09cb9
// @license     GPL-3.0-only
// ==/UserScript==

function update() {
  let totalCurrent = 0
  let totalPossible = 0
  const assignments = document.querySelectorAll("tr.student_assignment:not(.group_total)")
  assignments.forEach(assignment => {
    const possible = Number((assignment.querySelector(".possible.points_possible").textContent || "").trim())
    const current = Number((assignment.querySelector(".assignment_score .grade").textContent.replace(/((hat-)|[^0-9-.])/g,"") || "").trim())
    if (!isNaN(possible + current)) {
      totalPossible += possible
      totalCurrent += current
    }
  })
  const percent = ((totalCurrent / totalPossible) * 100).toFixed(2)
  
  document.getElementById("student-grades-final").innerHTML = `${percent}% <sub>
  <span>(Bypassed)</span>
  <br/>
  <span>NOTE: This script does not support weights yet</span>
  </sub>`
}

if (document.getElementById("student-grades-final").textContent.trim() == 'Calculation of totals has been disabled') {
  const observer = new MutationObserver(update)
  
  observer.observe(document.getElementById("grades_summary"), { childList:true, subtree:true })
  
  update()
}