lib/amd/src/task_indicator.js

// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

/**
 * Task indicator
 *
 * Watches the progress bar inside the task indicator for updates, and redirects when the progress is complete.
 *
 * @module     core/task_indicator
 * @copyright  2024 Catalyst IT Europe Ltd
 * @author     Mark Johnson <mark.johnson@catalyst-eu.net>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
export default class {
    /**
     * Watch the progress bar for updates.
     *
     * When the progress bar is updated to 100%, wait a couple of seconds so the user gets to see it if they are watching,
     * then redirect to the specified URL.
     *
     * @param {String} id The ID of the progress bar element.
     * @param {String} redirectUrl Optional URL to redirect to once the task is complete.
     */
    static init(id, redirectUrl) {
        const bar = document.getElementById(id);
        bar.addEventListener('update', (event) => {
            const percent = event?.detail?.percent;
            if (percent > 0) {
                // Once progress starts, display the progress bar and remove the run link.
                bar.classList.remove('stored-progress-notstarted');
                const runlink = document.querySelector(`.runlink[data-idnumber=${id}]`);
                if (runlink) {
                    runlink.remove();
                }
            }
            // Once the progress bar completes, redirect the page.
            if (redirectUrl !== '' && percent === 100) {
                window.setTimeout(() => window.location.assign(redirectUrl), 2000);
            }
        });
    }
}