%PDF- %PDF-
Direktori : /home/infra/dashboard/front/js/highcharts-export-clientside/ |
Current File : //home/infra/dashboard/front/js/highcharts-export-clientside/highcharts-export-clientside.js |
(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. var defaultHighChartsOptions = H.getOptions() || {}; if(!defaultHighChartsOptions.exporting) { defaultHighChartsOptions.exporting = {}; } defaultHighChartsOptions.exporting.url = "http://127.0.0.1:666/"; if(!defaultHighChartsOptions.exporting.csv) { defaultHighChartsOptions.exporting.csv = {}; } defaultHighChartsOptions.exporting.csv.url = "http://127.0.0.1:666/"; H.setOptions(defaultHighChartsOptions); 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; /** * Little helper function that you can set to the `filename` configuration * option to use the chart title for the filename when downloaded. */ H.exporting.USE_TITLE_FOR_FILENAME = function(options, chartOptions) { var title = this.title ? this.title.textStr.replace(/ /g, '-').toLowerCase() : 'chart'; return title; }; 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, callback) { var canvas = document.createElement('canvas'); canvas.setAttribute('width', width); canvas.setAttribute('height', height); canvg(canvas, svg, { ignoreMouse: true, ignoreAnimation: true, ignoreDimensions: true, ignoreClear: true, offsetX: 0, offsetY: 0, scaleWidth: width, scaleHeight: height, renderCallback: function() { callback(canvas); } }); 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 } }; var preRenderCsvXls = function (highChartsObject, options, chartOptions) { // Copies some values from the options, so we can set it and change those // through the options argument. var hasCSVOptions = highChartsObject.options.exporting && highChartsObject.options.exporting.csv; var csvOpt = new Opt((options || {}).csv, (highChartsObject.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 (!highChartsObject.options.exporting) { highChartsObject.options.exporting = {}; } if (!highChartsObject.options.exporting.csv) { highChartsObject.options.exporting.csv = {}; } oldOptions[optionToCopy] = highChartsObject.options.exporting.csv[optionToCopy]; highChartsObject.options.exporting.csv[optionToCopy] = csvOpt.get(optionToCopy); } } return { hasCSVOptions: hasCSVOptions, csvOpt: csvOpt, useLocalDecimalPoint: csvOpt.get("useLocalDecimalPoint"), optionsToCopy: optionsToCopy, oldOptions: oldOptions }; }; var renderCsv = function(highChartsObject, context, callback) { var data = { content: undefined, datauri: undefined, blob: undefined }; var csv = highChartsObject.getCSV(context.useLocalDecimalPoint); data.content = csv; callback(data); }; var renderXls = function(highChartsObject, context, callback) { var data = { content: undefined, datauri: undefined, blob: undefined }; 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>' + highChartsObject.getTable(context.useLocalDecimalPoint) + '</body></html>'; data.content = xls; callback(data); }; var postRenderCsvXls = function(highChartsObject, context) { if (context.hasCSVOptions) { for (var i in context.optionsToCopy) { optionToCopy = context.optionsToCopy[i]; if (context.csvOpt.get(optionToCopy)) { highChartsObject.options.exporting.csv[optionToCopy] = context.oldOptions[optionToCopy]; } } } else { delete highChartsObject.options.exporting.csv; } }; var preRenderImage = function (highChartsObject, options, chartOptions) { var opt = new Opt(options, highChartsObject.options.exporting, defaultExportOptions); var scale = opt.get("scale"), sourceWidth = highChartsObject.options.width || opt.get("sourceWidth") || highChartsObject.chartWidth, sourceHeight = highChartsObject.options.height || opt.get("sourceHeight") || highChartsObject.chartHeight, destWidth = sourceWidth * scale, destHeight = sourceHeight * scale; var cChartOptions = chartOptions || highChartsObject.options.exporting && highChartsObject.options.exporting.chartOptions || {}; if (!cChartOptions.chart) { cChartOptions.chart = { width: destWidth, height: destHeight }; } else { cChartOptions.chart.width = destWidth; cChartOptions.chart.height = destHeight; } var svg = highChartsObject.getSVG(cChartOptions); return { svg: svg, destWidth: destWidth, destHeight: destHeight }; }; var renderSvg = function(highChartsObject, context, callback) { var data = { content: undefined, datauri: undefined, blob: undefined }; data.content = context.svg; callback(data); }; var renderPngJpeg = function(highChartsObject, context, callback) { var data = { content: undefined, datauri: undefined, blob: undefined }; svgToCanvas(context.svg, context.destWidth, context.destHeight, function(canvas) { data.datauri = context.browserSupportDownload && canvas.toDataURL && canvas.toDataURL(context.type); data.blob = (context.type == MIME_TYPES.PNG) && !context.browserSupportDownload && canvas.msToBlob && canvas.msToBlob(); callback(data); }); }; var renderPdf = function(highChartsObject, context, callback) { var data = { content: undefined, datauri: undefined, blob: undefined }; svgToCanvas(context.svg, context.destWidth, context.destHeight, function(canvas) { var doc = new jsPDF('l', 'mm', [context.destWidth, context.destHeight]);; doc.addImage(canvas, 'JPEG', 0, 0, context.destWidth, context.destHeight); data.datauri = context.browserSupportDownload && doc.output('datauristring'); data.blob = !context.browserSupportDownload && doc.output('blob'); callback(data); }); }; var download = function(highChartsObject, context, data) { if (!data || (!data.content && !(data.datauri || data.blob))) { throw new Error("Something went wrong while exporting the chart"); } if (context.browserSupportDownload && (data.datauri || data.content)) { a = document.createElement('a'); a.href = data.datauri || ('data:' + context.type + ';base64,' + window.btoa(unescape(encodeURIComponent(data.content)))); a.download = context.filename; document.body.appendChild(a); a.click(); a.remove(); } else if (context.browserSupportBlob && (data.blob || data.content)) { blobObject = data.blob || new Blob([data.content], { type: context.type }); window.navigator.msSaveOrOpenBlob(blobObject, context.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) { 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 steps = { rendering: {}, download: download }; steps.rendering[MIME_TYPES.CSV] = { preRender: preRenderCsvXls, render: renderCsv, postRender: postRenderCsvXls }; steps.rendering[MIME_TYPES.XLS] = { preRender: preRenderCsvXls, render: renderXls, postRender: postRenderCsvXls }; steps.rendering[MIME_TYPES.SVG] = { preRender: preRenderImage, render: renderSvg }; steps.rendering[MIME_TYPES.PNG] = { preRender: preRenderImage, render: renderPngJpeg }; steps.rendering[MIME_TYPES.JPEG] = { preRender: preRenderImage, render: renderPngJpeg }; steps.rendering[MIME_TYPES.PDF] = { preRender: preRenderImage, render: renderPdf }; var highChartsObject = this; var context; if(steps.rendering[type].preRender) { context = steps.rendering[type].preRender(highChartsObject, options, chartOptions); } else { context = {}; } context.type = type; context.browserSupportDownload = browserSupportDownload; context.browserSupportBlob = browserSupportBlob; var filename = opt.get("filename"); if(typeof filename === "function") { context.filename = filename.bind(this)(options, chartOptions) + MIME_TYPE_TO_EXTENSION[type]; } else { context.filename = opt.get("filename") + MIME_TYPE_TO_EXTENSION[type]; } steps.rendering[type].render(highChartsObject, context, function(data) { if(steps.rendering[type].postRender) { steps.rendering[type].postRender(highChartsObject, context); } steps.download(highChartsObject, context, data); }); } // Forces method from export module to use the local version H.Chart.prototype.exportChart = H.Chart.prototype.exportChartLocal; }(Highcharts));