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.
158 lines (139 loc) • 5.26 kB
JavaScript
;
var dailystats = {
name: 'dailystats'
, label: 'Daily Stats'
, pluginType: 'report'
};
function init () {
return dailystats;
}
module.exports = init;
dailystats.html = function html (client) {
var translate = client.translate;
var ret =
'<h2>' + translate('Daily stats report') + '</h2>' +
'<div id="dailystats-report"></div>';
return ret;
};
dailystats.css =
'#dailystats-placeholder .tdborder {' +
' width:80px;' +
' border: 1px #ccc solid;' +
' margin: 0;' +
' padding: 1px;' +
' text-align:center;' +
'}' +
'#dailystats-placeholder .inlinepiechart {' +
' width: 2.2in;' +
' height: 0.9in;' +
'}';
dailystats.report = function report_dailystats (datastorage, sorteddaystoshow, options) {
var Nightscout = window.Nightscout;
var client = Nightscout.client;
var translate = client.translate;
var report_plugins = Nightscout.report_plugins;
var ss = require('simple-statistics');
var todo = [];
var report = $('#dailystats-report');
var minForDay, maxForDay, sum;
report.empty();
var table = $('<table class="centeraligned">');
report.append(table);
var thead = $('<tr/>');
$('<th></th>').appendTo(thead);
$('<th>' + translate('Date') + '</th>').appendTo(thead);
$('<th>' + translate('Low') + '</th>').appendTo(thead);
$('<th>' + translate('Normal') + '</th>').appendTo(thead);
$('<th>' + translate('High') + '</th>').appendTo(thead);
$('<th>' + translate('Readings') + '</th>').appendTo(thead);
$('<th>' + translate('Min') + '</th>').appendTo(thead);
$('<th>' + translate('Max') + '</th>').appendTo(thead);
$('<th>' + translate('Average') + '</th>').appendTo(thead);
$('<th>' + translate('StDev') + '</th>').appendTo(thead);
$('<th>' + translate('25%') + '</th>').appendTo(thead);
$('<th>' + translate('Median') + '</th>').appendTo(thead);
$('<th>' + translate('75%') + '</th>').appendTo(thead);
thead.appendTo(table);
sorteddaystoshow.forEach(function(day) {
var tr = $('<tr>');
var daysRecords = datastorage[day].statsrecords;
if (daysRecords.length === 0) {
$('<td/>').appendTo(tr);
$('<td class="tdborder" style="width:160px">' + report_plugins.utils.localeDate(day) + '</td>').appendTo(tr);
$('<td class="tdborder"colspan="10">' + translate('No data available') + '</td>').appendTo(tr);
table.append(tr);
return;
}
minForDay = daysRecords[0].sgv;
maxForDay = daysRecords[0].sgv;
sum = 0;
var stats = daysRecords.reduce(function(out, record) {
record.sgv = parseFloat(record.sgv);
if (record.sgv < options.targetLow) {
out.lows++;
} else if (record.sgv < options.targetHigh) {
out.normal++;
} else {
out.highs++;
}
if (minForDay > record.sgv) {
minForDay = record.sgv;
}
if (maxForDay < record.sgv) {
maxForDay = record.sgv;
}
sum += record.sgv;
return out;
}, {
lows: 0
, normal: 0
, highs: 0
});
var average = sum / daysRecords.length;
var bgValues = daysRecords.map(function(r) { return r.sgv; });
$('<td><div id="dailystat-chart-' + day.toString() + '" class="inlinepiechart"></div></td>').appendTo(tr);
$('<td class="tdborder" style="width:160px">' + report_plugins.utils.localeDate(day) + '</td>').appendTo(tr);
$('<td class="tdborder">' + Math.round((100 * stats.lows) / daysRecords.length) + '%</td>').appendTo(tr);
$('<td class="tdborder">' + Math.round((100 * stats.normal) / daysRecords.length) + '%</td>').appendTo(tr);
$('<td class="tdborder">' + Math.round((100 * stats.highs) / daysRecords.length) + '%</td>').appendTo(tr);
$('<td class="tdborder">' + daysRecords.length + '</td>').appendTo(tr);
$('<td class="tdborder">' + minForDay + '</td>').appendTo(tr);
$('<td class="tdborder">' + maxForDay + '</td>').appendTo(tr);
$('<td class="tdborder">' + average.toFixed(1) + '</td>').appendTo(tr);
$('<td class="tdborder">' + ss.standard_deviation(bgValues).toFixed(1) + '</td>').appendTo(tr);
$('<td class="tdborder">' + ss.quantile(bgValues, 0.25).toFixed(1) + '</td>').appendTo(tr);
$('<td class="tdborder">' + ss.quantile(bgValues, 0.5).toFixed(1) + '</td>').appendTo(tr);
$('<td class="tdborder">' + ss.quantile(bgValues, 0.75).toFixed(1) + '</td>').appendTo(tr);
table.append(tr);
var inrange = [
{
label: translate('Low')
, data: Math.round(stats.lows * 1000 / daysRecords.length) / 10
}
, {
label: translate('In Range')
, data: Math.round(stats.normal * 1000 / daysRecords.length) / 10
}
, {
label: translate('High')
, data: Math.round(stats.highs * 1000 / daysRecords.length) / 10
}
];
$.plot(
'#dailystat-chart-' + day.toString()
, inrange, {
series: {
pie: {
show: true
}
}
, colors: ['#f88', '#8f8', '#ff8']
}
);
});
setTimeout(function() {
todo.forEach(function(fn) {
fn();
});
}, 50);
};