In this chart, built using dc.js we have got both d3.tip as well as, default title tag.
We needed to have multiple data (not only key and value) in tooltip. For this reason, we're reducing the data:
var denialGroup = denialReasonDim.group().reduce(
function(p, v) {
p.reason = v.reason;
p.payer = v.payer;
p.denialAmount += v.denialAmount;
p.claimCount += v.claimCount;
++p.count;
return p;
},
function(p, v) {
p.reason = v.reason;
p.payer = v.payer;
p.denialAmount -= v.denialAmount;
p.claimCount -= v.claimCount;
--p.count;
return p;
},
function() {
return {
reason: '',
payer: '',
denialAmount: 0,
claimCount: 0,
count: 0
}
}
);
And giving it to the rendering title tags:
.title(function(d) {
var data = denialGroup.all().filter(function(t) {
return t.key == d.data.key || t.value.reason == d.data.key;
})
return d.data.key +
"\nDenial Amount: $" + formatNumber(d.value);
if (data.length > 0) {
return "Key: " + d.data.key +
"\nValue Denial Amount : $" + formatNumber(d.value) +
"\nClaim Count: " + formatNumber(data[0].value.claimCount) +
"\nDenial Amount: $" + formatNumber(data[0].value.denialAmount);
} else {
return "Key: " + d.data.key +
"\nValue Denial Amount : $" + formatNumber(d.value);
}
});
And this data is being used by d3.tip:
var tip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 0])
.html(function(d) {
var tooltipText = $(this).find("title").text();
var tooltipTexts = tooltipText.split('\n');
var totalTips = tooltipTexts.length;
var tooltipHtml = '';
for (var i = 0; i < totalTips; i++) {
var tipElements = tooltipTexts[i].split(':');
var tipKey = tipElements[0];
var tipValue = tipElements[1];
tooltipHtml += "<div><strong>" + tipKey + "</strong> <span style='color:red'>" + tipValue + "</span></div>";
}
return tooltipHtml;
/*return "<strong>" + d.key + "</strong> <span style='color:red'>" + d.value + "</span>";*/
})
The problem is that our client doesn't like default browser title along with d3-tip. We're just interested in d3-tip, not default title tag
Notice that it's not HTML's title attribute which can be disabled with
e.preventDefault()