Skip to content

Commit

Permalink
FLoat-bar support.
Browse files Browse the repository at this point in the history
_autoSkipp rolled back

minbarlength. float-bar

start fix

start fix

fix

fix

fixes

fix

fix

fix

fixes

unittests

comment removed

reverse of borderSkipped
  • Loading branch information
gwyneblaidd committed Mar 3, 2019
1 parent 35273ee commit c9f6167
Show file tree
Hide file tree
Showing 12 changed files with 258 additions and 40 deletions.
24 changes: 16 additions & 8 deletions src/controllers/controller.bar.js
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,10 @@ module.exports = DatasetController.extend({
label: me.chart.data.labels[index]
};

if (helpers.isArray(dataset.data[index])) {
rectangle._model.borderSkipped = null;
}

me._updateElementGeometry(rectangle, index, reset);

rectangle.pivot();
Expand Down Expand Up @@ -285,12 +289,13 @@ module.exports = DatasetController.extend({
var scale = me._getValueScale();
var isHorizontal = scale.isHorizontal();
var datasets = chart.data.datasets;
var value = +scale.getRightValue(datasets[datasetIndex].data[index]);
var value = scale._parseValue(datasets[datasetIndex].data[index]);
var minBarLength = scale.options.minBarLength;
var stacked = scale.options.stacked;
var stack = meta.stack;
var start = 0;
var i, imeta, ivalue, base, head, size;
var start = value.start === undefined ? 0 : value.max >= 0 && value.min >= 0 ? value.min : value.max;
var length = value.start === undefined ? value.end : value.max >= 0 && value.min >= 0 ? value.max - value.min : value.min - value.max;
var i, imeta, ivalue, base, head, size, stackLength;

if (stacked || (stacked === undefined && stack !== undefined)) {
for (i = 0; i < datasetIndex; ++i) {
Expand All @@ -301,21 +306,23 @@ module.exports = DatasetController.extend({
imeta.controller._getValueScaleId() === scale.id &&
chart.isDatasetVisible(i)) {

ivalue = +scale.getRightValue(datasets[i].data[index]);
if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {
stackLength = scale._parseValue(datasets[i].data[index]);
ivalue = stackLength.start === undefined ? stackLength.end : stackLength.min >= 0 && stackLength.max >= 0 ? stackLength.max : stackLength.min;

if ((value.min < 0 && ivalue < 0) || (value.max >= 0 && ivalue > 0)) {
start += ivalue;
}
}
}
}

base = scale.getPixelForValue(start);
head = scale.getPixelForValue(start + value);
head = scale.getPixelForValue(start + length);
size = head - base;

if (minBarLength !== undefined && Math.abs(size) < minBarLength) {
size = minBarLength;
if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) {
if (length >= 0 && !isHorizontal || length < 0 && isHorizontal) {
head = base - minBarLength;
} else {
head = base + minBarLength;
Expand Down Expand Up @@ -366,7 +373,8 @@ module.exports = DatasetController.extend({
helpers.canvas.clipArea(chart.ctx, chart.chartArea);

for (; i < ilen; ++i) {
if (!isNaN(scale.getRightValue(dataset.data[i]))) {
var val = scale._parseValue(dataset.data[i]);
if (!isNaN(val.min) && !isNaN(val.max)) {
rects[i].draw();
}
}
Expand Down
38 changes: 38 additions & 0 deletions src/core/core.scale.js
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,10 @@ module.exports = Element.extend({
if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) {
return NaN;
}
// Float-bar support. Handling arrays
if (helpers.isArray(rawValue)) {
return [+this.getRightValue(rawValue[0]), +this.getRightValue(rawValue[1])];
}
// If it is in fact an object, dive in one more level
if (rawValue) {
if (this.isHorizontal()) {
Expand All @@ -537,6 +541,40 @@ module.exports = Element.extend({
return rawValue;
},

_parseValue: function(raw) {
var value, start, end, min, max;

if (helpers.isArray(raw)) {
value = this.getRightValue(raw);
start = value[0];
end = value[1];
min = Math.min(start, end);
max = Math.max(start, end);
} else {
value = +this.getRightValue(raw);
start = undefined;
end = value;
min = value;
max = value;
}

return {
min: min,
max: max,
start: start,
end: end
};
},

getScaleLabel: function(rawValue) {
var v = this._parseValue(rawValue);
if (v.start !== undefined) {
return '[' + v.start + ', ' + v.end + ']';
}

return +this.getRightValue(rawValue);
},

/**
* Used to get the value to display in the tooltip for the data at the given index
* @param index
Expand Down
34 changes: 18 additions & 16 deletions src/scales/scale.linear.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,20 +70,25 @@ module.exports = LinearScaleBase.extend({

if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
helpers.each(dataset.data, function(rawValue, index) {
var value = +me.getRightValue(rawValue);
if (isNaN(value) || meta.data[index].hidden) {
var value = me._parseValue(rawValue);

if (isNaN(value.min) || isNaN(value.max) || meta.data[index].hidden) {
return;
}

positiveValues[index] = positiveValues[index] || 0;
negativeValues[index] = negativeValues[index] || 0;

if (value.min === 0 && !opts.ticks.beginAtZero) {
value.min = value.max;
}

if (opts.relativePoints) {
positiveValues[index] = 100;
} else if (value < 0) {
negativeValues[index] += value;
} else if (value.min < 0 || value.max < 0) {
negativeValues[index] += value.min;
} else {
positiveValues[index] += value;
positiveValues[index] += value.max;
}
});
}
Expand All @@ -102,21 +107,18 @@ module.exports = LinearScaleBase.extend({
var meta = chart.getDatasetMeta(datasetIndex);
if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
helpers.each(dataset.data, function(rawValue, index) {
var value = +me.getRightValue(rawValue);
if (isNaN(value) || meta.data[index].hidden) {
var value = me._parseValue(rawValue);

if (isNaN(value.min) || isNaN(value.max) || meta.data[index].hidden) {
return;
}

if (me.min === null) {
me.min = value;
} else if (value < me.min) {
me.min = value;
if (me.min === null || me.min > value.min) {
me.min = value.min;
}

if (me.max === null) {
me.max = value;
} else if (value > me.max) {
me.max = value;
if (me.max === null || me.max < value.max) {
me.max = value.max;
}
});
}
Expand Down Expand Up @@ -151,7 +153,7 @@ module.exports = LinearScaleBase.extend({
},

getLabelForIndex: function(index, datasetIndex) {
return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
return this.getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);
},

// Utils
Expand Down
28 changes: 12 additions & 16 deletions src/scales/scale.logarithmic.js
Original file line number Diff line number Diff line change
Expand Up @@ -118,13 +118,13 @@ module.exports = Scale.extend({

helpers.each(dataset.data, function(rawValue, index) {
var values = valuesPerStack[key];
var value = +me.getRightValue(rawValue);
var value = me._parseValue(rawValue);
// invalid, hidden and negative values are ignored
if (isNaN(value) || meta.data[index].hidden || value < 0) {
if (isNaN(value.min) || isNaN(value.max) || meta.data[index].hidden || value.max < 0 || value.max < 0) {
return;
}
values[index] = values[index] || 0;
values[index] += value;
values[index] += value.max;
});
}
});
Expand All @@ -143,26 +143,22 @@ module.exports = Scale.extend({
var meta = chart.getDatasetMeta(datasetIndex);
if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
helpers.each(dataset.data, function(rawValue, index) {
var value = +me.getRightValue(rawValue);
var value = me._parseValue(rawValue);
// invalid, hidden and negative values are ignored
if (isNaN(value) || meta.data[index].hidden || value < 0) {
if (isNaN(value.min) || isNaN(value.max) || meta.data[index].hidden || value.min < 0 || value.max < 0) {
return;
}

if (me.min === null) {
me.min = value;
} else if (value < me.min) {
me.min = value;
if (me.min === null || me.min > value.min) {
me.min = value.min;
}

if (me.max === null) {
me.max = value;
} else if (value > me.max) {
me.max = value;
if (me.max === null || me.max < value.max) {
me.max = value.max;
}

if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {
me.minNotZero = value;
if (value.min !== 0 && (me.minNotZero === null || value.min < me.minNotZero)) {
me.minNotZero = value.min;
}
});
}
Expand Down Expand Up @@ -247,7 +243,7 @@ module.exports = Scale.extend({

// Get the correct tooltip label
getLabelForIndex: function(index, datasetIndex) {
return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
return this.getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);
},

getPixelForTick: function(index) {
Expand Down
43 changes: 43 additions & 0 deletions test/fixtures/controller.bar/floatBar/float-bar-horizontal.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"config": {
"type": "horizontalBar",
"data": {
"labels": ["2030", "2034", "2038", "2042"],
"datasets": [{
"backgroundColor": "#FF6384",
"data": [11, [6,2], [-4,-7], -2]
}, {
"backgroundColor": "#36A2EB",
"data": [[1,2], [3,4], [-2,-3], [1,4]]
}, {
"backgroundColor": "#FFCE56",
"data": [[0,1], [1,2], [-2,-1], [1,-7]]
}]
},
"options": {
"title": false,
"legend": false,
"scales": {
"xAxes": [{
"ticks": {
"source": "labels",
"display": false
}
}],
"yAxes": [{
"ticks": {
"display": false,
"beginAtZero": true
}
}]
}
}
},
"debug": false,
"options": {
"canvas": {
"height": 256,
"width": 512
}
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"config": {
"type": "horizontalBar",
"data": {
"labels": ["2030", "2034", "2038", "2042"],
"datasets": [{
"backgroundColor": "#FF6384",
"data": [11, [6,2], [-4,-7], -2]
}, {
"backgroundColor": "#36A2EB",
"data": [[1,2], [3,4], [-2,-3], [1,4]]
}, {
"backgroundColor": "#FFCE56",
"data": [[0,1], [1,2], [-2,-1], [1,-7]]
}]
},
"options": {
"title": false,
"legend": false,
"scales": {
"xAxes": [{
"stacked": true,
"ticks": {
"source": "labels",
"display": false
}
}],
"yAxes": [{
"stacked": true,
"ticks": {
"display": false,
"beginAtZero": true
}
}]
}
}
},
"debug": false,
"options": {
"canvas": {
"height": 256,
"width": 512
}
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
43 changes: 43 additions & 0 deletions test/fixtures/controller.bar/floatBar/float-bar-stacked.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"config": {
"type": "bar",
"data": {
"labels": ["2030", "2034", "2038", "2042"],
"datasets": [{
"backgroundColor": "#FF6384",
"data": [11, [6,2], [-4,-7], -2]
}, {
"backgroundColor": "#36A2EB",
"data": [[1,2], [3,4], [-2,-3], [1,4]]
}, {
"backgroundColor": "#FFCE56",
"data": [[0,1], [1,2], [-2,-1], [1,-7]]
}]
},
"options": {
"title": false,
"legend": false,
"scales": {
"xAxes": [{
"stacked": true,
"ticks": {
"display": false
}
}],
"yAxes": [{
"stacked": true,
"ticks": {
"display": false
}
}]
}
}
},
"debug": false,
"options": {
"canvas": {
"height": 256,
"width": 512
}
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit c9f6167

Please sign in to comment.