nightscout
Version:
Nightscout acts as a web-based CGM (Continuous Glucose Monitor) to allow multiple caregivers to remotely view a patients glucose data in realtime.
121 lines (95 loc) • 3.26 kB
JavaScript
;
var _map = require('lodash/map');
var _each = require('lodash/each');
var TOOLTIP_WIDTH = 275; //min-width + padding
function init (majorPills, minorPills, statusPills, bgStatus, tooltip) {
var pluginBase = { };
pluginBase.forecastInfos = [];
pluginBase.forecastPoints = {};
function findOrCreatePill (plugin) {
var container = null;
if (plugin.pluginType === 'pill-major') {
container = majorPills;
} else if (plugin.pluginType === 'pill-status') {
container = statusPills;
} else if (plugin.pluginType === 'bg-status') {
container = bgStatus;
} else {
container = minorPills;
}
var pillName = 'span.pill.' + plugin.name;
var pill = container.find(pillName);
var classes = 'pill ' + plugin.name;
if (!pill || pill.length === 0) {
pill = $('<span class="' + classes + '">');
var pillLabel = $('<label></label>');
var pillValue = $('<em></em>');
if (plugin.pillFlip) {
pill.append(pillValue);
pill.append(pillLabel);
} else {
pill.append(pillLabel);
pill.append(pillValue);
}
container.append(pill);
} else {
//reset in case a pill class was added and needs to be removed
pill.attr('class', classes);
}
return pill;
}
pluginBase.updatePillText = function updatePillText (plugin, options) {
var pill = findOrCreatePill(plugin);
if (options.hide) {
pill.addClass('hidden');
} else {
pill.removeClass('hidden');
}
pill.addClass(options.pillClass);
if (options.directHTML) {
pill.html(options.label);
} else {
if (options.directText) {
pill.text(options.label);
} else {
pill.find('label').attr('class', options.labelClass).text(options.label);
pill.find('em')
.attr('class', options.valueClass)
.toggle(options.value != null)
.text(options.value)
;
}
}
if (options.info && options.info.length) {
var html = _map(options.info, function mapInfo (i) {
return '<strong>' + i.label + '</strong> ' + i.value;
}).join('<br/>\n');
pill.mouseover(function pillMouseover (event) {
tooltip.style('opacity', .9);
var windowWidth = $(tooltip.node()).parent().parent().width();
var left = event.pageX + TOOLTIP_WIDTH < windowWidth ? event.pageX : windowWidth - TOOLTIP_WIDTH - 10;
tooltip.html(html)
.style('left', left + 'px')
.style('top', (event.pageY + 15) + 'px');
});
pill.mouseout(function pillMouseout ( ) {
tooltip.style('opacity', 0);
});
} else {
pill.off('mouseover');
}
};
pluginBase.addForecastPoints = function addForecastPoints (points, info) {
_each(points, function eachPoint (point) {
point.type = 'forecast';
point.info = info;
if (point.mgdl < 13) {
point.color = 'transparent';
}
});
pluginBase.forecastInfos.push(info);
pluginBase.forecastPoints[info.type] = points;
};
return pluginBase;
}
module.exports = init;