(MTurk) Show Qualtrics Survey Progress

Shows hidden progress on qualtrics surveys

As of 2019-09-07. See the latest version.

// ==UserScript==
// @name         (MTurk) Show Qualtrics Survey Progress
// @namespace    https://greasyfork.org/en/users/367017-shinobu-oshino
// @version      1.26
// @description  Shows hidden progress on qualtrics surveys
// @author       letsfindcommonground (mktemp@pm.me)
// @match        https://*.qualtrics.com/*
// @grant        unsafeWindow
// ==/UserScript==

function waitForElement(selector) {
    return new Promise((resolve, reject) => {
        const interval = setInterval(() => {
            const element = document.querySelector(selector);

            if(element) {
                resolve(element);

                clearInterval(interval);
            }
        }, 50);
    });
}

function removeOldProgressBar(e) {
    const oldProgressBar = document.querySelector('#ProgressBar');

    if(oldProgressBar) {
        oldProgressBar.style.display = 'none';
    }
}

(async function() {
    'use strict';

    const page = await waitForElement('#Page');

    const pageObserver = new MutationObserver(removeOldProgressBar);
    pageObserver.observe(page, {
        childList: true
    });

    const progress = unsafeWindow.QSettings.pt.ProgressPercent;

    const indicator = document.createElement('span');
    indicator.textContent = `${progress}%`;
    indicator.style.cssText = `color: white; background: black; padding: 8px 12px;
position: absolute; left: 0; top: 0; font-family: 'Roboto', sans-serif; font-size: 0.9em;
border-bottom-right-radius: 8px;`;
    document.body.appendChild(indicator);

    const oldXHROpen = unsafeWindow.XMLHttpRequest.prototype.open;
    unsafeWindow.XMLHttpRequest.prototype.open = function(method, url, async) {
        if(url.includes('next?rand=')) {
            this.addEventListener('load', function() {
                const result = JSON.parse(this.response);
                indicator.textContent = `${result.ProgressPercent}%`;
            });
        }

        return oldXHROpen.apply(this, arguments);
    };
})();