540 lines
18 KiB
JavaScript
540 lines
18 KiB
JavaScript
(function (H) {
|
||
if (!H.exporting) {
|
||
H.exporting = function () { };
|
||
}
|
||
|
||
// This will be redefined later;
|
||
var oldExport = H.Chart.prototype.exportChart;
|
||
H.Chart.prototype.exportChart = function () { };
|
||
|
||
// Set the URL of the export server to a non-existant one, just to be sure.
|
||
H.getOptions().exporting.url = "http://127.0.0.1:666/";
|
||
|
||
var MIME_TYPES = {
|
||
"PDF": "application/pdf",
|
||
"PNG": "image/png",
|
||
"JPEG": "image/jpeg",
|
||
"SVG": "image/svg+xml",
|
||
"CSV": "text/csv",
|
||
"XLS": "application/vnd.ms-excel"
|
||
};
|
||
|
||
var MIME_TYPE_TO_EXTENSION = {
|
||
"application/pdf": ".pdf",
|
||
"image/png": ".png",
|
||
"image/jpeg": ".jpeg",
|
||
"image/svg+xml": ".svg",
|
||
"text/csv": ".csv",
|
||
"application/vnd.ms-excel": ".xls"
|
||
};
|
||
|
||
var TRANSLATION_KEY_TO_MIME_TYPES = {
|
||
"downloadPDF": "application/pdf",
|
||
"downloadPNG": "image/png",
|
||
"downloadJPEG": "image/jpeg",
|
||
"downloadSVG": "image/svg+xml"
|
||
};
|
||
TRANSLATION_KEY_TO_MIME_TYPES[H.getOptions().lang.downloadCSV || 'Download CSV'] = "text/csv";
|
||
TRANSLATION_KEY_TO_MIME_TYPES[H.getOptions().lang.downloadXLS || 'Download XLS'] = "application/vnd.ms-excel";
|
||
|
||
// This var indicates if the browser supports HTML5 download feature
|
||
var browserSupportDownload = false;
|
||
var a = document.createElement('a');
|
||
if (typeof window.btoa != "undefined" && typeof a.download != "undefined") {
|
||
browserSupportDownload = true;
|
||
}
|
||
// This is for IE support of Blob
|
||
var browserSupportBlob = window.Blob && window.navigator.msSaveOrOpenBlob;
|
||
|
||
/**
|
||
* Describes the MIME types that this module supports.
|
||
* Additionnally, you can call `support(mimeType)` to check
|
||
* that this type is available on the current platform.
|
||
*/
|
||
H.exporting.MIME_TYPES = MIME_TYPES;
|
||
|
||
var supportStatus = {};
|
||
var buildSupportStatus = function () {
|
||
var hasDownloadOrBlob = browserSupportDownload || browserSupportBlob;
|
||
|
||
supportStatus[MIME_TYPES.CSV] = hasDownloadOrBlob && (H.Chart.prototype.getCSV !== undefined);
|
||
supportStatus[MIME_TYPES.XLS] = hasDownloadOrBlob && (H.Chart.prototype.getTable !== undefined);
|
||
|
||
var svgSupport = (H.Chart.prototype.getSVG !== undefined);
|
||
|
||
supportStatus[MIME_TYPES.SVG] = hasDownloadOrBlob && svgSupport && (window.btoa !== undefined);
|
||
|
||
// Canvg uses a function named RGBColor, but it's also a not widely known standard object
|
||
// http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113/css.html#CSS-RGBColor
|
||
// Fugly, but heh.
|
||
var rbgColorSupport = false;
|
||
try {
|
||
rbgColorSupport = (new RGBColor("").ok) !== undefined;
|
||
}
|
||
catch (e) { }
|
||
// We also check that a canvas element can be created.
|
||
var canvas = document.createElement('canvas');
|
||
var canvgSupport = typeof canvg !== "undefined" && typeof RGBColor != "undefined" &&
|
||
rbgColorSupport && canvas.getContext && canvas.getContext('2d');
|
||
|
||
supportStatus[MIME_TYPES.PNG] = hasDownloadOrBlob && svgSupport && canvgSupport;
|
||
// On IE, it relies on canvas.msToBlob() which always returns PNG
|
||
supportStatus[MIME_TYPES.JPEG] = /* useless, see last param: hasDownloadOrBlob && */
|
||
svgSupport && canvgSupport && browserSupportDownload;
|
||
|
||
supportStatus[MIME_TYPES.PDF] = hasDownloadOrBlob && svgSupport && canvgSupport && (typeof jsPDF !== "undefined");
|
||
|
||
};
|
||
buildSupportStatus();
|
||
|
||
/**
|
||
* Checks if the supplied MIME type is available on the
|
||
* current platform for a chart to be exported in.
|
||
* @param mimeType {String} The MIME type.
|
||
* @returns {boolean} <code>true</code> if the MIME type is available on the
|
||
* current platform.
|
||
*/
|
||
H.exporting.supports = function (mimeType) {
|
||
if (supportStatus[mimeType]) {
|
||
return supportStatus[mimeType];
|
||
}
|
||
else {
|
||
return false;
|
||
}
|
||
};
|
||
|
||
|
||
// Remove unsupported download features from the menu
|
||
var menuItems = H.getOptions().exporting.buttons.contextButton.menuItems,
|
||
menuItem,
|
||
textKey,
|
||
text,
|
||
mimeType,
|
||
handlerBuilder = function (mimeType) {
|
||
return function () {
|
||
this.exportChartLocal({
|
||
type: mimeType,
|
||
csv: {
|
||
itemDelimiter: ';'
|
||
}
|
||
});
|
||
}
|
||
};
|
||
for (var i in menuItems) {
|
||
menuItem = menuItems[i];
|
||
textKey = menuItems[i].textKey;
|
||
text = menuItems[i].text; // export-csv do not use a textKey attribute
|
||
mimeType = TRANSLATION_KEY_TO_MIME_TYPES[textKey] || TRANSLATION_KEY_TO_MIME_TYPES[text];
|
||
if (mimeType) {
|
||
if (!H.exporting.supports(mimeType)) {
|
||
// Setting enabled = false isn't enough.
|
||
delete menuItems[i];
|
||
}
|
||
else {
|
||
// Redefines click handler to use our method.
|
||
menuItems[i].onclick = handlerBuilder(mimeType);
|
||
}
|
||
}
|
||
}
|
||
|
||
/*
|
||
* Converts a SVG string to a canvas element
|
||
* thanks to canvg.
|
||
* @param svg {String} A SVG string.
|
||
* @param width {Integer} The rasterized width.
|
||
* @param height {Integer} The rasterized height.
|
||
* @return {DOMNode} a canvas element.
|
||
*/
|
||
var svgToCanvas = function (svg, width, height) {
|
||
var canvas = document.createElement('canvas');
|
||
|
||
canvas.setAttribute('width', width);
|
||
canvas.setAttribute('height', height);
|
||
|
||
canvas.getContext('2d').drawSvg(svg, 0, 0, width, height);
|
||
|
||
return canvas;
|
||
};
|
||
|
||
/**
|
||
* An object to simplifies the retrieval of options in
|
||
* multiple bundles.
|
||
* @param opts {Object} Multiple, an object containing options.
|
||
*/
|
||
var Opt = function (opts1, opt2, dotdotdot) {
|
||
this.bundles = arguments;
|
||
};
|
||
|
||
/**
|
||
* Fetch the value associated with the specified key in the bundles.
|
||
* First one defined is the one returned.
|
||
* @param key {String} The key.
|
||
* @param value {mixed} The first defined value in the bundles or
|
||
* <code>undefined</code> if none is found.
|
||
*/
|
||
Opt.prototype.get = function (key) {
|
||
for (var i = 0; i < this.bundles.length; i++) {
|
||
if (this.bundles[i] && this.bundles[i][key] !== undefined) {
|
||
return this.bundles[i][key];
|
||
}
|
||
}
|
||
return undefined;
|
||
};
|
||
|
||
// Default options.
|
||
var defaultExportOptions = {
|
||
type: MIME_TYPES.PNG,
|
||
scale: 2,
|
||
filename: "chart",
|
||
csv: {
|
||
useLocalDecimalPoint: true
|
||
}
|
||
};
|
||
/**
|
||
*
|
||
*@param chartArr {Array}
|
||
*/
|
||
var getsvg = function (chartArr){
|
||
var svgArr = [],
|
||
top = 0,
|
||
width = 0;
|
||
for(var i=0;i<chartArr.length;i++){
|
||
var chart=chartArr[i];
|
||
var svg = chart.getSVG();
|
||
svg = svg.replace('<svg', '<g transform="translate(0,' + top + ')" ');
|
||
svg = svg.replace('</svg>', '</g>');
|
||
|
||
top += chart.chartHeight;
|
||
width = Math.max(width, chart.chartWidth);
|
||
svgArr.push(svg);
|
||
}
|
||
return '<svg height="' + top + '" width="' + width + '" version="1.1" xmlns="http://www.w3.org/2000/svg">' + svgArr.join('') + '</svg>';
|
||
};
|
||
|
||
/**
|
||
* Redefines the export function of the official exporting module.
|
||
*@param fileName {String} file name
|
||
* @param type {String} file type
|
||
* @param chartOptions {Object} Additionnal chart options.
|
||
*/
|
||
H.Chart.prototype.exportChartPNG= function(fileName,type,chartArr){
|
||
var svg= getsvg(chartArr);
|
||
var height =this.chartHeight*chartArr.length,width=this.chartWidth,type = type==null?'image/png':type;
|
||
var data = {
|
||
content: undefined,
|
||
datauri: undefined,
|
||
blob: undefined
|
||
};
|
||
|
||
var canvas = svgToCanvas(svg, width, height);
|
||
data.datauri = browserSupportDownload && canvas.toDataURL && canvas.toDataURL(type);
|
||
data.blob = (type == MIME_TYPES.PNG) && !browserSupportDownload && canvas.msToBlob && canvas.msToBlob();
|
||
if (!data.content && !(data.datauri || data.blob)) {
|
||
throw new Error("Something went wrong while exporting the chart");
|
||
}
|
||
|
||
if (browserSupportDownload && (data.datauri || data.content)) {
|
||
a = document.createElement('a');
|
||
a.href = data.datauri || ('data:' + type + ';base64,' + window.btoa(unescape(encodeURIComponent(data.content))));
|
||
a.download = fileName;
|
||
document.body.appendChild(a);
|
||
a.click();
|
||
a.remove();
|
||
}
|
||
else if (browserSupportBlob && (data.blob || data.content)) {
|
||
blobObject = data.blob || new Blob([data.content], { type: type });
|
||
window.navigator.msSaveOrOpenBlob(blobObject, filename);
|
||
}
|
||
else {
|
||
window.open(data);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Redefines the export function of the official exporting module.
|
||
* @param options {Object} Overload the export options defined in the chart.
|
||
* @param chartOptions {Object} Additionnal chart options.
|
||
*/
|
||
H.Chart.prototype.exportChartLocal = function (options, chartOptions,svg) {
|
||
var svg = svg;
|
||
var opt = new Opt(options, this.options.exporting, defaultExportOptions);
|
||
|
||
var type = opt.get("type");
|
||
if (!H.exporting.supports(type)) {
|
||
throw new Error("Unsupported export format on this platform: " + type);
|
||
}
|
||
|
||
var filename = opt.get("filename") + MIME_TYPE_TO_EXTENSION[type];
|
||
|
||
var data = {
|
||
content: undefined,
|
||
datauri: undefined,
|
||
blob: undefined
|
||
};
|
||
|
||
if (type == MIME_TYPES.CSV) {
|
||
// Copies some values from the options, so we can set it and change those
|
||
// through the options argument.
|
||
var hasCSVOptions = this.options.exporting && this.options.exporting.csv;
|
||
var csvOpt = new Opt((options || {}).csv, (this.options.exporting || {}).csv, defaultExportOptions.csv);
|
||
|
||
var oldOptions = {},
|
||
optionsToCopy = ["dateFormat", "itemDelimiter", "lineDelimiter"],
|
||
optionToCopy;
|
||
for (var i in optionsToCopy) {
|
||
optionToCopy = optionsToCopy[i];
|
||
if (csvOpt.get(optionToCopy)) {
|
||
if (!this.options.exporting) {
|
||
this.options.exporting = {};
|
||
}
|
||
if (!this.options.exporting.csv) {
|
||
this.options.exporting.csv = {};
|
||
}
|
||
|
||
oldOptions[optionToCopy] = this.options.exporting.csv[optionToCopy];
|
||
this.options.exporting.csv[optionToCopy] = csvOpt.get(optionToCopy);
|
||
}
|
||
}
|
||
|
||
var useLocalDecimalPoint = csvOpt.get("useLocalDecimalPoint");
|
||
|
||
var csv = this.getCSV(useLocalDecimalPoint);
|
||
data.content = csv;
|
||
|
||
if (hasCSVOptions) {
|
||
for (var i in optionsToCopy) {
|
||
optionToCopy = optionsToCopy[i];
|
||
if (csvOpt.get(optionToCopy)) {
|
||
this.options.exporting.csv[optionToCopy] = oldOptions[optionToCopy];
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
delete this.options.exporting.csv;
|
||
}
|
||
}
|
||
else if (type == MIME_TYPES.XLS) {
|
||
// Same as above
|
||
var hasCSVOptions = this.options.exporting && this.options.exporting.csv;
|
||
var csvOpt = new Opt((options || {}).csv, (this.options.exporting || {}).csv, defaultExportOptions.csv);
|
||
|
||
var oldOptions = {},
|
||
optionsToCopy = ["dateFormat"],
|
||
optionToCopy;
|
||
for (var i in optionsToCopy) {
|
||
optionToCopy = optionsToCopy[i];
|
||
if (csvOpt.get(optionToCopy)) {
|
||
if (!this.options.exporting) {
|
||
this.options.exporting = {};
|
||
}
|
||
if (!this.options.exporting.csv) {
|
||
this.options.exporting.csv = {};
|
||
}
|
||
|
||
oldOptions[optionToCopy] = this.options.exporting.csv[optionToCopy];
|
||
this.options.exporting.csv[optionToCopy] = csvOpt.get(optionToCopy);
|
||
}
|
||
}
|
||
|
||
var useLocalDecimalPoint = csvOpt.get("useLocalDecimalPoint");
|
||
|
||
var xls = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">' +
|
||
'<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>' +
|
||
'<x:Name>Sheet</x:Name>' +
|
||
'<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->' +
|
||
'<style>td{border:none;font-family: Calibri, sans-serif;} .number{mso-number-format:"0.00";}</style>' +
|
||
'<meta name=ProgId content=Excel.Sheet>' +
|
||
'</head><body>' +
|
||
this.getTable(useLocalDecimalPoint) +
|
||
'</body></html>';
|
||
data.content = xls;
|
||
|
||
if (hasCSVOptions) {
|
||
for (var i in optionsToCopy) {
|
||
optionToCopy = optionsToCopy[i];
|
||
if (csvOpt.get(optionToCopy)) {
|
||
this.options.exporting.csv[optionToCopy] = oldOptions[optionToCopy];
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
delete this.options.exporting.csv;
|
||
}
|
||
}
|
||
// Image processing
|
||
else {
|
||
var scale = opt.get("scale"),
|
||
sourceWidth = this.options.width || opt.get("sourceWidth") || this.chartWidth,
|
||
sourceHeight = this.options.height || opt.get("sourceHeight") || this.chartHeight,
|
||
destWidth = sourceWidth * scale,
|
||
destHeight = sourceHeight * scale;
|
||
|
||
var cChartOptions = chartOptions || this.options.exporting && this.options.exporting.chartOptions || {};
|
||
if (!cChartOptions.chart) {
|
||
cChartOptions.chart = { width: sourceWidth, height: sourceHeight };
|
||
}
|
||
else {
|
||
cChartOptions.chart.width = destWidth;
|
||
cChartOptions.chart.height = destHeight;
|
||
}
|
||
|
||
//var svg = this.getSVG(cChartOptions);
|
||
|
||
if (type == MIME_TYPES.SVG) {
|
||
data.content = svg;
|
||
}
|
||
else if (type == MIME_TYPES.PNG || type == MIME_TYPES.JPEG) {
|
||
debugger;
|
||
var canvas = svgToCanvas(svg, destWidth, destHeight);
|
||
data.datauri = browserSupportDownload && canvas.toDataURL && canvas.toDataURL(type);
|
||
data.blob = (type == MIME_TYPES.PNG) && !browserSupportDownload && canvas.msToBlob && canvas.msToBlob();
|
||
}
|
||
else if (type == MIME_TYPES.PDF) {
|
||
var canvas = svgToCanvas(svg, destWidth, destHeight);
|
||
|
||
var doc = new jsPDF('l', 'mm', [destWidth, destHeight]);;
|
||
doc.addImage(canvas, 'JPEG', 0, 0, destWidth, destHeight);
|
||
|
||
data.datauri = browserSupportDownload && doc.output('datauristring');
|
||
data.blob = !browserSupportDownload && doc.output('blob');
|
||
}
|
||
}
|
||
|
||
if (!data.content && !(data.datauri || data.blob)) {
|
||
throw new Error("Something went wrong while exporting the chart");
|
||
}
|
||
|
||
if (browserSupportDownload && (data.datauri || data.content)) {
|
||
a = document.createElement('a');
|
||
a.href = data.datauri || ('data:' + type + ';base64,' + window.btoa(unescape(encodeURIComponent(data.content))));
|
||
a.download = filename;
|
||
document.body.appendChild(a);
|
||
a.click();
|
||
a.remove();
|
||
}
|
||
else if (browserSupportBlob && (data.blob || data.content)) {
|
||
blobObject = data.blob || new Blob([data.content], { type: type });
|
||
window.navigator.msSaveOrOpenBlob(blobObject, filename);
|
||
}
|
||
else {
|
||
window.open(data);
|
||
}
|
||
}
|
||
|
||
H.Chart.prototype.getImageBase64 = function (options, chartOptions) {
|
||
var opt = new Opt(options, this.options.exporting, defaultExportOptions);
|
||
|
||
var type = opt.get("type");
|
||
if (!H.exporting.supports(type)) {
|
||
throw new Error("Unsupported export format on this platform: " + type);
|
||
}
|
||
|
||
var filename = opt.get("filename") + MIME_TYPE_TO_EXTENSION[type];
|
||
|
||
var data = {
|
||
content: undefined,
|
||
datauri: undefined,
|
||
blob: undefined
|
||
};
|
||
|
||
|
||
// Image processing
|
||
var
|
||
sourceWidth = this.options.width || opt.get("sourceWidth") || this.chartWidth,
|
||
sourceHeight = this.options.height || opt.get("sourceHeight") || this.chartHeight,
|
||
destWidth = sourceWidth,
|
||
destHeight = sourceHeight;
|
||
|
||
var cChartOptions = chartOptions || this.options.exporting && this.options.exporting.chartOptions || {};
|
||
if (!cChartOptions.chart) {
|
||
cChartOptions.chart = { width: sourceWidth, height: sourceHeight };
|
||
}
|
||
else {
|
||
cChartOptions.chart.width = destWidth;
|
||
cChartOptions.chart.height = destHeight;
|
||
}
|
||
|
||
var svg = this.getSVG(cChartOptions);
|
||
var canvas = svgToCanvas(svg, destWidth, destHeight);
|
||
//if (type == MIME_TYPES.PNG || type == MIME_TYPES.JPEG) {
|
||
data.content = svg;
|
||
data.datauri = browserSupportDownload && canvas.toDataURL && canvas.toDataURL(type);
|
||
data.blob = (type == MIME_TYPES.PNG) && !browserSupportDownload && canvas.msToBlob && canvas.msToBlob();
|
||
//a = document.createElement('a');
|
||
//a.href = 'data:' + type + ';base64,' + window.btoa(unescape(encodeURIComponent(data.content)));
|
||
//a.download = filename;
|
||
//document.body.appendChild(a);
|
||
//a.click();
|
||
//a.remove();
|
||
//}
|
||
return canvas.toDataURL(type);
|
||
}
|
||
|
||
// Forces method from export module to use the local version
|
||
H.Chart.prototype.exportChart = H.Chart.prototype.exportChartLocal;
|
||
|
||
|
||
|
||
H.getSVGs = function (charts) {
|
||
var svgArr = [],
|
||
top = 0,
|
||
width = 0;
|
||
|
||
$.each(charts, function (i, chart) {
|
||
|
||
var svg = chart.getSVG();
|
||
svg = svg.replace('<svg', '<g transform="translate(0,' + top + ')" ');
|
||
svg = svg.replace('</svg>', '</g>');
|
||
//svg = svg.replace('<svg', '<zg ct=' + chart.options.chartype);
|
||
//svg = svg.replace('</svg>', '</zg>');(<28><><EFBFBD><EFBFBD>ע<EFBFBD>͵Ĵ<CDB5><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD><C9B6><EFBFBD>ͼƬ)
|
||
|
||
top += chart.chartHeight;
|
||
width = Math.max(width, chart.chartWidth);
|
||
|
||
svgArr.push(svg);
|
||
});
|
||
|
||
return '<svg height="' + top + '" width="' + width + '" version="1.1" xmlns="http://www.w3.org/2000/svg">' + svgArr.join('') + '</svg>';
|
||
};
|
||
|
||
/**
|
||
* Redefines the export function of the official exporting module.
|
||
*@param fileName {String} file name
|
||
* @param type {String} file type
|
||
* @param chartOptions {Object} Additionnal chart options.
|
||
*/
|
||
H.exportChartPNG= function(fileName,type,chartArr){
|
||
var svg = this.getSVGs(chartArr);
|
||
$.messager.alert("<22><>ʾ",111);
|
||
var height =this.chartHeight*chartArr.length,width=this.chartWidth,type = type==null?'image/png':type;
|
||
var data = {
|
||
content: undefined,
|
||
datauri: undefined,
|
||
blob: undefined
|
||
};
|
||
|
||
var canvas = svgToCanvas(svg, 800, 800);
|
||
data.datauri = browserSupportDownload && canvas.toDataURL && canvas.toDataURL(type);
|
||
data.blob = (type == MIME_TYPES.PNG) && !browserSupportDownload && canvas.msToBlob && canvas.msToBlob();
|
||
if (!data.content && !(data.datauri || data.blob)) {
|
||
throw new Error("Something went wrong while exporting the chart");
|
||
}
|
||
|
||
if (browserSupportDownload && (data.datauri || data.content)) {
|
||
a = document.createElement('a');
|
||
a.href = data.datauri || ('data:' + type + ';base64,' + window.btoa(unescape(encodeURIComponent(data.content))));
|
||
a.download = fileName;
|
||
document.body.appendChild(a);
|
||
a.click();
|
||
a.remove();
|
||
}
|
||
else if (browserSupportBlob && (data.blob || data.content)) {
|
||
blobObject = data.blob || new Blob([data.content], { type: type });
|
||
window.navigator.msSaveOrOpenBlob(blobObject, filename);
|
||
}
|
||
else {
|
||
window.open(data);
|
||
}
|
||
}
|
||
|
||
}(Highcharts)); |