NGToolsCSharp/NGTools/Scripts/Highcharts-7.1.1/code/highcharts-export-clientside.js

540 lines
18 KiB
JavaScript
Raw Normal View History

2024-09-13 08:44:13 +00:00
(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));