/* ======================================================================= File: static/js/progress.js Purpose: Update progress bars dynamically for the current book. Expects data from API endpoints via dashboard.js or start.js. ======================================================================= */ console.log(">>> progress.js LOADED"); function updateProgressBars(data) { console.log(">>> progress.js updateProgressBars() CALLED with:", data); if (!data) { console.warn(">>> progress.js: NO DATA RECEIVED"); return; } // Data format expected: // { // download_done, // download_total, // audio_done, // audio_total // } const barDL = $(".progress-bar-fill"); const barAU = $(".progress-bar-fill.audio-fill"); console.log(">>> progress.js barDL =", barDL); console.log(">>> progress.js barAU =", barAU); const pctDL = data.download_total > 0 ? (100 * data.download_done) / data.download_total : 0; const pctAU = data.audio_total > 0 ? (100 * data.audio_done) / data.audio_total : 0; if (barDL) { barDL.style.width = pctDL.toFixed(1) + "%"; console.log(">>> progress.js updated DL bar to", pctDL.toFixed(1) + "%"); } else { console.warn(">>> progress.js: barDL NOT FOUND"); } if (barAU) { barAU.style.width = pctAU.toFixed(1) + "%"; console.log(">>> progress.js updated AU bar to", pctAU.toFixed(1) + "%"); } else { console.warn(">>> progress.js: barAU NOT FOUND"); } // Update textual stats const stats = $$(".progress-stats span"); console.log(">>> progress.js stats elements found:", stats.length); // Expected structure: [DL "x/y", DL "pct", AU "x/y", AU "pct"] if (stats.length >= 4) { stats[0].innerText = `${data.download_done} / ${data.download_total}`; stats[1].innerText = pctDL.toFixed(1) + "%"; stats[2].innerText = `${data.audio_done} / ${data.audio_total}`; stats[3].innerText = pctAU.toFixed(1) + "%"; console.log(">>> progress.js stats updated"); } else { console.warn( ">>> progress.js: not enough stats spans, found", stats.length ); } }