more fixes

This commit is contained in:
Guy Sandler 2026-08-29 14:43:39 -07:00
parent 9ab7d16bd9
commit 47ce60bc0d
4 changed files with 24 additions and 28 deletions

View File

@ -315,7 +315,7 @@
"message": "Grade Analytics" "message": "Grade Analytics"
}, },
"grade_analytics_desc": { "grade_analytics_desc": {
"message": "Adds an Analytics toggle to the left side of course grade pages with a score-distribution chart and your overall grade over time." "message": "Adds tools to help you analyze your grades."
}, },
"grade_analytics_zones": { "grade_analytics_zones": {
"message": "Colored grade zones" "message": "Colored grade zones"

View File

@ -228,7 +228,7 @@
</div><span class="option-name" data-i18n="grade_analytics">Grade Analytics</span> </div><span class="option-name" data-i18n="grade_analytics">Grade Analytics</span>
<span class="cr-info-bubble" tabindex="0" role="button" aria-label="Grade Analytics info"> <span class="cr-info-bubble" tabindex="0" role="button" aria-label="Grade Analytics info">
<svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="16" x2="12" y2="12"></line><line x1="12" y1="8" x2="12.01" y2="8"></line></svg> <svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="16" x2="12" y2="12"></line><line x1="12" y1="8" x2="12.01" y2="8"></line></svg>
<span class="cr-info-bubble-text" data-i18n="grade_analytics_desc">Adds an Analytics toggle to the left side of course grade pages with a score-distribution chart and your overall grade over time.</span> <span class="cr-info-bubble-text" data-i18n="grade_analytics_desc">Adds tools to help you analyze your grades.</span>
</span> </span>
</div> </div>
<div class="sub-options"> <div class="sub-options">
@ -604,14 +604,6 @@
<input type="checkbox" id="export-toggles" /> <input type="checkbox" id="export-toggles" />
<span>On/off toggles</span> <span>On/off toggles</span>
</div> </div>
<div class="sub-option">
<input type="checkbox" id="export-layout" />
<span>Layout</span>
</div>
<div class="sub-option">
<input type="checkbox" id="export-sidebar" />
<span>Sidebar</span>
</div>
<div class="sub-option"> <div class="sub-option">
<input type="checkbox" id="export-todo" /> <input type="checkbox" id="export-todo" />
<span>Todo list</span> <span>Todo list</span>

View File

@ -1757,6 +1757,17 @@ const BETTER_TODO_TIMEFRAME_DAYS = {
let betterTodoProgressFilter = null; let betterTodoProgressFilter = null;
let domContainers = {}; let domContainers = {};
// Better Todo timeframe filter, shared by the task list and the progress
// display so their counts always agree: keeps items due on/before now+range
// (overdue items are before now, so they are kept too). "all" keeps
// everything.
function applyTodoTimeframe(items) {
betterTodoTimeframe = (options.todo_timeframe && Object.prototype.hasOwnProperty.call(BETTER_TODO_TIMEFRAME_DAYS, options.todo_timeframe)) ? options.todo_timeframe : "all";
if (betterTodoTimeframe === "all") return items;
const cutoff = Date.now() + (BETTER_TODO_TIMEFRAME_DAYS[betterTodoTimeframe] * 24 * 60 * 60 * 1000);
return items.filter(item => new Date(item.plannable_date).getTime() <= cutoff);
}
// true when `courseId` is the dimmed-out class because another class is selected. // true when `courseId` is the dimmed-out class because another class is selected.
function progressFilterDim(courseId) { function progressFilterDim(courseId) {
return betterTodoProgressFilter != null && String(courseId) !== String(betterTodoProgressFilter); return betterTodoProgressFilter != null && String(courseId) !== String(betterTodoProgressFilter);
@ -2263,7 +2274,9 @@ function renderProgressRings(container, scopedData) {
const mode = getProgressRingMode(); const mode = getProgressRingMode();
if (mode === "none") { container.innerHTML = ""; return; } if (mode === "none") { container.innerHTML = ""; return; }
const allAssignments = scopedData.filter(item => (item.plannable_type == "assignment" || item.plannable_type == "planner_note")); // Apply the same timeframe filter the list uses so the counts in the
// display match what's shown below it.
const allAssignments = applyTodoTimeframe(scopedData.filter(item => (item.plannable_type == "assignment" || item.plannable_type == "planner_note")));
const groups = {}; const groups = {};
allAssignments.forEach(item => { allAssignments.forEach(item => {
@ -2931,13 +2944,9 @@ async function createTodoSections(location) {
completed = displayData.filter(item => (item.plannable_type == "assignment" || item.plannable_type == "planner_note") && (item.submissions?.submitted || item.planner_override?.marked_complete)); completed = displayData.filter(item => (item.plannable_type == "assignment" || item.plannable_type == "planner_note") && (item.submissions?.submitted || item.planner_override?.marked_complete));
// The timeframe is a persisted Better Todo List sub-option set in the // The timeframe is a persisted Better Todo List sub-option set in the
// popup. Read the current value each render so popup changes apply on // popup. Read the current value each render so popup changes apply on
// the next render. Keeps items due on/before now+range (overdue items // the next render. Only the Tasks tab is affected (announcements and
// are before now, so they are kept too). Only the Tasks tab is affected. // the completed tab always show everything).
betterTodoTimeframe = (options.todo_timeframe && Object.prototype.hasOwnProperty.call(BETTER_TODO_TIMEFRAME_DAYS, options.todo_timeframe)) ? options.todo_timeframe : "all"; assignmentsDue = applyTodoTimeframe(assignmentsDue);
if (betterTodoTimeframe !== "all") {
const cutoff = Date.now() + (BETTER_TODO_TIMEFRAME_DAYS[betterTodoTimeframe] * 24 * 60 * 60 * 1000);
assignmentsDue = assignmentsDue.filter(item => new Date(item.plannable_date).getTime() <= cutoff);
}
// console.log("assignments", assignmentsDue); // console.log("assignments", assignmentsDue);
// console.log("announcements", announcements); // console.log("announcements", announcements);
// console.log("completed", completed); // console.log("completed", completed);
@ -6776,8 +6785,8 @@ function renderGradeAnalytics() {
stats.innerHTML = stats.innerHTML =
stat("Overall grade", gaData.current == null ? "-" : gaData.current.toFixed(1) + "%") + stat("Overall grade", gaData.current == null ? "-" : gaData.current.toFixed(1) + "%") +
stat("Grade trend (last 5)", trendVal, trendColor) + stat("Grade trend (last 5)", trendVal, trendColor) +
stat("Graded assignments", gaData.graded) + stat("Graded", gaData.graded) +
stat("Ungraded / no score", gaData.ungraded); stat("Ungraded", gaData.ungraded);
const charts = panel.querySelector("#canvasrefined-ga-charts"); const charts = panel.querySelector("#canvasrefined-ga-charts");
charts.style.display = "flex"; charts.style.display = "flex";

View File

@ -60,8 +60,9 @@ const exportTodo = ["better_todo", "todo_hide_feedback", "todo_full_height", "to
const exportGpa = ["gpa_calc", "gpa_calc_prepend", "gpa_calc_cumulative", "gpa_calc_weighted"]; const exportGpa = ["gpa_calc", "gpa_calc_prepend", "gpa_calc_cumulative", "gpa_calc_weighted"];
const exportBackground = ["customBackgroundLink", "customBackgroundScale", "customBackgroundDaily", "customBackgroundNasaDaily", "fitImageToScreen", "card_transparency", "bg_opacity", "sidebar_opacity", "bg_blur", "sidebar_blur", "card_opacity", "card_blur"]; const exportBackground = ["customBackgroundLink", "customBackgroundScale", "customBackgroundDaily", "customBackgroundNasaDaily", "fitImageToScreen", "card_transparency", "bg_opacity", "sidebar_opacity", "bg_blur", "sidebar_blur", "card_opacity", "card_blur"];
// Master "On/off toggles" = every visual toggle (no GPA, no dark-mode schedule, // Master "On/off toggles" = every visual toggle (no GPA, no dark-mode schedule,
// no personal productivity features). // no personal productivity features). Includes the former separate Layout and
const exportToggles = ["dark_mode", "quiz_safe_mode"].concat(exportCardColorToggles, exportLayout, exportSidebar, exportTodo); // Sidebar groups, plus Grade Analytics and its colored-zones sub-toggle.
const exportToggles = ["dark_mode", "quiz_safe_mode", "grade_analytics", "grade_analytics_zones"].concat(exportCardColorToggles, exportLayout, exportSidebar, exportTodo);
const fontsDropdownStateKey = "fonts_dropdown_open"; const fontsDropdownStateKey = "fonts_dropdown_open";
const apiurl = "none"; const apiurl = "none";
@ -1315,12 +1316,6 @@ function setup() {
case "export-background": case "export-background":
final = { ...final, ...(await getExport(storage, exportBackground)) }; final = { ...final, ...(await getExport(storage, exportBackground)) };
break; break;
case "export-layout":
final = { ...final, ...(await getExport(storage, exportLayout)) };
break;
case "export-sidebar":
final = { ...final, ...(await getExport(storage, exportSidebar)) };
break;
case "export-todo": case "export-todo":
final = { ...final, ...(await getExport(storage, exportTodo)) }; final = { ...final, ...(await getExport(storage, exportTodo)) };
break; break;