2016-05-28 21:26:46 +02:00
|
|
|
// Test the rectangle element
|
2020-07-12 00:08:45 +02:00
|
|
|
const tooltipPlugin = Chart.registry.getPlugin('tooltip');
|
2020-01-21 12:36:53 +01:00
|
|
|
const Tooltip = tooltipPlugin._element;
|
|
|
|
|
2020-06-29 13:52:28 +02:00
|
|
|
describe('Plugin.Tooltip', function() {
|
2018-11-29 13:52:56 +01:00
|
|
|
describe('auto', jasmine.fixture.specs('core.tooltip'));
|
|
|
|
|
2017-01-28 23:06:20 +01:00
|
|
|
describe('config', function() {
|
|
|
|
it('should not include the dataset label in the body string if not defined', function() {
|
|
|
|
var data = {
|
|
|
|
datasets: [{
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
};
|
|
|
|
var tooltipItem = {
|
|
|
|
index: 1,
|
|
|
|
datasetIndex: 0,
|
2020-07-13 00:26:13 +02:00
|
|
|
dataset: data.datasets[0],
|
2019-10-27 21:35:15 +01:00
|
|
|
label: 'Point 2',
|
2020-07-14 23:40:32 +02:00
|
|
|
formattedValue: '20'
|
2017-01-28 23:06:20 +01:00
|
|
|
};
|
|
|
|
|
2020-07-13 00:26:13 +02:00
|
|
|
var label = Chart.defaults.plugins.tooltip.callbacks.label(tooltipItem);
|
2017-01-28 23:06:20 +01:00
|
|
|
expect(label).toBe('20');
|
|
|
|
|
|
|
|
data.datasets[0].label = 'My dataset';
|
2020-07-13 00:26:13 +02:00
|
|
|
label = Chart.defaults.plugins.tooltip.callbacks.label(tooltipItem);
|
2017-01-28 23:06:20 +01:00
|
|
|
expect(label).toBe('My dataset: 20');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2016-10-15 23:49:35 +02:00
|
|
|
describe('index mode', function() {
|
2020-01-14 13:34:08 +01:00
|
|
|
it('Should only use x distance when intersect is false', function(done) {
|
2017-01-28 12:52:40 +01:00
|
|
|
var chart = window.acquireChart({
|
2016-10-15 23:49:35 +02:00
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'index',
|
|
|
|
intersect: false,
|
|
|
|
}
|
2017-07-29 00:07:28 +02:00
|
|
|
},
|
|
|
|
hover: {
|
2016-10-15 23:49:35 +02:00
|
|
|
mode: 'index',
|
|
|
|
intersect: false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Trigger an event over top of the
|
2017-01-28 12:52:40 +01:00
|
|
|
var meta = chart.getDatasetMeta(0);
|
2016-10-15 23:49:35 +02:00
|
|
|
var point = meta.data[1];
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
// Check and see if tooltip was displayed
|
|
|
|
var tooltip = chart.tooltip;
|
|
|
|
var defaults = Chart.defaults;
|
|
|
|
|
|
|
|
expect(tooltip.options.xPadding).toEqual(6);
|
|
|
|
expect(tooltip.options.yPadding).toEqual(6);
|
|
|
|
expect(tooltip.xAlign).toEqual('left');
|
|
|
|
expect(tooltip.yAlign).toEqual('center');
|
2020-11-19 19:59:24 +01:00
|
|
|
expect(tooltip.options.bodyColor).toEqual('#fff');
|
2020-01-14 13:34:08 +01:00
|
|
|
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.options.bodyFont).toEqual(jasmine.objectContaining({
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: defaults.font.style,
|
|
|
|
size: defaults.font.size,
|
|
|
|
}));
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
bodyAlign: 'left',
|
|
|
|
bodySpacing: 2,
|
|
|
|
}));
|
|
|
|
|
2020-11-19 19:59:24 +01:00
|
|
|
expect(tooltip.options.titleColor).toEqual('#fff');
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.options.titleFont).toEqual(jasmine.objectContaining({
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: 'bold',
|
|
|
|
size: defaults.font.size,
|
|
|
|
}));
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
titleAlign: 'left',
|
|
|
|
titleSpacing: 2,
|
|
|
|
titleMarginBottom: 6,
|
|
|
|
}));
|
|
|
|
|
2020-11-19 19:59:24 +01:00
|
|
|
expect(tooltip.options.footerColor).toEqual('#fff');
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.options.footerFont).toEqual(jasmine.objectContaining({
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: 'bold',
|
|
|
|
size: defaults.font.size,
|
|
|
|
}));
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
footerAlign: 'left',
|
|
|
|
footerSpacing: 2,
|
|
|
|
footerMarginTop: 6,
|
|
|
|
}));
|
|
|
|
|
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
// Appearance
|
|
|
|
caretSize: 5,
|
|
|
|
caretPadding: 2,
|
|
|
|
cornerRadius: 6,
|
|
|
|
backgroundColor: 'rgba(0,0,0,0.8)',
|
|
|
|
multiKeyBackground: '#fff',
|
|
|
|
displayColors: true
|
|
|
|
}));
|
|
|
|
|
|
|
|
expect(tooltip).toEqual(jasmine.objectContaining({
|
|
|
|
opacity: 1,
|
|
|
|
|
|
|
|
// Text
|
|
|
|
title: ['Point 2'],
|
|
|
|
beforeBody: [],
|
|
|
|
body: [{
|
|
|
|
before: [],
|
|
|
|
lines: ['Dataset 1: 20'],
|
|
|
|
after: []
|
|
|
|
}, {
|
|
|
|
before: [],
|
|
|
|
lines: ['Dataset 2: 40'],
|
|
|
|
after: []
|
|
|
|
}],
|
|
|
|
afterBody: [],
|
|
|
|
footer: [],
|
|
|
|
labelColors: [{
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-01-14 13:34:08 +01:00
|
|
|
}, {
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-01-14 13:34:08 +01:00
|
|
|
}]
|
|
|
|
}));
|
|
|
|
|
|
|
|
expect(tooltip.x).toBeCloseToPixel(267);
|
|
|
|
expect(tooltip.y).toBeCloseToPixel(155);
|
2016-10-15 23:49:35 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
done();
|
2016-10-15 23:49:35 +02:00
|
|
|
});
|
2020-01-21 21:43:41 +01:00
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', {x: point.x, y: chart.chartArea.top + 10});
|
2020-01-14 13:34:08 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
it('Should only display if intersecting if intersect is set', function(done) {
|
|
|
|
var chart = window.acquireChart({
|
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'index',
|
|
|
|
intersect: true
|
|
|
|
}
|
2020-01-14 13:34:08 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Trigger an event over top of the
|
|
|
|
var meta = chart.getDatasetMeta(0);
|
|
|
|
var point = meta.data[1];
|
|
|
|
|
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
// Check and see if tooltip was displayed
|
|
|
|
var tooltip = chart.tooltip;
|
|
|
|
|
|
|
|
expect(tooltip).toEqual(jasmine.objectContaining({
|
|
|
|
opacity: 0,
|
|
|
|
}));
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', {x: point.x, y: 0});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Should display in single mode', function(done) {
|
|
|
|
var chart = window.acquireChart({
|
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'nearest',
|
|
|
|
intersect: true
|
|
|
|
}
|
2020-01-14 13:34:08 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2016-10-15 23:49:35 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
// Trigger an event over top of the
|
|
|
|
var meta = chart.getDatasetMeta(0);
|
|
|
|
var point = meta.data[1];
|
2016-10-15 23:49:35 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
2016-10-15 23:49:35 +02:00
|
|
|
// Check and see if tooltip was displayed
|
2017-01-28 12:52:40 +01:00
|
|
|
var tooltip = chart.tooltip;
|
2020-01-03 20:07:38 +01:00
|
|
|
var defaults = Chart.defaults;
|
2016-10-15 23:49:35 +02:00
|
|
|
|
2019-12-27 23:13:24 +01:00
|
|
|
expect(tooltip.options.xPadding).toEqual(6);
|
|
|
|
expect(tooltip.options.yPadding).toEqual(6);
|
|
|
|
expect(tooltip.xAlign).toEqual('left');
|
|
|
|
expect(tooltip.yAlign).toEqual('center');
|
2016-10-15 23:49:35 +02:00
|
|
|
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.options.bodyFont).toEqual(jasmine.objectContaining({
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: defaults.font.style,
|
|
|
|
size: defaults.font.size,
|
|
|
|
}));
|
|
|
|
|
2019-12-27 23:13:24 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
bodyAlign: 'left',
|
2016-10-15 23:49:35 +02:00
|
|
|
bodySpacing: 2,
|
2019-12-27 23:13:24 +01:00
|
|
|
}));
|
2016-10-15 23:49:35 +02:00
|
|
|
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.options.titleFont).toEqual(jasmine.objectContaining({
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: 'bold',
|
|
|
|
size: defaults.font.size,
|
|
|
|
}));
|
|
|
|
|
2019-12-27 23:13:24 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
titleAlign: 'left',
|
2016-10-15 23:49:35 +02:00
|
|
|
titleSpacing: 2,
|
|
|
|
titleMarginBottom: 6,
|
2019-12-27 23:13:24 +01:00
|
|
|
}));
|
2016-10-15 23:49:35 +02:00
|
|
|
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.options.footerFont).toEqual(jasmine.objectContaining({
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: 'bold',
|
|
|
|
size: defaults.font.size,
|
|
|
|
}));
|
|
|
|
|
2019-12-27 23:13:24 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
footerAlign: 'left',
|
2016-10-15 23:49:35 +02:00
|
|
|
footerSpacing: 2,
|
|
|
|
footerMarginTop: 6,
|
2019-12-27 23:13:24 +01:00
|
|
|
}));
|
2016-10-15 23:49:35 +02:00
|
|
|
|
2019-12-27 23:13:24 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
2016-10-15 23:49:35 +02:00
|
|
|
// Appearance
|
|
|
|
caretSize: 5,
|
2019-12-27 23:13:24 +01:00
|
|
|
caretPadding: 2,
|
2016-10-15 23:49:35 +02:00
|
|
|
cornerRadius: 6,
|
|
|
|
backgroundColor: 'rgba(0,0,0,0.8)',
|
2019-12-27 23:13:24 +01:00
|
|
|
multiKeyBackground: '#fff',
|
|
|
|
displayColors: true
|
|
|
|
}));
|
|
|
|
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.opacity).toEqual(1);
|
|
|
|
expect(tooltip.title).toEqual(['Point 2']);
|
|
|
|
expect(tooltip.beforeBody).toEqual([]);
|
|
|
|
expect(tooltip.body).toEqual([{
|
|
|
|
before: [],
|
|
|
|
lines: ['Dataset 1: 20'],
|
|
|
|
after: []
|
|
|
|
}]);
|
|
|
|
expect(tooltip.afterBody).toEqual([]);
|
|
|
|
expect(tooltip.footer).toEqual([]);
|
|
|
|
expect(tooltip.labelTextColors).toEqual(['#fff']);
|
|
|
|
|
|
|
|
expect(tooltip.labelColors).toEqual([{
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-05-21 23:07:06 +02:00
|
|
|
}]);
|
2016-05-28 21:26:46 +02:00
|
|
|
|
2019-12-27 23:13:24 +01:00
|
|
|
expect(tooltip.x).toBeCloseToPixel(267);
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.y).toBeCloseToPixel(312);
|
2016-10-15 23:49:35 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
done();
|
2016-10-15 23:49:35 +02:00
|
|
|
});
|
2020-01-14 13:34:08 +01:00
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', point);
|
2016-05-28 21:26:46 +02:00
|
|
|
});
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
it('Should display information from user callbacks', function(done) {
|
2017-01-28 12:52:40 +01:00
|
|
|
var chart = window.acquireChart({
|
2016-05-28 21:26:46 +02:00
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'index',
|
|
|
|
callbacks: {
|
|
|
|
beforeTitle: function() {
|
|
|
|
return 'beforeTitle';
|
|
|
|
},
|
|
|
|
title: function() {
|
|
|
|
return 'title';
|
|
|
|
},
|
|
|
|
afterTitle: function() {
|
|
|
|
return 'afterTitle';
|
|
|
|
},
|
|
|
|
beforeBody: function() {
|
|
|
|
return 'beforeBody';
|
|
|
|
},
|
|
|
|
beforeLabel: function() {
|
|
|
|
return 'beforeLabel';
|
|
|
|
},
|
|
|
|
label: function() {
|
|
|
|
return 'label';
|
|
|
|
},
|
|
|
|
afterLabel: function() {
|
|
|
|
return 'afterLabel';
|
|
|
|
},
|
|
|
|
afterBody: function() {
|
|
|
|
return 'afterBody';
|
|
|
|
},
|
|
|
|
beforeFooter: function() {
|
|
|
|
return 'beforeFooter';
|
|
|
|
},
|
|
|
|
footer: function() {
|
|
|
|
return 'footer';
|
|
|
|
},
|
|
|
|
afterFooter: function() {
|
|
|
|
return 'afterFooter';
|
|
|
|
},
|
|
|
|
labelTextColor: function() {
|
|
|
|
return 'labelTextColor';
|
|
|
|
},
|
|
|
|
labelPointStyle: function() {
|
|
|
|
return {
|
|
|
|
pointStyle: 'labelPointStyle',
|
|
|
|
rotation: 42
|
|
|
|
};
|
|
|
|
}
|
2016-05-28 21:26:46 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2016-06-08 03:22:47 +02:00
|
|
|
// Trigger an event over top of the
|
2017-01-28 12:52:40 +01:00
|
|
|
var meta = chart.getDatasetMeta(0);
|
2016-05-28 21:26:46 +02:00
|
|
|
var point = meta.data[1];
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
// Check and see if tooltip was displayed
|
|
|
|
var tooltip = chart.tooltip;
|
|
|
|
var defaults = Chart.defaults;
|
2016-05-28 21:26:46 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.options.xPadding).toEqual(6);
|
|
|
|
expect(tooltip.options.yPadding).toEqual(6);
|
2020-10-18 15:51:48 +02:00
|
|
|
expect(tooltip.xAlign).toEqual('left');
|
|
|
|
expect(tooltip.yAlign).toEqual('center');
|
2020-01-14 13:34:08 +01:00
|
|
|
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.options.bodyFont).toEqual(jasmine.objectContaining({
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: defaults.font.style,
|
|
|
|
size: defaults.font.size,
|
|
|
|
}));
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
bodyAlign: 'left',
|
|
|
|
bodySpacing: 2,
|
|
|
|
}));
|
2016-05-28 21:26:46 +02:00
|
|
|
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.options.titleFont).toEqual(jasmine.objectContaining({
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: 'bold',
|
|
|
|
size: defaults.font.size,
|
|
|
|
}));
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
titleSpacing: 2,
|
|
|
|
titleMarginBottom: 6,
|
|
|
|
}));
|
2016-05-28 21:26:46 +02:00
|
|
|
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.options.footerFont).toEqual(jasmine.objectContaining({
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: 'bold',
|
|
|
|
size: defaults.font.size,
|
|
|
|
}));
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
footerAlign: 'left',
|
|
|
|
footerSpacing: 2,
|
|
|
|
footerMarginTop: 6,
|
|
|
|
}));
|
2016-05-28 21:26:46 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
// Appearance
|
|
|
|
caretSize: 5,
|
|
|
|
caretPadding: 2,
|
|
|
|
cornerRadius: 6,
|
|
|
|
backgroundColor: 'rgba(0,0,0,0.8)',
|
|
|
|
multiKeyBackground: '#fff',
|
|
|
|
}));
|
|
|
|
|
|
|
|
expect(tooltip).toEqual(jasmine.objectContaining({
|
|
|
|
opacity: 1,
|
|
|
|
|
|
|
|
// Text
|
|
|
|
title: ['beforeTitle', 'title', 'afterTitle'],
|
|
|
|
beforeBody: ['beforeBody'],
|
|
|
|
body: [{
|
|
|
|
before: ['beforeLabel'],
|
|
|
|
lines: ['label'],
|
|
|
|
after: ['afterLabel']
|
|
|
|
}, {
|
|
|
|
before: ['beforeLabel'],
|
|
|
|
lines: ['label'],
|
|
|
|
after: ['afterLabel']
|
|
|
|
}],
|
|
|
|
afterBody: ['afterBody'],
|
|
|
|
footer: ['beforeFooter', 'footer', 'afterFooter'],
|
|
|
|
labelTextColors: ['labelTextColor', 'labelTextColor'],
|
|
|
|
labelColors: [{
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-01-14 13:34:08 +01:00
|
|
|
}, {
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-10-29 21:55:40 +01:00
|
|
|
}],
|
|
|
|
labelPointStyles: [{
|
|
|
|
pointStyle: 'labelPointStyle',
|
|
|
|
rotation: 42
|
|
|
|
}, {
|
|
|
|
pointStyle: 'labelPointStyle',
|
|
|
|
rotation: 42
|
2020-01-14 13:34:08 +01:00
|
|
|
}]
|
|
|
|
}));
|
|
|
|
|
2020-10-18 15:51:48 +02:00
|
|
|
expect(tooltip.x).toBeCloseToPixel(267);
|
|
|
|
expect(tooltip.y).toBeCloseToPixel(75);
|
2020-01-14 13:34:08 +01:00
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', point);
|
2016-05-28 21:26:46 +02:00
|
|
|
});
|
2016-05-29 02:47:36 +02:00
|
|
|
|
2020-07-14 23:40:32 +02:00
|
|
|
|
|
|
|
it('Should provide context object to user callbacks', function(done) {
|
|
|
|
const chart = window.acquireChart({
|
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [{x: 1, y: 10}, {x: 2, y: 20}, {x: 3, y: 30}]
|
|
|
|
}]
|
|
|
|
},
|
|
|
|
options: {
|
|
|
|
scales: {
|
|
|
|
x: {
|
|
|
|
type: 'linear'
|
|
|
|
}
|
|
|
|
},
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'index',
|
|
|
|
callbacks: {
|
|
|
|
beforeLabel: function(ctx) {
|
|
|
|
return ctx.dataPoint.x + ',' + ctx.dataPoint.y;
|
|
|
|
}
|
2020-07-14 23:40:32 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Trigger an event over top of the
|
|
|
|
const meta = chart.getDatasetMeta(0);
|
|
|
|
const point = meta.data[1];
|
|
|
|
|
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
const tooltip = chart.tooltip;
|
|
|
|
|
|
|
|
expect(tooltip.body[0].before).toEqual(['2,20']);
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', point);
|
|
|
|
});
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
it('Should allow sorting items', function(done) {
|
2017-01-28 12:52:40 +01:00
|
|
|
var chart = window.acquireChart({
|
2016-05-29 02:47:36 +02:00
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'index',
|
|
|
|
itemSort: function(a, b) {
|
|
|
|
return a.datasetIndex > b.datasetIndex ? -1 : 1;
|
|
|
|
}
|
2016-05-29 02:47:36 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2016-06-08 03:22:47 +02:00
|
|
|
// Trigger an event over top of the
|
2017-01-28 12:52:40 +01:00
|
|
|
var meta0 = chart.getDatasetMeta(0);
|
2016-05-29 02:47:36 +02:00
|
|
|
var point0 = meta0.data[1];
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
// Check and see if tooltip was displayed
|
|
|
|
var tooltip = chart.tooltip;
|
|
|
|
var defaults = Chart.defaults;
|
2016-05-29 02:47:36 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip).toEqual(jasmine.objectContaining({
|
|
|
|
// Positioning
|
|
|
|
xAlign: 'left',
|
|
|
|
yAlign: 'center',
|
2016-05-29 02:47:36 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
// Text
|
|
|
|
title: ['Point 2'],
|
|
|
|
beforeBody: [],
|
|
|
|
body: [{
|
|
|
|
before: [],
|
|
|
|
lines: ['Dataset 2: 40'],
|
|
|
|
after: []
|
|
|
|
}, {
|
|
|
|
before: [],
|
|
|
|
lines: ['Dataset 1: 20'],
|
|
|
|
after: []
|
|
|
|
}],
|
|
|
|
afterBody: [],
|
|
|
|
footer: [],
|
|
|
|
labelColors: [{
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-01-14 13:34:08 +01:00
|
|
|
}, {
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-01-14 13:34:08 +01:00
|
|
|
}]
|
|
|
|
}));
|
2016-05-29 02:47:36 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.x).toBeCloseToPixel(267);
|
|
|
|
expect(tooltip.y).toBeCloseToPixel(155);
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', point0);
|
2016-06-08 03:22:47 +02:00
|
|
|
|
2019-10-23 01:14:54 +02:00
|
|
|
});
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
it('Should allow reversing items', function(done) {
|
2019-10-23 01:14:54 +02:00
|
|
|
var chart = window.acquireChart({
|
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'index',
|
|
|
|
reverse: true
|
|
|
|
}
|
2019-10-23 01:14:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Trigger an event over top of the
|
|
|
|
var meta0 = chart.getDatasetMeta(0);
|
|
|
|
var point0 = meta0.data[1];
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
// Check and see if tooltip was displayed
|
|
|
|
var tooltip = chart.tooltip;
|
|
|
|
var defaults = Chart.defaults;
|
2019-10-23 01:14:54 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip).toEqual(jasmine.objectContaining({
|
|
|
|
// Positioning
|
|
|
|
xAlign: 'left',
|
|
|
|
yAlign: 'center',
|
2019-10-23 01:14:54 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
// Text
|
|
|
|
title: ['Point 2'],
|
|
|
|
beforeBody: [],
|
|
|
|
body: [{
|
|
|
|
before: [],
|
|
|
|
lines: ['Dataset 2: 40'],
|
|
|
|
after: []
|
|
|
|
}, {
|
|
|
|
before: [],
|
|
|
|
lines: ['Dataset 1: 20'],
|
|
|
|
after: []
|
|
|
|
}],
|
|
|
|
afterBody: [],
|
|
|
|
footer: [],
|
|
|
|
labelColors: [{
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-01-14 13:34:08 +01:00
|
|
|
}, {
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-01-14 13:34:08 +01:00
|
|
|
}]
|
|
|
|
}));
|
2019-10-23 01:14:54 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.x).toBeCloseToPixel(267);
|
|
|
|
expect(tooltip.y).toBeCloseToPixel(155);
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
2019-10-23 01:14:54 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', point0);
|
2019-10-23 01:14:54 +02:00
|
|
|
});
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
it('Should follow dataset order', function(done) {
|
2019-10-23 01:14:54 +02:00
|
|
|
var chart = window.acquireChart({
|
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)',
|
|
|
|
order: 10
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)',
|
|
|
|
order: 5
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'index'
|
|
|
|
}
|
2019-10-23 01:14:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Trigger an event over top of the
|
|
|
|
var meta0 = chart.getDatasetMeta(0);
|
|
|
|
var point0 = meta0.data[1];
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
// Check and see if tooltip was displayed
|
|
|
|
var tooltip = chart.tooltip;
|
|
|
|
var defaults = Chart.defaults;
|
2019-10-23 01:14:54 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip).toEqual(jasmine.objectContaining({
|
|
|
|
// Positioning
|
|
|
|
xAlign: 'left',
|
|
|
|
yAlign: 'center',
|
2019-10-23 01:14:54 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
// Text
|
|
|
|
title: ['Point 2'],
|
|
|
|
beforeBody: [],
|
|
|
|
body: [{
|
|
|
|
before: [],
|
|
|
|
lines: ['Dataset 2: 40'],
|
|
|
|
after: []
|
|
|
|
}, {
|
|
|
|
before: [],
|
|
|
|
lines: ['Dataset 1: 20'],
|
|
|
|
after: []
|
|
|
|
}],
|
|
|
|
afterBody: [],
|
|
|
|
footer: [],
|
|
|
|
labelColors: [{
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-01-14 13:34:08 +01:00
|
|
|
}, {
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-01-14 13:34:08 +01:00
|
|
|
}]
|
|
|
|
}));
|
2019-10-23 01:14:54 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.x).toBeCloseToPixel(267);
|
|
|
|
expect(tooltip.y).toBeCloseToPixel(155);
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
2019-10-23 01:14:54 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', point0);
|
2016-05-29 02:47:36 +02:00
|
|
|
});
|
2016-10-19 15:48:17 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
it('should filter items from the tooltip using the callback', function(done) {
|
2017-01-28 12:52:40 +01:00
|
|
|
var chart = window.acquireChart({
|
2016-10-21 03:49:13 +02:00
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)',
|
|
|
|
tooltipHidden: true
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'index',
|
|
|
|
filter: function(tooltipItem, index, tooltipItems, data) {
|
|
|
|
// For testing purposes remove the first dataset that has a tooltipHidden property
|
|
|
|
return !data.datasets[tooltipItem.datasetIndex].tooltipHidden;
|
|
|
|
}
|
2016-10-21 03:49:13 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Trigger an event over top of the
|
2017-01-28 12:52:40 +01:00
|
|
|
var meta0 = chart.getDatasetMeta(0);
|
2016-10-21 03:49:13 +02:00
|
|
|
var point0 = meta0.data[1];
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
// Check and see if tooltip was displayed
|
|
|
|
var tooltip = chart.tooltip;
|
|
|
|
var defaults = Chart.defaults;
|
2016-10-21 03:49:13 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip).toEqual(jasmine.objectContaining({
|
|
|
|
// Positioning
|
|
|
|
xAlign: 'left',
|
|
|
|
yAlign: 'center',
|
2016-10-21 03:49:13 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
// Text
|
|
|
|
title: ['Point 2'],
|
|
|
|
beforeBody: [],
|
|
|
|
body: [{
|
|
|
|
before: [],
|
|
|
|
lines: ['Dataset 2: 40'],
|
|
|
|
after: []
|
|
|
|
}],
|
|
|
|
afterBody: [],
|
|
|
|
footer: [],
|
|
|
|
labelColors: [{
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-01-14 13:34:08 +01:00
|
|
|
}]
|
|
|
|
}));
|
2016-10-21 03:49:13 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
done();
|
|
|
|
});
|
2016-10-21 03:49:13 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', point0);
|
2016-10-21 03:49:13 +02:00
|
|
|
});
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
it('should set the caretPadding based on a config setting', function(done) {
|
2017-03-28 02:19:57 +02:00
|
|
|
var chart = window.acquireChart({
|
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)',
|
|
|
|
tooltipHidden: true
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
caretPadding: 10
|
|
|
|
}
|
2017-03-28 02:19:57 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Trigger an event over top of the
|
|
|
|
var meta0 = chart.getDatasetMeta(0);
|
|
|
|
var point0 = meta0.data[1];
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
// Check and see if tooltip was displayed
|
|
|
|
var tooltip = chart.tooltip;
|
2017-03-28 02:19:57 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
// Positioning
|
|
|
|
caretPadding: 10,
|
|
|
|
}));
|
2017-03-28 02:19:57 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
done();
|
|
|
|
});
|
2017-03-28 02:19:57 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', point0);
|
2017-03-28 02:19:57 +02:00
|
|
|
});
|
|
|
|
|
2020-06-18 23:35:52 +02:00
|
|
|
['line', 'bar'].forEach(function(type) {
|
2020-01-14 13:34:08 +01:00
|
|
|
it('Should have dataPoints in a ' + type + ' chart', function(done) {
|
2019-02-01 09:21:53 +01:00
|
|
|
var chart = window.acquireChart({
|
|
|
|
type: type,
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'nearest',
|
|
|
|
intersect: true
|
|
|
|
}
|
2019-02-01 09:21:53 +01:00
|
|
|
}
|
2016-10-19 15:48:17 +02:00
|
|
|
}
|
2019-02-01 09:21:53 +01:00
|
|
|
});
|
2016-10-19 15:48:17 +02:00
|
|
|
|
2019-02-01 09:21:53 +01:00
|
|
|
// Trigger an event over top of the element
|
|
|
|
var pointIndex = 1;
|
|
|
|
var datasetIndex = 0;
|
2019-02-10 15:12:55 +01:00
|
|
|
var point = chart.getDatasetMeta(datasetIndex).data[pointIndex];
|
2016-10-19 15:48:17 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
// Check and see if tooltip was displayed
|
|
|
|
var tooltip = chart.tooltip;
|
|
|
|
|
|
|
|
expect(tooltip instanceof Object).toBe(true);
|
|
|
|
expect(tooltip.dataPoints instanceof Array).toBe(true);
|
|
|
|
expect(tooltip.dataPoints.length).toBe(1);
|
2016-10-19 15:48:17 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
var tooltipItem = tooltip.dataPoints[0];
|
2019-02-01 09:21:53 +01:00
|
|
|
|
2020-07-13 00:26:13 +02:00
|
|
|
expect(tooltipItem.dataIndex).toBe(pointIndex);
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltipItem.datasetIndex).toBe(datasetIndex);
|
|
|
|
expect(typeof tooltipItem.label).toBe('string');
|
|
|
|
expect(tooltipItem.label).toBe(chart.data.labels[pointIndex]);
|
2020-07-14 23:40:32 +02:00
|
|
|
expect(typeof tooltipItem.formattedValue).toBe('string');
|
|
|
|
expect(tooltipItem.formattedValue).toBe('' + chart.data.datasets[datasetIndex].data[pointIndex]);
|
2019-02-01 09:21:53 +01:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
done();
|
|
|
|
});
|
|
|
|
|
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', point);
|
2019-02-01 09:21:53 +01:00
|
|
|
});
|
2016-10-19 15:48:17 +02:00
|
|
|
});
|
2017-02-11 00:51:37 +01:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
it('Should not update if active element has not changed', function(done) {
|
2017-02-11 00:51:37 +01:00
|
|
|
var chart = window.acquireChart({
|
2017-11-14 13:56:45 +01:00
|
|
|
type: 'line',
|
2017-02-11 00:51:37 +01:00
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'nearest',
|
|
|
|
intersect: true,
|
|
|
|
callbacks: {
|
|
|
|
title: function() {
|
|
|
|
return 'registering callback...';
|
|
|
|
}
|
2017-02-11 00:51:37 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Trigger an event over top of the
|
|
|
|
var meta = chart.getDatasetMeta(0);
|
|
|
|
var firstPoint = meta.data[1];
|
|
|
|
|
|
|
|
var tooltip = chart.tooltip;
|
2020-06-25 19:51:34 +02:00
|
|
|
spyOn(tooltip, 'update').and.callThrough();
|
2017-02-11 00:51:37 +01:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
expect(tooltip.update).toHaveBeenCalledWith(true);
|
2017-02-11 00:51:37 +01:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
// Reset calls
|
|
|
|
tooltip.update.calls.reset();
|
2017-02-11 00:51:37 +01:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
expect(tooltip.update).not.toHaveBeenCalled();
|
2017-02-11 00:51:37 +01:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
done();
|
|
|
|
});
|
|
|
|
// Second dispatch change event (same event), should not update tooltip
|
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', firstPoint);
|
|
|
|
});
|
|
|
|
// First dispatch change event, should update tooltip
|
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', firstPoint);
|
2017-02-11 00:51:37 +01:00
|
|
|
});
|
2017-10-11 00:33:25 +02:00
|
|
|
|
2020-06-25 19:51:34 +02:00
|
|
|
it('Should update if active elements are the same, but the position has changed', function(done) {
|
|
|
|
const chart = window.acquireChart({
|
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
|
|
|
scales: {
|
|
|
|
x: {
|
|
|
|
stacked: true,
|
|
|
|
},
|
|
|
|
y: {
|
|
|
|
stacked: true
|
|
|
|
}
|
|
|
|
},
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'nearest',
|
|
|
|
position: 'nearest',
|
|
|
|
intersect: true,
|
|
|
|
callbacks: {
|
|
|
|
title: function() {
|
|
|
|
return 'registering callback...';
|
|
|
|
}
|
2020-06-25 19:51:34 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Trigger an event over top of the
|
|
|
|
const meta = chart.getDatasetMeta(0);
|
|
|
|
const firstPoint = meta.data[1];
|
|
|
|
|
|
|
|
const meta2 = chart.getDatasetMeta(1);
|
|
|
|
const secondPoint = meta2.data[1];
|
|
|
|
|
|
|
|
const tooltip = chart.tooltip;
|
|
|
|
spyOn(tooltip, 'update');
|
|
|
|
|
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
expect(tooltip.update).toHaveBeenCalledWith(true);
|
|
|
|
|
|
|
|
// Reset calls
|
|
|
|
tooltip.update.calls.reset();
|
|
|
|
|
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
expect(tooltip.update).toHaveBeenCalledWith(true);
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
// Second dispatch change event (same event), should update tooltip
|
|
|
|
// because position mode is 'nearest'
|
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', secondPoint);
|
|
|
|
});
|
|
|
|
// First dispatch change event, should update tooltip
|
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', firstPoint);
|
|
|
|
});
|
|
|
|
|
2017-10-11 00:33:25 +02:00
|
|
|
describe('positioners', function() {
|
2020-01-14 13:34:08 +01:00
|
|
|
it('Should call custom positioner with correct parameters and scope', function(done) {
|
2017-10-11 00:33:25 +02:00
|
|
|
|
2020-01-21 12:36:53 +01:00
|
|
|
tooltipPlugin.positioners.test = function() {
|
2017-10-11 00:33:25 +02:00
|
|
|
return {x: 0, y: 0};
|
|
|
|
};
|
|
|
|
|
2020-01-21 12:36:53 +01:00
|
|
|
spyOn(tooltipPlugin.positioners, 'test').and.callThrough();
|
2017-10-11 00:33:25 +02:00
|
|
|
|
|
|
|
var chart = window.acquireChart({
|
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'nearest',
|
|
|
|
position: 'test'
|
|
|
|
}
|
2017-10-11 00:33:25 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Trigger an event over top of the
|
|
|
|
var pointIndex = 1;
|
|
|
|
var datasetIndex = 0;
|
|
|
|
var meta = chart.getDatasetMeta(datasetIndex);
|
|
|
|
var point = meta.data[pointIndex];
|
2020-01-21 12:36:53 +01:00
|
|
|
var fn = tooltipPlugin.positioners.test;
|
2017-10-11 00:33:25 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
2020-06-25 19:51:34 +02:00
|
|
|
expect(fn.calls.count()).toBe(2);
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(fn.calls.first().args[0] instanceof Array).toBe(true);
|
|
|
|
expect(Object.prototype.hasOwnProperty.call(fn.calls.first().args[1], 'x')).toBe(true);
|
|
|
|
expect(Object.prototype.hasOwnProperty.call(fn.calls.first().args[1], 'y')).toBe(true);
|
2020-01-21 12:36:53 +01:00
|
|
|
expect(fn.calls.first().object instanceof Tooltip).toBe(true);
|
2017-10-11 00:33:25 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
done();
|
|
|
|
});
|
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', point);
|
2017-10-11 00:33:25 +02:00
|
|
|
});
|
|
|
|
});
|
2017-11-12 00:02:05 +01:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
it('Should avoid tooltip truncation in x axis if there is enough space to show tooltip without truncation', function(done) {
|
2017-11-12 00:02:05 +01:00
|
|
|
var chart = window.acquireChart({
|
|
|
|
type: 'pie',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
data: [
|
|
|
|
50,
|
|
|
|
50
|
|
|
|
],
|
|
|
|
backgroundColor: [
|
|
|
|
'rgb(255, 0, 0)',
|
|
|
|
'rgb(0, 255, 0)'
|
|
|
|
],
|
|
|
|
label: 'Dataset 1'
|
|
|
|
}],
|
|
|
|
labels: [
|
|
|
|
'Red long tooltip text to avoid unnecessary loop steps',
|
|
|
|
'Green long tooltip text to avoid unnecessary loop steps'
|
|
|
|
]
|
|
|
|
},
|
|
|
|
options: {
|
|
|
|
responsive: true,
|
|
|
|
animation: {
|
|
|
|
// without this slice center point is calculated wrong
|
|
|
|
animateRotate: false
|
2019-12-27 23:13:24 +01:00
|
|
|
},
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
animation: false
|
|
|
|
}
|
2017-11-12 00:02:05 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
function testSlice(slice, count) {
|
2017-11-12 00:02:05 +01:00
|
|
|
var meta = chart.getDatasetMeta(0);
|
|
|
|
var point = meta.data[slice].getCenterPoint();
|
|
|
|
var tooltipPosition = meta.data[slice].tooltipPosition();
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
function recursive(left) {
|
2020-05-27 00:10:28 +02:00
|
|
|
chart.config.data.labels[slice] = chart.config.data.labels[slice] + 'XX';
|
2017-11-12 00:02:05 +01:00
|
|
|
chart.update();
|
2020-01-14 13:34:08 +01:00
|
|
|
|
|
|
|
afterEvent(chart, 'mouseout', function() {
|
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
var tooltip = chart.tooltip;
|
|
|
|
expect(tooltip.dataPoints.length).toBe(1);
|
|
|
|
expect(tooltip.x).toBeGreaterThanOrEqual(0);
|
|
|
|
if (tooltip.width <= chart.width) {
|
|
|
|
expect(tooltip.x + tooltip.width).toBeLessThanOrEqual(chart.width);
|
|
|
|
}
|
|
|
|
expect(tooltip.caretX).toBeCloseToPixel(tooltipPosition.x);
|
|
|
|
// if tooltip is longer than chart area then all tests done
|
|
|
|
if (tooltip.width > chart.width || left === 0) {
|
|
|
|
done(left === 0 && new Error('max iterations reached'));
|
|
|
|
} else {
|
|
|
|
recursive(left - 1);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', point);
|
|
|
|
});
|
|
|
|
|
|
|
|
jasmine.triggerMouseEvent(chart, 'mouseout', point);
|
2017-11-12 00:02:05 +01:00
|
|
|
}
|
2020-01-14 13:34:08 +01:00
|
|
|
|
|
|
|
recursive(count);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Trigger an event over top of the slice
|
|
|
|
for (var slice = 0; slice < 2; slice++) {
|
2020-05-27 00:10:28 +02:00
|
|
|
testSlice(slice, 20);
|
2017-11-12 00:02:05 +01:00
|
|
|
}
|
|
|
|
});
|
2018-06-05 09:14:37 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
it('Should split newlines into separate lines in user callbacks', function(done) {
|
2018-06-05 09:14:37 +02:00
|
|
|
var chart = window.acquireChart({
|
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}, {
|
|
|
|
label: 'Dataset 2',
|
|
|
|
data: [40, 40, 40],
|
|
|
|
pointHoverBorderColor: 'rgb(0, 0, 255)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
mode: 'index',
|
|
|
|
callbacks: {
|
|
|
|
beforeTitle: function() {
|
|
|
|
return 'beforeTitle\nnewline';
|
|
|
|
},
|
|
|
|
title: function() {
|
|
|
|
return 'title\nnewline';
|
|
|
|
},
|
|
|
|
afterTitle: function() {
|
|
|
|
return 'afterTitle\nnewline';
|
|
|
|
},
|
|
|
|
beforeBody: function() {
|
|
|
|
return 'beforeBody\nnewline';
|
|
|
|
},
|
|
|
|
beforeLabel: function() {
|
|
|
|
return 'beforeLabel\nnewline';
|
|
|
|
},
|
|
|
|
label: function() {
|
|
|
|
return 'label';
|
|
|
|
},
|
|
|
|
afterLabel: function() {
|
|
|
|
return 'afterLabel\nnewline';
|
|
|
|
},
|
|
|
|
afterBody: function() {
|
|
|
|
return 'afterBody\nnewline';
|
|
|
|
},
|
|
|
|
beforeFooter: function() {
|
|
|
|
return 'beforeFooter\nnewline';
|
|
|
|
},
|
|
|
|
footer: function() {
|
|
|
|
return 'footer\nnewline';
|
|
|
|
},
|
|
|
|
afterFooter: function() {
|
|
|
|
return 'afterFooter\nnewline';
|
|
|
|
},
|
|
|
|
labelTextColor: function() {
|
|
|
|
return 'labelTextColor';
|
|
|
|
}
|
2018-06-05 09:14:37 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Trigger an event over top of the
|
|
|
|
var meta = chart.getDatasetMeta(0);
|
|
|
|
var point = meta.data[1];
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
afterEvent(chart, 'mousemove', function() {
|
|
|
|
// Check and see if tooltip was displayed
|
|
|
|
var tooltip = chart.tooltip;
|
|
|
|
var defaults = Chart.defaults;
|
|
|
|
|
|
|
|
expect(tooltip.options.xPadding).toEqual(6);
|
|
|
|
expect(tooltip.options.yPadding).toEqual(6);
|
|
|
|
expect(tooltip.xAlign).toEqual('center');
|
|
|
|
expect(tooltip.yAlign).toEqual('top');
|
2018-06-05 09:14:37 +02:00
|
|
|
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.options.bodyFont).toEqual(jasmine.objectContaining({
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: defaults.font.style,
|
|
|
|
size: defaults.font.size,
|
|
|
|
}));
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
bodyAlign: 'left',
|
|
|
|
bodySpacing: 2,
|
|
|
|
}));
|
|
|
|
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.options.titleFont).toEqual(jasmine.objectContaining({
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: 'bold',
|
|
|
|
size: defaults.font.size,
|
|
|
|
}));
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
titleAlign: 'left',
|
|
|
|
titleSpacing: 2,
|
|
|
|
titleMarginBottom: 6,
|
|
|
|
}));
|
|
|
|
|
2020-05-21 23:07:06 +02:00
|
|
|
expect(tooltip.options.footerFont).toEqual(jasmine.objectContaining({
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: 'bold',
|
|
|
|
size: defaults.font.size,
|
|
|
|
}));
|
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
footerAlign: 'left',
|
|
|
|
footerSpacing: 2,
|
|
|
|
footerMarginTop: 6,
|
|
|
|
}));
|
|
|
|
|
|
|
|
expect(tooltip.options).toEqual(jasmine.objectContaining({
|
|
|
|
// Appearance
|
|
|
|
caretSize: 5,
|
|
|
|
caretPadding: 2,
|
|
|
|
cornerRadius: 6,
|
|
|
|
backgroundColor: 'rgba(0,0,0,0.8)',
|
|
|
|
multiKeyBackground: '#fff',
|
|
|
|
}));
|
|
|
|
|
|
|
|
expect(tooltip).toEqual(jasmine.objectContaining({
|
|
|
|
opacity: 1,
|
|
|
|
|
|
|
|
// Text
|
|
|
|
title: ['beforeTitle', 'newline', 'title', 'newline', 'afterTitle', 'newline'],
|
|
|
|
beforeBody: ['beforeBody', 'newline'],
|
|
|
|
body: [{
|
|
|
|
before: ['beforeLabel', 'newline'],
|
|
|
|
lines: ['label'],
|
|
|
|
after: ['afterLabel', 'newline']
|
|
|
|
}, {
|
|
|
|
before: ['beforeLabel', 'newline'],
|
|
|
|
lines: ['label'],
|
|
|
|
after: ['afterLabel', 'newline']
|
|
|
|
}],
|
|
|
|
afterBody: ['afterBody', 'newline'],
|
|
|
|
footer: ['beforeFooter', 'newline', 'footer', 'newline', 'afterFooter', 'newline'],
|
|
|
|
labelTextColors: ['labelTextColor', 'labelTextColor'],
|
|
|
|
labelColors: [{
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-01-14 13:34:08 +01:00
|
|
|
}, {
|
2020-11-19 19:59:24 +01:00
|
|
|
borderColor: defaults.borderColor,
|
|
|
|
backgroundColor: defaults.backgroundColor
|
2020-01-14 13:34:08 +01:00
|
|
|
}]
|
|
|
|
}));
|
|
|
|
|
|
|
|
done();
|
|
|
|
});
|
2018-06-05 09:14:37 +02:00
|
|
|
|
2020-01-14 13:34:08 +01:00
|
|
|
jasmine.triggerMouseEvent(chart, 'mousemove', point);
|
2018-06-05 09:14:37 +02:00
|
|
|
});
|
2019-01-08 13:37:36 +01:00
|
|
|
|
|
|
|
describe('text align', function() {
|
2020-01-03 20:07:38 +01:00
|
|
|
var defaults = Chart.defaults;
|
2019-01-08 13:37:36 +01:00
|
|
|
var makeView = function(title, body, footer) {
|
|
|
|
return {
|
|
|
|
// Positioning
|
|
|
|
x: 100,
|
|
|
|
y: 100,
|
|
|
|
width: 100,
|
|
|
|
height: 100,
|
|
|
|
xAlign: 'left',
|
|
|
|
yAlign: 'top',
|
|
|
|
|
2019-12-27 23:13:24 +01:00
|
|
|
options: {
|
2020-12-31 07:46:23 +01:00
|
|
|
enabled: true,
|
|
|
|
|
2019-12-27 23:13:24 +01:00
|
|
|
xPadding: 5,
|
|
|
|
yPadding: 5,
|
|
|
|
|
|
|
|
// Body
|
2020-05-21 23:07:06 +02:00
|
|
|
bodyFont: {
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: defaults.font.style,
|
|
|
|
size: defaults.font.size,
|
|
|
|
},
|
2020-12-31 07:46:23 +01:00
|
|
|
bodyColor: '#fff',
|
2019-12-27 23:13:24 +01:00
|
|
|
bodyAlign: body,
|
|
|
|
bodySpacing: 2,
|
|
|
|
|
|
|
|
// Title
|
2020-05-21 23:07:06 +02:00
|
|
|
titleFont: {
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: 'bold',
|
|
|
|
size: defaults.font.size,
|
|
|
|
},
|
2020-12-31 07:46:23 +01:00
|
|
|
titleColor: '#fff',
|
2019-12-27 23:13:24 +01:00
|
|
|
titleAlign: title,
|
|
|
|
titleSpacing: 2,
|
|
|
|
titleMarginBottom: 6,
|
|
|
|
|
|
|
|
// Footer
|
2020-05-21 23:07:06 +02:00
|
|
|
footerFont: {
|
|
|
|
family: defaults.font.family,
|
|
|
|
style: 'bold',
|
|
|
|
size: defaults.font.size,
|
|
|
|
},
|
2020-12-31 07:46:23 +01:00
|
|
|
footerColor: '#fff',
|
2019-12-27 23:13:24 +01:00
|
|
|
footerAlign: footer,
|
|
|
|
footerSpacing: 2,
|
|
|
|
footerMarginTop: 6,
|
|
|
|
|
|
|
|
// Appearance
|
|
|
|
caretSize: 5,
|
|
|
|
cornerRadius: 6,
|
|
|
|
caretPadding: 2,
|
|
|
|
borderColor: '#aaa',
|
|
|
|
borderWidth: 1,
|
|
|
|
backgroundColor: 'rgba(0,0,0,0.8)',
|
|
|
|
multiKeyBackground: '#fff',
|
|
|
|
displayColors: false
|
2019-01-08 13:37:36 +01:00
|
|
|
|
2019-12-27 23:13:24 +01:00
|
|
|
},
|
2019-01-08 13:37:36 +01:00
|
|
|
opacity: 1,
|
|
|
|
|
|
|
|
// Text
|
|
|
|
title: ['title'],
|
|
|
|
beforeBody: [],
|
|
|
|
body: [{
|
|
|
|
before: [],
|
|
|
|
lines: ['label'],
|
|
|
|
after: []
|
|
|
|
}],
|
|
|
|
afterBody: [],
|
|
|
|
footer: ['footer'],
|
|
|
|
labelTextColors: ['#fff'],
|
|
|
|
labelColors: [{
|
|
|
|
borderColor: 'rgb(255, 0, 0)',
|
|
|
|
backgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}, {
|
|
|
|
borderColor: 'rgb(0, 0, 255)',
|
|
|
|
backgroundColor: 'rgb(0, 255, 255)'
|
|
|
|
}]
|
|
|
|
};
|
|
|
|
};
|
|
|
|
var drawBody = [
|
|
|
|
{name: 'save', args: []},
|
|
|
|
{name: 'setFillStyle', args: ['rgba(0,0,0,0.8)']},
|
|
|
|
{name: 'setStrokeStyle', args: ['#aaa']},
|
|
|
|
{name: 'setLineWidth', args: [1]},
|
|
|
|
{name: 'beginPath', args: []},
|
|
|
|
{name: 'moveTo', args: [106, 100]},
|
|
|
|
{name: 'lineTo', args: [106, 100]},
|
|
|
|
{name: 'lineTo', args: [111, 95]},
|
|
|
|
{name: 'lineTo', args: [116, 100]},
|
|
|
|
{name: 'lineTo', args: [194, 100]},
|
|
|
|
{name: 'quadraticCurveTo', args: [200, 100, 200, 106]},
|
|
|
|
{name: 'lineTo', args: [200, 194]},
|
|
|
|
{name: 'quadraticCurveTo', args: [200, 200, 194, 200]},
|
|
|
|
{name: 'lineTo', args: [106, 200]},
|
|
|
|
{name: 'quadraticCurveTo', args: [100, 200, 100, 194]},
|
|
|
|
{name: 'lineTo', args: [100, 106]},
|
|
|
|
{name: 'quadraticCurveTo', args: [100, 100, 106, 100]},
|
|
|
|
{name: 'closePath', args: []},
|
|
|
|
{name: 'fill', args: []},
|
|
|
|
{name: 'stroke', args: []}
|
|
|
|
];
|
|
|
|
|
|
|
|
var mockContext = window.createMockContext();
|
2020-01-21 12:36:53 +01:00
|
|
|
var tooltip = new Tooltip({
|
2019-01-08 13:37:36 +01:00
|
|
|
_chart: {
|
2019-12-27 23:13:24 +01:00
|
|
|
options: {
|
2020-11-25 07:50:12 +01:00
|
|
|
plugins: {
|
|
|
|
tooltip: {
|
|
|
|
animation: false,
|
|
|
|
}
|
2019-12-27 23:13:24 +01:00
|
|
|
}
|
|
|
|
}
|
2019-01-08 13:37:36 +01:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Should go left', function() {
|
|
|
|
mockContext.resetCalls();
|
2019-12-27 23:13:24 +01:00
|
|
|
Chart.helpers.merge(tooltip, makeView('left', 'left', 'left'));
|
|
|
|
tooltip.draw(mockContext);
|
2019-01-08 13:37:36 +01:00
|
|
|
|
|
|
|
expect(mockContext.getCalls()).toEqual(Array.prototype.concat(drawBody, [
|
2019-04-02 10:25:37 +02:00
|
|
|
{name: 'setTextAlign', args: ['left']},
|
2020-12-26 17:23:02 +01:00
|
|
|
{name: 'setTextBaseline', args: ['middle']},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
2019-06-19 13:11:48 +02:00
|
|
|
{name: 'fillText', args: ['title', 105, 111]},
|
2019-04-02 10:25:37 +02:00
|
|
|
{name: 'setTextAlign', args: ['left']},
|
2020-12-26 17:23:02 +01:00
|
|
|
{name: 'setTextBaseline', args: ['middle']},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
2019-06-19 13:11:48 +02:00
|
|
|
{name: 'fillText', args: ['label', 105, 129]},
|
2019-04-02 10:25:37 +02:00
|
|
|
{name: 'setTextAlign', args: ['left']},
|
2020-12-26 17:23:02 +01:00
|
|
|
{name: 'setTextBaseline', args: ['middle']},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
2019-06-19 13:11:48 +02:00
|
|
|
{name: 'fillText', args: ['footer', 105, 147]},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'restore', args: []}
|
|
|
|
]));
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Should go right', function() {
|
|
|
|
mockContext.resetCalls();
|
2019-12-27 23:13:24 +01:00
|
|
|
Chart.helpers.merge(tooltip, makeView('right', 'right', 'right'));
|
|
|
|
tooltip.draw(mockContext);
|
2019-01-08 13:37:36 +01:00
|
|
|
|
|
|
|
expect(mockContext.getCalls()).toEqual(Array.prototype.concat(drawBody, [
|
2019-04-02 10:25:37 +02:00
|
|
|
{name: 'setTextAlign', args: ['right']},
|
2020-12-26 17:23:02 +01:00
|
|
|
{name: 'setTextBaseline', args: ['middle']},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
2019-06-19 13:11:48 +02:00
|
|
|
{name: 'fillText', args: ['title', 195, 111]},
|
2019-04-02 10:25:37 +02:00
|
|
|
{name: 'setTextAlign', args: ['right']},
|
2020-12-26 17:23:02 +01:00
|
|
|
{name: 'setTextBaseline', args: ['middle']},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
2019-06-19 13:11:48 +02:00
|
|
|
{name: 'fillText', args: ['label', 195, 129]},
|
2019-04-02 10:25:37 +02:00
|
|
|
{name: 'setTextAlign', args: ['right']},
|
2020-12-26 17:23:02 +01:00
|
|
|
{name: 'setTextBaseline', args: ['middle']},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
2019-06-19 13:11:48 +02:00
|
|
|
{name: 'fillText', args: ['footer', 195, 147]},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'restore', args: []}
|
|
|
|
]));
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Should center', function() {
|
|
|
|
mockContext.resetCalls();
|
2019-12-27 23:13:24 +01:00
|
|
|
Chart.helpers.merge(tooltip, makeView('center', 'center', 'center'));
|
|
|
|
tooltip.draw(mockContext);
|
2019-01-08 13:37:36 +01:00
|
|
|
|
|
|
|
expect(mockContext.getCalls()).toEqual(Array.prototype.concat(drawBody, [
|
2019-04-02 10:25:37 +02:00
|
|
|
{name: 'setTextAlign', args: ['center']},
|
2020-12-26 17:23:02 +01:00
|
|
|
{name: 'setTextBaseline', args: ['middle']},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
2019-06-19 13:11:48 +02:00
|
|
|
{name: 'fillText', args: ['title', 150, 111]},
|
2019-04-02 10:25:37 +02:00
|
|
|
{name: 'setTextAlign', args: ['center']},
|
2020-12-26 17:23:02 +01:00
|
|
|
{name: 'setTextBaseline', args: ['middle']},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
2019-06-19 13:11:48 +02:00
|
|
|
{name: 'fillText', args: ['label', 150, 129]},
|
2019-04-02 10:25:37 +02:00
|
|
|
{name: 'setTextAlign', args: ['center']},
|
2020-12-26 17:23:02 +01:00
|
|
|
{name: 'setTextBaseline', args: ['middle']},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
2019-06-19 13:11:48 +02:00
|
|
|
{name: 'fillText', args: ['footer', 150, 147]},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'restore', args: []}
|
|
|
|
]));
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Should allow mixed', function() {
|
|
|
|
mockContext.resetCalls();
|
2019-12-27 23:13:24 +01:00
|
|
|
Chart.helpers.merge(tooltip, makeView('right', 'center', 'left'));
|
|
|
|
tooltip.draw(mockContext);
|
2019-01-08 13:37:36 +01:00
|
|
|
|
|
|
|
expect(mockContext.getCalls()).toEqual(Array.prototype.concat(drawBody, [
|
2019-04-02 10:25:37 +02:00
|
|
|
{name: 'setTextAlign', args: ['right']},
|
2020-12-26 17:23:02 +01:00
|
|
|
{name: 'setTextBaseline', args: ['middle']},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
2019-06-19 13:11:48 +02:00
|
|
|
{name: 'fillText', args: ['title', 195, 111]},
|
2019-04-02 10:25:37 +02:00
|
|
|
{name: 'setTextAlign', args: ['center']},
|
2020-12-26 17:23:02 +01:00
|
|
|
{name: 'setTextBaseline', args: ['middle']},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
2019-06-19 13:11:48 +02:00
|
|
|
{name: 'fillText', args: ['label', 150, 129]},
|
2019-04-02 10:25:37 +02:00
|
|
|
{name: 'setTextAlign', args: ['left']},
|
2020-12-26 17:23:02 +01:00
|
|
|
{name: 'setTextBaseline', args: ['middle']},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'setFillStyle', args: ['#fff']},
|
2019-06-19 13:11:48 +02:00
|
|
|
{name: 'fillText', args: ['footer', 105, 147]},
|
2019-01-08 13:37:36 +01:00
|
|
|
{name: 'restore', args: []}
|
|
|
|
]));
|
|
|
|
});
|
|
|
|
});
|
2020-10-05 23:14:38 +02:00
|
|
|
|
|
|
|
describe('active events', function() {
|
|
|
|
it('should set the active events', function() {
|
|
|
|
var chart = window.acquireChart({
|
|
|
|
type: 'line',
|
|
|
|
data: {
|
|
|
|
datasets: [{
|
|
|
|
label: 'Dataset 1',
|
|
|
|
data: [10, 20, 30],
|
|
|
|
pointHoverBorderColor: 'rgb(255, 0, 0)',
|
|
|
|
pointHoverBackgroundColor: 'rgb(0, 255, 0)'
|
|
|
|
}],
|
|
|
|
labels: ['Point 1', 'Point 2', 'Point 3']
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
const meta = chart.getDatasetMeta(0);
|
|
|
|
chart.tooltip.setActiveElements([{datasetIndex: 0, index: 0}], {x: 0, y: 0});
|
|
|
|
expect(chart.tooltip.getActiveElements()[0].element).toBe(meta.data[0]);
|
|
|
|
});
|
|
|
|
});
|
2016-05-28 21:26:46 +02:00
|
|
|
});
|