Bypass "Calculation of totals has been disabled" for canvas

Calculates totals when canvas doesn't want to

As of 13.09.2022. See ბოლო ვერსია.

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.0.1
// @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
  
  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()
}