Skip to content

Commit

Permalink
highchart
Browse files Browse the repository at this point in the history
  • Loading branch information
之剑 committed Aug 25, 2016
1 parent c67a3c6 commit b80ce27
Show file tree
Hide file tree
Showing 9 changed files with 8,531 additions and 160 deletions.
268 changes: 268 additions & 0 deletions src/main/resources/public/js/highchart-exporting.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,268 @@
/*
Highcharts JS v4.2.6 (2016-08-02)
Exporting module
(c) 2010-2016 Torstein Honsi
License: www.highcharts.com/license
*/
(function (f) {
typeof module === "object" && module.exports ? module.exports = f : f(Highcharts)
})(function (f) {
var s = f.win, j = s.document, B = f.Chart, u = f.addEvent, C = f.removeEvent, D = f.fireEvent, r = f.createElement, t = f.discardElement, w = f.css, l = f.merge, m = f.each, q = f.extend, F = f.splat, G = Math.max, H = f.isTouchDevice, I = f.Renderer.prototype.symbols, z = f.getOptions(), A;
q(z.lang, {
printChart: "Print chart",
downloadPNG: "Download PNG image",
downloadJPEG: "Download JPEG image",
downloadPDF: "Download PDF document",
downloadSVG: "Download SVG vector image",
contextButtonTitle: "Chart context menu"
});
z.navigation = {
menuStyle: {border: "1px solid #A0A0A0", background: "#FFFFFF", padding: "5px 0"},
menuItemStyle: {padding: "0 10px", background: "none", color: "#303030", fontSize: H ? "14px" : "11px"},
menuItemHoverStyle: {background: "#4572A5", color: "#FFFFFF"},
buttonOptions: {
symbolFill: "#E0E0E0",
symbolSize: 14,
symbolStroke: "#666",
symbolStrokeWidth: 3,
symbolX: 12.5,
symbolY: 10.5,
align: "right",
buttonSpacing: 3,
height: 22,
theme: {fill: "white", stroke: "none"},
verticalAlign: "top",
width: 24
}
};
z.exporting = {
type: "image/png", url: "https://export.highcharts.com/", printMaxWidth: 780, scale: 2, buttons: {
contextButton: {
menuClassName: "highcharts-contextmenu",
symbol: "menu",
_titleKey: "contextButtonTitle",
menuItems: [{
textKey: "printChart", onclick: function () {
this.print()
}
}, {separator: !0}, {
textKey: "downloadPNG", onclick: function () {
this.exportChart()
}
}, {
textKey: "downloadJPEG", onclick: function () {
this.exportChart({type: "image/jpeg"})
}
}, {
textKey: "downloadPDF", onclick: function () {
this.exportChart({type: "application/pdf"})
}
},
{
textKey: "downloadSVG", onclick: function () {
this.exportChart({type: "image/svg+xml"})
}
}]
}
}
};
f.post = function (a, b, e) {
var c, a = r("form", l({
method: "post",
action: a,
enctype: "multipart/form-data"
}, e), {display: "none"}, j.body);
for (c in b)r("input", {type: "hidden", name: c, value: b[c]}, null, a);
a.submit();
t(a)
};
q(B.prototype, {
sanitizeSVG: function (a) {
return a.replace(/zIndex="[^"]+"/g, "").replace(/isShadow="[^"]+"/g, "").replace(/symbolName="[^"]+"/g, "").replace(/jQuery[0-9]+="[^"]+"/g, "").replace(/url\([^#]+#/g, "url(#").replace(/<svg /,
'<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ (NS[0-9]+\:)?href=/g, " xlink:href=").replace(/\n/, " ").replace(/<\/svg>.*?$/, "</svg>").replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g, '$1="rgb($2)" $1-opacity="$3"').replace(/&nbsp;/g, "\u00a0").replace(/&shy;/g, "\u00ad").replace(/<IMG /g, "<image ").replace(/<(\/?)TITLE>/g, "<$1title>").replace(/height=([^" ]+)/g, 'height="$1"').replace(/width=([^" ]+)/g, 'width="$1"').replace(/hc-svg-href="([^"]+)">/g, 'xlink:href="$1"/>').replace(/ id=([^" >]+)/g,
' id="$1"').replace(/class=([^" >]+)/g, 'class="$1"').replace(/ transform /g, " ").replace(/:(path|rect)/g, "$1").replace(/style="([^"]+)"/g, function (a) {
return a.toLowerCase()
})
}, getChartHTML: function () {
return this.container.innerHTML
}, getSVG: function (a) {
var b = this, e, c, g, k, h, d = l(b.options, a), n = d.exporting.allowHTML;
if (!j.createElementNS)j.createElementNS = function (a, b) {
return j.createElement(b)
};
c = r("div", null, {
position: "absolute",
top: "-9999em",
width: b.chartWidth + "px",
height: b.chartHeight + "px"
}, j.body);
g = b.renderTo.style.width;
h = b.renderTo.style.height;
g = d.exporting.sourceWidth || d.chart.width || /px$/.test(g) && parseInt(g, 10) || 600;
h = d.exporting.sourceHeight || d.chart.height || /px$/.test(h) && parseInt(h, 10) || 400;
q(d.chart, {animation: !1, renderTo: c, forExport: !0, renderer: "SVGRenderer", width: g, height: h});
d.exporting.enabled = !1;
delete d.data;
d.series = [];
m(b.series, function (a) {
k = l(a.userOptions, {animation: !1, enableMouseTracking: !1, showCheckbox: !1, visible: a.visible});
k.isInternal || d.series.push(k)
});
a && m(["xAxis",
"yAxis"], function (b) {
m(F(a[b]), function (a, c) {
d[b][c] = l(d[b][c], a)
})
});
e = new f.Chart(d, b.callback);
m(["xAxis", "yAxis"], function (a) {
m(b[a], function (b, c) {
var d = e[a][c], f = b.getExtremes(), g = f.userMin, f = f.userMax;
d && (g !== void 0 || f !== void 0) && d.setExtremes(g, f, !0, !1)
})
});
g = e.getChartHTML();
d = null;
e.destroy();
t(c);
if (n && (c = g.match(/<\/svg>(.*?$)/)))c = '<foreignObject x="0" y="0" width="200" height="200"><body xmlns="http://www.w3.org/1999/xhtml">' + c[1] + "</body></foreignObject>", g = g.replace("</svg>", c + "</svg>");
g = this.sanitizeSVG(g);
return g = g.replace(/(url\(#highcharts-[0-9]+)&quot;/g, "$1").replace(/&quot;/g, "'")
}, getSVGForExport: function (a, b) {
var e = this.options.exporting;
return this.getSVG(l({chart: {borderRadius: 0}}, e.chartOptions, b, {
exporting: {
sourceWidth: a && a.sourceWidth || e.sourceWidth,
sourceHeight: a && a.sourceHeight || e.sourceHeight
}
}))
}, exportChart: function (a, b) {
var e = this.getSVGForExport(a, b), a = l(this.options.exporting, a);
f.post(a.url, {
filename: a.filename || "chart", type: a.type, width: a.width || 0, scale: a.scale,
svg: e
}, a.formAttributes)
}, print: function () {
var a = this, b = a.container, e = [], c = b.parentNode, f = j.body, k = f.childNodes, h = a.options.exporting.printMaxWidth, d, n;
if (!a.isPrinting) {
a.isPrinting = !0;
a.pointer.reset(null, 0);
D(a, "beforePrint");
if (n = h && a.chartWidth > h)d = [a.options.chart.width, void 0, !1], a.setSize(h, void 0, !1);
m(k, function (a, b) {
if (a.nodeType === 1)e[b] = a.style.display, a.style.display = "none"
});
f.appendChild(b);
s.focus();
s.print();
setTimeout(function () {
c.appendChild(b);
m(k, function (a, b) {
if (a.nodeType ===
1)a.style.display = e[b]
});
a.isPrinting = !1;
n && a.setSize.apply(a, d);
D(a, "afterPrint")
}, 1E3)
}
}, contextMenu: function (a, b, e, c, f, k, h) {
var d = this, n = d.options.navigation, l = n.menuItemStyle, o = d.chartWidth, p = d.chartHeight, E = "cache-" + a, i = d[E], v = G(f, k), x, y, s, t = function (b) {
d.pointer.inClass(b.target, a) || y()
};
if (!i)d[E] = i = r("div", {className: a}, {
position: "absolute",
zIndex: 1E3,
padding: v + "px"
}, d.container), x = r("div", null, q({
MozBoxShadow: "3px 3px 10px #888",
WebkitBoxShadow: "3px 3px 10px #888",
boxShadow: "3px 3px 10px #888"
},
n.menuStyle), i), y = function () {
w(i, {display: "none"});
h && h.setState(0);
d.openMenu = !1
}, u(i, "mouseleave", function () {
s = setTimeout(y, 500)
}), u(i, "mouseenter", function () {
clearTimeout(s)
}), u(j, "mouseup", t), u(d, "destroy", function () {
C(j, "mouseup", t)
}), m(b, function (a) {
if (a) {
var b = a.separator ? r("hr", null, null, x) : r("div", {
onmouseover: function () {
w(this, n.menuItemHoverStyle)
}, onmouseout: function () {
w(this, l)
}, onclick: function (b) {
b && b.stopPropagation();
y();
a.onclick && a.onclick.apply(d, arguments)
}, innerHTML: a.text ||
d.options.lang[a.textKey]
}, q({cursor: "pointer"}, l), x);
d.exportDivElements.push(b)
}
}), d.exportDivElements.push(x, i), d.exportMenuWidth = i.offsetWidth, d.exportMenuHeight = i.offsetHeight;
b = {display: "block"};
e + d.exportMenuWidth > o ? b.right = o - e - f - v + "px" : b.left = e - v + "px";
c + k + d.exportMenuHeight > p && h.alignOptions.verticalAlign !== "top" ? b.bottom = p - c - v + "px" : b.top = c + k - v + "px";
w(i, b);
d.openMenu = !0
}, addButton: function (a) {
var b = this, e = b.renderer, c = l(b.options.navigation.buttonOptions, a), g = c.onclick, k = c.menuItems, h, d, n =
{stroke: c.symbolStroke, fill: c.symbolFill}, j = c.symbolSize || 12;
if (!b.btnCount)b.btnCount = 0;
if (!b.exportDivElements)b.exportDivElements = [], b.exportSVGElements = [];
if (c.enabled !== !1) {
var o = c.theme, p = o.states, m = p && p.hover, p = p && p.select, i;
delete o.states;
g ? i = function (a) {
a.stopPropagation();
g.call(b, a)
} : k && (i = function () {
b.contextMenu(d.menuClassName, k, d.translateX, d.translateY, d.width, d.height, d);
d.setState(2)
});
c.text && c.symbol ? o.paddingLeft = f.pick(o.paddingLeft, 25) : c.text || q(o, {
width: c.width, height: c.height,
padding: 0
});
d = e.button(c.text, 0, 0, i, o, m, p).attr({
title: b.options.lang[c._titleKey],
"stroke-linecap": "round",
zIndex: 3
});
d.menuClassName = a.menuClassName || "highcharts-menu-" + b.btnCount++;
c.symbol && (h = e.symbol(c.symbol, c.symbolX - j / 2, c.symbolY - j / 2, j, j).attr(q(n, {
"stroke-width": c.symbolStrokeWidth || 1,
zIndex: 1
})).add(d));
d.add().align(q(c, {width: d.width, x: f.pick(c.x, A)}), !0, "spacingBox");
A += (d.width + c.buttonSpacing) * (c.align === "right" ? -1 : 1);
b.exportSVGElements.push(d, h)
}
}, destroyExport: function (a) {
var a =
a.target, b, e;
for (b = 0; b < a.exportSVGElements.length; b++)if (e = a.exportSVGElements[b])e.onclick = e.ontouchstart = null, a.exportSVGElements[b] = e.destroy();
for (b = 0; b < a.exportDivElements.length; b++)e = a.exportDivElements[b], C(e, "mouseleave"), a.exportDivElements[b] = e.onmouseout = e.onmouseover = e.ontouchstart = e.onclick = null, t(e)
}
});
I.menu = function (a, b, e, c) {
return ["M", a, b + 2.5, "L", a + e, b + 2.5, "M", a, b + c / 2 + 0.5, "L", a + e, b + c / 2 + 0.5, "M", a, b + c - 1.5, "L", a + e, b + c - 1.5]
};
B.prototype.callbacks.push(function (a) {
var b, e = a.options.exporting,
c = e.buttons;
A = 0;
if (e.enabled !== !1) {
for (b in c)a.addButton(c[b]);
u(a, "destroy", a.destroyExport)
}
})
});
Loading

0 comments on commit b80ce27

Please sign in to comment.