-
Notifications
You must be signed in to change notification settings - Fork 12k
Fixes bug #5289: Bars do not appear at correct X axis position when specified in {x, y} format #5298
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fixes bug #5289: Bars do not appear at correct X axis position when specified in {x, y} format #5298
Changes from all commits
7a4ba6b
d1809f7
e387285
98ec449
996c6af
740e0bb
5d9dc40
4ab606c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -67,6 +67,42 @@ module.exports = function(Chart) { | |
| return position === 'top' || position === 'bottom'; | ||
| } | ||
|
|
||
| /** | ||
| * Return the y data of the label, if no this label, return null | ||
| * @private | ||
| * @param {string} label the label in the labels array | ||
| * @param {array} dataArray the data in the datasets. | ||
| * @return {number} the y data according to the label | ||
| */ | ||
| function getY(label, dataArray) { | ||
| for (var i = 0; i < dataArray.length; i++) { | ||
| var item = dataArray[i]; | ||
| if (item.x === label) { | ||
| return item.y; | ||
| } | ||
| } | ||
| return null; | ||
| } | ||
| /** | ||
| * Find if the data in datasets exists in the labels | ||
| * @private | ||
| * @param {array} dataArray the data in the datasets | ||
| * @param {array} labelArray the label in the labels array | ||
| * @return {boolean} the match result, true is included | ||
| */ | ||
| function dataInLabel(dataArray, labelArray) { | ||
| for (var i = 0; i < dataArray.length; i++) { | ||
| var item = dataArray[i]; | ||
| if (item === null || item === undefined || item.x === undefined) { | ||
| break; | ||
| } | ||
| if (labelArray.indexOf(item.x) > -1) { | ||
| return true; | ||
| } | ||
| } | ||
| return false; | ||
| } | ||
|
|
||
| helpers.extend(Chart.prototype, /** @lends Chart */ { | ||
| /** | ||
| * @private | ||
|
|
@@ -691,7 +727,11 @@ module.exports = function(Chart) { | |
| if (!dataset._meta) { | ||
| dataset._meta = {}; | ||
| } | ||
|
|
||
| if (!dataset.data) { | ||
| dataset.data = []; | ||
| } | ||
| // Format the data if the data array is missing some point according to the labels | ||
| dataset.data = me._formatDataset(dataset.data); | ||
| var meta = dataset._meta[me.id]; | ||
| if (!meta) { | ||
| meta = dataset._meta[me.id] = { | ||
|
|
@@ -933,7 +973,26 @@ module.exports = function(Chart) { | |
| me.lastActive = me.active; | ||
|
|
||
| return changed; | ||
| } | ||
| }, | ||
| /** | ||
| * Format the data list if the data is missing some points in the datasets. | ||
| * @private | ||
| * @param {array} dataArray array to format | ||
| * @return {array} the formated array | ||
| */ | ||
| _formatDataset: function(dataArray) { | ||
| var labels = this.chart.data.labels; | ||
| var tmp = dataArray.slice(0); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. there's no reason to create |
||
| var result = dataArray; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this is where you should make the defensive copy. don't modify the input to the function. instead do |
||
| var match = dataInLabel(tmp, labels); | ||
| if (match && dataArray.length < labels.length) { | ||
| for (var i = 0; i < labels.length; i++) { | ||
| var label = labels[i]; | ||
| result[i] = {x: label, y: getY(label, tmp)}; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think you need to check if it's a horizontal or vertical chart here and can't just assume that the label will be on the x-axis And |
||
| } | ||
| } | ||
| return result; | ||
| }, | ||
| }); | ||
|
|
||
| /** | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this will return true if a single item matches. is that what you want?
if you want to see if all items match then you could return false if < 0 here and return true at the end of the function