{formatNumber(column.d3format, sparkData[index])}
{formatTime(
column.dateFormat,
moment.utc(entries[index].time).toDate(),
)}
)}
/>
);
};
const renderValueCell = (valueField, column, reversedEntries) => {
const recent = reversedEntries[0][valueField];
let v;
let errorMsg;
if (column.colType === 'time') {
// Time lag ratio
const timeLag = column.timeLag || 0;
const totalLag = Object.keys(reversedEntries).length;
if (timeLag >= totalLag) {
errorMsg = `The time lag set at ${timeLag} is too large for the length of data at ${reversedEntries.length}. No data available.`;
} else {
v = reversedEntries[timeLag][valueField];
}
if (typeof v === 'number' || typeof recent === 'number') {
if (column.comparisonType === 'diff') {
v = recent - v;
} else if (column.comparisonType === 'perc') {
v = recent / v;
} else if (column.comparisonType === 'perc_change') {
v = recent / v - 1;
}
} else {
v = 'N/A';
}
} else if (column.colType === 'contrib') {
// contribution to column total
v =
recent /
Object.keys(reversedEntries[0])
.map(k => (k !== 'time' ? reversedEntries[0][k] : null))
.reduce((a, b) => a + b);
} else if (column.colType === 'avg') {
// Average over the last {timeLag}
v = null;
if (reversedEntries.length > 0) {
const stats = reversedEntries.slice(undefined, column.timeLag).reduce(
function ({ count, sum }, entry) {
return entry[valueField] !== undefined &&
entry[valueField] !== null
? { count: count + 1, sum: sum + entry[valueField] }
: { count, sum };
},
{ count: 0, sum: 0 },
);
if (stats.count > 0) {
v = stats.sum / stats.count;
}
}
}
const color = colorFromBounds(v, column.bounds);
return (