Skip to content

Commit 327d640

Browse files
committed
Initial Implementation
1 parent f4a1bf9 commit 327d640

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

dist/canvasjsasjson.min.js

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/CanvasJS Data As JSON.js

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
function CanvasJSDataAsJSON(chart, fileName) {
2+
var toolBar = document.getElementsByClassName("canvasjs-chart-toolbar")[0];
3+
if (chart.options.exportEnabled) {
4+
var exportJSON = document.createElement('div');
5+
var text = document.createTextNode("Save as JSON");
6+
exportJSON.setAttribute("style", "padding: 12px 8px; background-color: white; color: black")
7+
exportJSON.appendChild(text);
8+
exportJSON.addEventListener("mouseover", function() {
9+
exportJSON.setAttribute("style", "padding: 12px 8px; background-color: #2196F3; color: white")
10+
});
11+
exportJSON.addEventListener("mouseout", function() {
12+
exportJSON.setAttribute("style", "padding: 12px 8px; background-color: white; color: black")
13+
});
14+
exportJSON.addEventListener("click", function() {
15+
downloadJSON({
16+
filename: (fileName || "chart-data") + ".json",
17+
chart: chart
18+
})
19+
});
20+
21+
toolBar.childNodes[1].appendChild(exportJSON);
22+
} else {
23+
var base64Img = "data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMS4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDg2LjkwNiA4Ni45MDYiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDg2LjkwNiA4Ni45MDY7IiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4Ij4KPGc+Cgk8Zz4KCQk8cGF0aCBkPSJNODEuNzUxLDI4Ljg2M2wtMS42MTQtMS4xNDVjLTEuNjE0LTEuMTQ1LTMuMjMxLTIuMjkyLTQuODYxLTMuNDE1Yy0xLjcxNS0xLjE4My0zLjQzOC0yLjQ0MS01LjEwNC0zLjY2ICAgIGMtMS45MjUtMS40MDctMy45MTYtMi44NjItNS45MzYtNC4yMjljLTAuMjcxLTAuMTgzLTAuNTQ5LTAuMzkyLTAuODM4LTAuNjA3Yy0xLjQ0Ny0xLjA4LTMuNTUxLTIuNDU5LTUuODUyLTIuMjI1ICAgIEM1NC40MjUsMTMuODg4LDUyLDE3LjA1NCw1MiwxOS43MDN2Ni45ODZjMC0wLjAwMS0wLjA4Ni0wLjAwMi0wLjI3Mi0wLjAwMmMtNi44MiwwLTQwLjcyMSwxLjcyMi00MC43MjEsMzUuNzIgICAgYzAsMC45NzYsMC43NjgsMS44MDUsMS43MjksMS45NjhjMC4xMTEsMC4wMiwwLjI1NSwwLjAyOCwwLjM2NSwwLjAyOGMwLjgzOCwwLDEuNjIxLTAuNTMsMS45MDUtMS4zNDQgICAgYzAuMjUyLTAuNzIsNi4yMjktMTcuNjI3LDMzLjA4NC0xNy42MjdjMS4zNDgsMCwyLjkwOSwwLjA0NCwzLjkwOSwwLjEzdjYuNTE1YzAsMi4xNzMsMS42MDQsNC4zNDcsMy42OTksNS41MzYgICAgYzAuNzI5LDAuNDE0LDEuNjM0LDAuNjI0LDIuNDQzLDAuNjI0YzEuOTg5LDAsMy42NDMtMS4yMzUsNC45MjEtMi4yMjhjMC4zNDMtMC4yNjYsMC42OTgtMC41MjIsMS4wMDctMC43MiAgICBjMS4xOS0wLjc2NywyLjM4LTEuNTkzLDMuNTE1LTIuMzkyYzAuNTc1LTAuNDA0LDEuMTU3LTAuODA5LDEuNzI5LTEuMjAyYzMuMTQ1LTIuMTU2LDYuMjk5LTQuNDIyLDkuMzQ3LTYuNjEybDAuODY5LTAuNjI0ICAgIGMwLjM5Ni0wLjI4MywwLjc5OS0wLjU2MiwxLjIwMS0wLjg0MmMwLjMzNi0wLjIzMiwwLjY3MS0wLjQ2NSwwLjk0LTAuNjU3YzIuMzMyLTEuNTI0LDUuMjM2LTMuNDIxLDUuMjM2LTcuMDcxICAgIEM4Ni45MDgsMzIuMzczLDg0LjUwNSwzMC43MzgsODEuNzUxLDI4Ljg2M3ogTTc5LjQyMiwzOS42NTVjLTAuMzE5LDAuMjI3LTAuNjQ0LDAuNDUxLTAuOTY4LDAuNjc2ICAgIGMtMC40MiwwLjI5MS0wLjg0MSwwLjU4My0xLjI1NSwwLjg4bC0wLjg2OSwwLjYyNWMtMy4wMywyLjE3OC02LjE2Miw0LjQzLTkuMjcxLDYuNTYyYy0wLjU4NywwLjQwMy0xLjE3MywwLjgxNi0xLjc2LDEuMjI5ICAgIGMtMS4xMDIsMC43NzUtMi4yNCwxLjU3Ny0zLjM2LDIuMjk3Yy0wLjQyOCwwLjI3NC0wLjg1NCwwLjYwNS0xLjI2NiwwLjkyNmMtMC43NTQsMC41ODUtMS43ODYsMS4zODctMi40MDUsMS4zODcgICAgYy0wLjA3NiwwLTAuNDM1LTAuMDEyLTAuNTk0LTAuMTAzQzU2Ljg2Miw1My42NzMsNTYsNTIuNzg4LDU2LDUyLjA3NnYtOC4zNzJjMC0xLjAzOC0wLjU0NC0xLjkwMy0xLjU3OC0xLjk5MiAgICBjLTIuMTU3LTAuMTg3LTQuMTYtMC4yOC02LjE5OC0wLjI4Yy0xNy43MTMsMC0yNy4zMTIsNi44NzEtMzIuMjk3LDEyLjYyOWMxLjg1NC04LjM4LDYuNzM4LTE0LjYyMiwxNC41MjktMTguNjE2ICAgIGM4LjM3Ny00LjI5NSwxNy44MzUtNC43NTgsMjEuNTA2LTQuNzU4YzEuMDYxLDAsMS42OS0wLjE1MywxLjcyNS0wLjE1YzAuMDQzLDAuMDAyLDAuMDk1LTAuMTg3LDAuMTM4LTAuMTg3SDU0LjUgICAgYzEuMTA0LDAsMS41LTAuNTE1LDEuNS0xLjYxOXYtOS4wMjhjMC0wLjkyMywxLjE0OC0yLjA2MywxLjkzNy0yLjE0MWMwLjgwNS0wLjA1NiwxLjk4OCwwLjczNiwyLjk0MiwxLjQ0OSAgICBjMC4zNDIsMC4yNTUsMC43MzQsMC41MDEsMS4wNTMsMC43MTZjMS45NTksMS4zMjYsMy45NTEsMi43Niw1Ljg0OCw0LjE0NmMxLjY4OCwxLjIzNCwzLjQ1LDIuNTExLDUuMjExLDMuNzI0ICAgIGMxLjYxNCwxLjExMywzLjIyNSwyLjI1LDQuODIzLDMuMzg1bDEuNjUyLDEuMTY4YzIuOTI1LDEuOTksMy40NCwyLjU1LDMuNDQsMy43NEM4Mi45MDYsMzcuMTYxLDgxLjg1MiwzOC4wNjUsNzkuNDIyLDM5LjY1NXoiIGZpbGw9IiNGRkRBNDQiLz4KCQk8cGF0aCBkPSJNNjEuNjgyLDczLjM1YzUuMDI3LDAsOC4zMTgtMy40NTUsOC4zMTgtOC41NDF2LTUuMDc4YzAtMS4xMDQtMC44OTYtMi0yLTJzLTIsMC44OTYtMiwydjUuMDc4ICAgIGMwLDIuODk3LTEuNDgxLDQuNTQxLTQuMzE4LDQuNTQxSDkuNzg3QzYuODIyLDY5LjM1LDQsNjcuNTY5LDQsNjQuODA5VjMxLjcwM2MwLTIuNzQxLDIuODcyLTUuMzUzLDUuNzg3LTUuMzUzSDI5LjUgICAgYzEuMTA0LDAsMi0wLjg5NiwyLTJzLTAuODk2LTItMi0ySDkuNzg3QzQuNjY2LDIyLjM1LDAsMjYuNzU1LDAsMzEuNzAzdjMzLjEwNmMwLDQuOTIsNC42NjYsOC41NDEsOS43ODcsOC41NDFINjEuNjgyeiIgZmlsbD0iI0ZGREE0NCIvPgoJPC9nPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo=";
24+
var exportButton = document.createElement('button');
25+
var chartBound = chart.container.getBoundingClientRect();
26+
27+
exportButton.style.cssText = "position:absolute;display: inline-block;padding: 5px 15px;cursor: pointer;text-align: center;text-decoration: none;background-color: #f4511e;border: none;border-radius: 10px;left:" + (chartBound.right - 60) + "px; top:" + chartBound.top + "px";
28+
var img = document.createElement("IMG");
29+
img.setAttribute("src", base64Img);
30+
exportButton.appendChild(img);
31+
exportButton.addEventListener("mouseover", function() {
32+
this.style.cssText = this.style.cssText + "background-color: #d4511e;";
33+
});
34+
exportButton.addEventListener("mouseout", function() {
35+
this.style.cssText = this.style.cssText + "background-color: #f4511e;";
36+
});
37+
exportButton.addEventListener("click", function() {
38+
downloadJSON({
39+
filename: (fileName || "chart-data") + ".json",
40+
chart: chart
41+
})
42+
});
43+
44+
chart.container.parentNode.insertBefore(exportButton, chart.container.nextSibling);
45+
}
46+
};
47+
48+
function convertChartDataToJSON(args) {
49+
var result, data;
50+
data = args.data || null;
51+
52+
if (data == null || !data.length) {
53+
return null;
54+
}
55+
56+
result = JSON.stringify(data);
57+
return result;
58+
}
59+
60+
function downloadJSON(args) {
61+
var data, filename, link;
62+
var jsonData;
63+
jsonData = convertChartDataToJSON(args.chart.options);
64+
65+
if (jsonData == null) return;
66+
filename = args.filename || 'chart-data.json';
67+
if (!jsonData.match(/^application:json/i)) {
68+
jsonData = 'data:text/json;charset=utf-8,' + jsonData;
69+
}
70+
data = encodeURI(jsonData);
71+
link = document.createElement('a');
72+
link.setAttribute('href', data);
73+
link.setAttribute('download', filename);
74+
document.body.appendChild(link); // Required for FF
75+
link.click();
76+
document.body.removeChild(link);
77+
}

0 commit comments

Comments
 (0)