mirror of
https://github.com/chartjs/Chart.js.git
synced 2026-01-25 16:42:06 +00:00
169 lines
7.4 KiB
JavaScript
169 lines
7.4 KiB
JavaScript
'use strict';
|
|
|
|
var defaults = require('../core/core.defaults');
|
|
var elements = require('../elements/index');
|
|
var helpers = require('../helpers/index');
|
|
|
|
defaults._set('radar', {
|
|
scale: {
|
|
type: 'radialLinear'
|
|
},
|
|
elements: {
|
|
line: {
|
|
tension: 0 // no bezier in radar
|
|
}
|
|
}
|
|
});
|
|
|
|
module.exports = function(Chart) {
|
|
|
|
Chart.controllers.radar = Chart.DatasetController.extend({
|
|
|
|
datasetElementType: elements.Line,
|
|
|
|
dataElementType: elements.Point,
|
|
|
|
linkScales: helpers.noop,
|
|
|
|
update: function(reset) {
|
|
var me = this;
|
|
var meta = me.getMeta();
|
|
var line = meta.dataset;
|
|
var points = meta.data;
|
|
var custom = line.custom || {};
|
|
var dataset = me.getDataset();
|
|
var lineElementOptions = me.chart.options.elements.line;
|
|
var scale = me.chart.scale;
|
|
|
|
// Compatibility: If the properties are defined with only the old name, use those values
|
|
if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {
|
|
dataset.lineTension = dataset.tension;
|
|
}
|
|
|
|
helpers.extend(meta.dataset, {
|
|
// Utility
|
|
_datasetIndex: me.index,
|
|
_scale: scale,
|
|
// Data
|
|
_children: points,
|
|
_loop: true,
|
|
// Model
|
|
_model: {
|
|
// Appearance
|
|
tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),
|
|
backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),
|
|
borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),
|
|
borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),
|
|
fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),
|
|
borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),
|
|
borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),
|
|
borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),
|
|
borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),
|
|
}
|
|
});
|
|
|
|
meta.dataset.pivot();
|
|
|
|
// Update Points
|
|
helpers.each(points, function(point, index) {
|
|
me.updateElement(point, index, reset);
|
|
}, me);
|
|
|
|
// Update bezier control points
|
|
me.updateBezierControlPoints();
|
|
},
|
|
updateElement: function(point, index, reset) {
|
|
var me = this;
|
|
var custom = point.custom || {};
|
|
var dataset = me.getDataset();
|
|
var scale = me.chart.scale;
|
|
var pointElementOptions = me.chart.options.elements.point;
|
|
var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);
|
|
|
|
// Compatibility: If the properties are defined with only the old name, use those values
|
|
if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {
|
|
dataset.pointRadius = dataset.radius;
|
|
}
|
|
if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {
|
|
dataset.pointHitRadius = dataset.hitRadius;
|
|
}
|
|
|
|
helpers.extend(point, {
|
|
// Utility
|
|
_datasetIndex: me.index,
|
|
_index: index,
|
|
_scale: scale,
|
|
|
|
// Desired view properties
|
|
_model: {
|
|
x: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales
|
|
y: reset ? scale.yCenter : pointPosition.y,
|
|
|
|
// Appearance
|
|
tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),
|
|
radius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),
|
|
backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),
|
|
borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),
|
|
borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),
|
|
pointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),
|
|
|
|
// Tooltip
|
|
hitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius)
|
|
}
|
|
});
|
|
|
|
point._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));
|
|
},
|
|
updateBezierControlPoints: function() {
|
|
var chartArea = this.chart.chartArea;
|
|
var meta = this.getMeta();
|
|
|
|
helpers.each(meta.data, function(point, index) {
|
|
var model = point._model;
|
|
var controlPoints = helpers.splineCurve(
|
|
helpers.previousItem(meta.data, index, true)._model,
|
|
model,
|
|
helpers.nextItem(meta.data, index, true)._model,
|
|
model.tension
|
|
);
|
|
|
|
// Prevent the bezier going outside of the bounds of the graph
|
|
model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);
|
|
model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);
|
|
|
|
model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);
|
|
model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);
|
|
|
|
// Now pivot the point for animation
|
|
point.pivot();
|
|
});
|
|
},
|
|
|
|
setHoverStyle: function(point) {
|
|
// Point
|
|
var dataset = this.chart.data.datasets[point._datasetIndex];
|
|
var custom = point.custom || {};
|
|
var index = point._index;
|
|
var model = point._model;
|
|
|
|
model.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);
|
|
model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));
|
|
model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));
|
|
model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);
|
|
},
|
|
|
|
removeHoverStyle: function(point) {
|
|
var dataset = this.chart.data.datasets[point._datasetIndex];
|
|
var custom = point.custom || {};
|
|
var index = point._index;
|
|
var model = point._model;
|
|
var pointElementOptions = this.chart.options.elements.point;
|
|
|
|
model.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius);
|
|
model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor);
|
|
model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor);
|
|
model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth);
|
|
}
|
|
});
|
|
};
|