Skip to content

Commit

Permalink
Rebase, comments, cc warnings
Browse files Browse the repository at this point in the history
  • Loading branch information
kurkle committed Oct 23, 2019
1 parent 3f7282b commit 8066422
Show file tree
Hide file tree
Showing 7 changed files with 227 additions and 208 deletions.
65 changes: 36 additions & 29 deletions src/controllers/controller.bar.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,43 +113,50 @@ function computeFlexCategoryTraits(index, ruler, options) {
};
}

function parseFloatBar(arr, item, vScale, i) {
var startValue = vScale._parse(arr[0], i);
var endValue = vScale._parse(arr[1], i);
var min = Math.min(startValue, endValue);
var max = Math.max(startValue, endValue);
var barStart = min;
var barEnd = max;

if (Math.abs(min) > Math.abs(max)) {
barStart = max;
barEnd = min;
}

// Store `barEnd` (furthest away from origin) as parsed value,
// to make stacking straight forward
item[vScale.id] = barEnd;

item._custom = {
barStart: barStart,
barEnd: barEnd,
start: startValue,
end: endValue,
min: min,
max: max
};
}

function parseArrayOrPrimitive(meta, data, start, count) {
var iScale = this._getIndexScale();
var vScale = this._getValueScale();
var labels = iScale._getLabels() || [];
var singleScale = iScale === vScale;
var parsed = [];
var i, ilen, item, arr, startValue, endValue, barStart, barEnd, min, max;
var i, ilen, item, entry;
for (i = start, ilen = start + count; i < ilen; ++i) {
arr = data[i];
entry = data[i];
item = {_index: i};
if (helpers.isArray(arr)) {
startValue = vScale._parse(arr[0], i);
endValue = vScale._parse(arr[1], i);
min = barStart = Math.min(startValue, endValue);
max = barEnd = Math.max(startValue, endValue);
if (Math.abs(min) > Math.abs(max)) {
barStart = max;
barEnd = min;
}

item[iScale.id] = i < labels.length ? iScale._parse(labels[i], i) : i;

// Store `barEnd` (furthest away from origin) as parsed value,
// to make stacking straight forward
item[vScale.id] = barEnd;

item._custom = {
barStart: barStart,
barEnd: barEnd,
start: startValue,
end: endValue,
min: min,
max: max
};
if (helpers.isArray(entry)) {
parseFloatBar(entry, item, vScale, i);
} else {
item[vScale.id] = vScale._parse(data[i], i);
item[iScale.id] = iScale !== vScale && i < labels.length
? iScale._parse(labels[i], i) : i;
item[vScale.id] = vScale._parse(entry, i);
}
if (!singleScale) {
item[iScale.id] = iScale._parse(labels[i], i);
}
parsed.push(item);
}
Expand Down
1 change: 0 additions & 1 deletion src/core/core.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -854,7 +854,6 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
type: null,
data: [],
dataset: null,
datasetIndex: datasetIndex,
controller: null,
hidden: null, // See isDatasetVisible() comment
xAxisID: null,
Expand Down
120 changes: 69 additions & 51 deletions src/core/core.datasetController.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,23 +75,32 @@ function unlistenArrayEvents(array, listener) {
delete array._chartjs;
}

function applyStack(chart, stack, value, dsIndex, allOther) {
var sets = Object.keys(stack).sort();
function getSortedDatasetIndices(chart, filterVisible) {
var keys = [];
var metasets = chart._getSortedDatasetMetas(filterVisible);
var i, ilen;

for (i = 0, ilen = metasets.length; i < ilen; ++i) {
keys.push(metasets[i].index);
}
return keys;
}

function applyStack(stack, value, dsIndex, allOther) {
var keys = stack.keys;
var i, ilen, datasetIndex, otherValue;

for (i = 0, ilen = sets.length; i < ilen; ++i) {
datasetIndex = +sets[i];
for (i = 0, ilen = keys.length; i < ilen; ++i) {
datasetIndex = +keys[i];
if (datasetIndex === dsIndex) {
if (allOther) {
continue;
}
break;
}
if (chart.isDatasetVisible(datasetIndex)) {
otherValue = stack[datasetIndex];
if (!isNaN(otherValue) && (value === 0 || Math.sign(value) === Math.sign(otherValue))) {
value += otherValue;
}
otherValue = stack.values[datasetIndex];
if (!isNaN(otherValue) && (value === 0 || Math.sign(value) === Math.sign(otherValue))) {
value += otherValue;
}
}
return value;
Expand All @@ -117,6 +126,22 @@ function getStackKey(xScale, yScale, meta) {
&& xScale.id + '.' + yScale.id + '.' + meta.stack + '.' + meta.type;
}

function arraysEqual(array1, array2) {
var ilen = array1.length;
var i;

if (ilen !== array2.length) {
return false;
}

for (i = 0; i < ilen; i++) {
if (array1[i] !== array2[i]) {
return false;
}
}
return true;
}

// Base class for all dataset controllers (line, bar, etc)
var DatasetController = function(chart, datasetIndex) {
this.initialize(chart, datasetIndex);
Expand Down Expand Up @@ -276,41 +301,38 @@ helpers.extend(DatasetController.prototype, {
var me = this;
var dataset = me.getDataset();
var data = dataset.data || (dataset.data = []);
var i, ilen;

// In order to correctly handle data addition/deletion animation (an thus simulate
// real-time charts), we need to monitor these data modifications and synchronize
// the internal meta data accordingly.
if (me._data === data) {
for (i = 0, ilen = data.length; i < ilen; i++) {
if (me._dataCopy[i] !== data[i]) {
return true;
}
}
return false;
}

if (helpers.isObject(data)) {
// Object data is currently monitored for replacement only
if (me._objectData !== data) {
me._data = convertObjectDataToArray(data);
me._objectData = data;
return true;
if (me._objectData === data) {
return false;
}
me._data = convertObjectDataToArray(data);
me._objectData = data;
} else {
if (me._data === data && arraysEqual(data, me._dataCopy)) {
return false;
}
return false;
}

if (me._data) {
// This case happens when the user replaced the data array instance.
unlistenArrayEvents(me._data, me);
}
if (me._data) {
// This case happens when the user replaced the data array instance.
unlistenArrayEvents(me._data, me);
}

me._dataCopy = data.slice(0);
// Store a copy to detect direct modifications.
// Note: This is suboptimal, but better than always parsing the data
// TODO: Utilize Proxy instead, after IE support is dropped
me._dataCopy = data.slice(0);

if (data && Object.isExtensible(data)) {
listenArrayEvents(data, me);
if (data && Object.isExtensible(data)) {
listenArrayEvents(data, me);
}
me._data = data;
}
me._data = data;
return true;
},

Expand Down Expand Up @@ -413,7 +435,7 @@ helpers.extend(DatasetController.prototype, {
stackKey += '.' + indexValue;
item._stackKeys[scaleId] = stackKey;
stack = crossRef[stackKey] || (crossRef[stackKey] = {});
stack[meta.datasetIndex] = value;
stack[meta.index] = value;
}
}

Expand Down Expand Up @@ -542,17 +564,6 @@ helpers.extend(DatasetController.prototype, {
return data[index]._parsed._custom;
},

/**
* @private
*/
_getStack: function(scale, index) {
var data = this._cachedMeta.data;
if (index < 0 || index >= data.length) {
return;
}
return this.chart._xref[data[index]._parsed._stackKeys[scale.id]];
},

/**
* @private
*/
Expand All @@ -565,8 +576,11 @@ helpers.extend(DatasetController.prototype, {
var stack;

if (stacked || (stacked === undefined && meta.stack !== undefined)) {
stack = chart._xref[parsed._stackKeys[scale.id]];
value = applyStack(chart, stack, value, meta.datasetIndex);
stack = {
keys: getSortedDatasetIndices(chart, true),
values: chart._xref[parsed._stackKeys[scale.id]]
};
value = applyStack(stack, value, meta.index);
}
return value;
},
Expand All @@ -579,8 +593,9 @@ helpers.extend(DatasetController.prototype, {
var crossRef = chart._xref || (chart._xref = {});
var min = Number.POSITIVE_INFINITY;
var max = Number.NEGATIVE_INFINITY;
var minNotZero = Number.POSITIVE_INFINITY;
var minPositive = Number.POSITIVE_INFINITY;
var stacked = scale.options.stacked;
var indices = getSortedDatasetIndices(chart, true);
var i, item, value, parsed, stack;

stacked = canStack && (stacked || (stacked === undefined && meta.stack !== undefined));
Expand All @@ -593,19 +608,22 @@ helpers.extend(DatasetController.prototype, {
continue;
}
if (stacked) {
stack = crossRef[parsed._stackKeys[scale.id]];
value = applyStack(chart, stack, value, meta.datasetIndex, true);
stack = {
keys: indices,
values: crossRef[parsed._stackKeys[scale.id]]
};
value = applyStack(stack, value, meta.index, true);
}
min = Math.min(min, value);
max = Math.max(max, value);
if (value > 0) {
minNotZero = Math.min(minNotZero, value);
minPositive = Math.min(minPositive, value);
}
}
return {
min: min,
max: max,
minNotZero: minNotZero
minPositive: minPositive
};
},

Expand Down
53 changes: 19 additions & 34 deletions src/core/core.scale.js
Original file line number Diff line number Diff line change
Expand Up @@ -371,23 +371,23 @@ var Scale = Element.extend({

_getMinMax: function(canStack) {
var me = this;
var metas = me._getMatchingMetas();
var metas = me._getMatchingVisibleMetas();
var min = Number.POSITIVE_INFINITY;
var max = Number.NEGATIVE_INFINITY;
var minNotZero = Number.POSITIVE_INFINITY;
var minPositive = Number.POSITIVE_INFINITY;
var i, ilen, minmax;

for (i = 0, ilen = metas.length; i < ilen; ++i) {
minmax = metas[i].controller._getMinMax(me, canStack);
min = Math.min(min, minmax.min);
max = Math.max(max, minmax.max);
minNotZero = Math.min(minNotZero, minmax.minNotZero);
minPositive = Math.min(minPositive, minmax.minPositive);
}

return {
min: min,
max: max,
minNotZero: minNotZero
minPositive: minPositive
};
},

Expand Down Expand Up @@ -1023,29 +1023,6 @@ var Scale = Element.extend({
: h * sin < w * cos ? h / cos : w / sin;
},

/**
* Returns visible dataset metas that are attached to this scale
* @private
*/
_getMatchingMetas: function() {
var me = this;
var chart = me.chart;
var axisID = me.isHorizontal() ? 'xAxisID' : 'yAxisID';
var result = [];
var i, ilen, meta;

for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
if (!chart.isDatasetVisible(i)) {
continue;
}
meta = chart.getDatasetMeta(i);
if (meta[axisID] === me.id) {
result.push(meta);
}
}
return result;
},

/**
* @private
*/
Expand All @@ -1056,7 +1033,7 @@ var Scale = Element.extend({
return !!display;
}

return this._getMatchingMetas().length > 0;
return this._getMatchingVisibleMetas().length > 0;
},

/**
Expand Down Expand Up @@ -1479,16 +1456,24 @@ var Scale = Element.extend({
},

/**
* Returns visible dataset metas that are attached to this scale
* @param {string} [type] - if specified, also filter by dataset type
* @private
*/
_getMatchingVisibleMetas: function(type) {
var me = this;
var isHorizontal = me.isHorizontal();
return me.chart._getSortedVisibleDatasetMetas()
.filter(function(meta) {
return (!type || meta.type === type)
&& (isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id);
});
var metas = me.chart._getSortedVisibleDatasetMetas();
var axisID = me.isHorizontal() ? 'xAxisID' : 'yAxisID';
var result = [];
var i, ilen, meta;

for (i = 0, ilen = metas.length; i < ilen; ++i) {
meta = metas[i];
if (meta[axisID] === me.id && (!type || meta.type === type)) {
result.push(meta);
}
}
return result;
}
});

Expand Down
Loading

0 comments on commit 8066422

Please sign in to comment.