import 'shiny';
import 'jquery'
let attendants = new Map();
/**
* Handles messages from the shiny server to set the progress
* of the bar and optionally its text.
* @function
* @param {JSON} msg - JSON object sent from shiny server.
*/
const handleProgress = (msg) => {
let $el = $(`#${msg.id} .progress-bar`);
let w = getWidth(msg.id, msg.value);
$(`#${msg.id}`).show();
$el
.attr('aria-valuenow', msg.value)
.css('width', w + '%');
if(msg.text)
$el.html(msg.text);
if(msg.hideOnEnd && getMax(msg.id) <= msg.value)
$(`#${msg.id}`).hide();
}
/**
* Get the max value from a progress bar.
* @function
* @param {string} id - Id of the progress bar.
*/
const getMax = (id) => {
let max = $(`#${id} .progress-bar`)
.attr('aria-valuemax');
return parseFloat(max);
}
/**
* Get the width the progress bar should be set to.
* @function
* @param {string} id - Id of the progress bar.
* @param {number} value - Value sent from the server
* must be more than the 'min' of the progress bar and less
* than the 'max'.
*/
const getWidth = (id, value) => {
let max = getMax(id);
return (value / max) * 100;
}
Shiny.addCustomMessageHandler('attendant-set-min', (msg) => {
$(`#${msg.id} .progress-bar`)
.attr('aria-valuemin', msg.min);
});
Shiny.addCustomMessageHandler('attendant-set-max', (msg) => {
$(`#${msg.id} .progress-bar`)
.attr('aria-valuemax', msg.max);
});
Shiny.addCustomMessageHandler('attendant-set', handleProgress);
Shiny.addCustomMessageHandler('attendant-done', (msg) => {
let existingAttendant = attendants.get(msg.id);
if(existingAttendant != undefined)
clearInterval(existingAttendant);
msg.value = getMax(msg.id);
handleProgress(msg);
})
Shiny.addCustomMessageHandler('attendant-auto', (msg) => {
let $el = $(`#${msg.id} .progress-bar`);
let max = getMax(msg.id);
let value = parseFloat($el.attr('aria-valuenow'));
let sequence = setInterval(() => {
if(value > max)
return ;
value = value + 1;
let w = getWidth(msg.id, value);
$(`#${msg.id} .progress-bar`)
.attr('aria-valuenow', value)
.css('width', w + '%');
}, msg.ms);
attendants.set(msg.id, sequence);
})