forked from cbojaca/RappidExample
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjoint.shapes.chart.min.js
15 lines (9 loc) · 32.4 KB
/
joint.shapes.chart.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*! Rappid v1.7.1 - HTML5 Diagramming Framework - TRIAL VERSION
Copyright (c) 2015 client IO
2016-03-03
This Source Code Form is subject to the terms of the Rappid Trial License
, v. 2.0. If a copy of the Rappid License was not distributed with this
file, You can obtain one at http://jointjs.com/license/rappid_v2.txt
or from the Rappid archive as was distributed by client IO. See the LICENSE file.*/
joint.shapes.chart={},joint.shapes.chart.Plot=joint.shapes.basic.Generic.extend({markup:['<clipPath class="clip"><rect/></clipPath>','<g class="rotatable">','<g class="scalable"></g>','<g class="background"><rect/><text/></g>','<g class="axis">','<g class="y-axis"><path/><g class="ticks"></g></g>','<g class="x-axis"><path/><g class="ticks"></g></g>','<g class="markings"></g>',"</g>",'<g class="data"><g class="series"></g></g>','<g class="foreground">','<rect/><text class="caption"/><text class="subcaption"/>','<g class="legend"><g class="legend-items"></g></g>','<line class="guideline x-guideline" /><line class="guideline y-guideline" />',"</g>","</g>"].join(""),tickMarkup:'<g class="tick"><line/><text/></g>',pointMarkup:'<g class="point"><circle/><text/></g>',barMarkup:'<path class="bar"/>',markingMarkup:'<g class="marking"><rect/><text/></g>',serieMarkup:'<g><clipPath class="serie-clip"><rect/></clipPath><path/><g class="bars"></g><g class="points"></g></g>',legendItemMarkup:'<g class="legend-item"><circle/><text/></g>',defaults:joint.util.deepSupplement({type:"chart.Plot",attrs:{".data path":{fill:"none",stroke:"black"},".data .bars rect":{fill:"none",stroke:"black"},".background rect":{fill:"white",stroke:"#e5e5e5",opacity:1},".background text":{fill:"black",text:"No data available.",ref:".","ref-x":.5,"ref-y":.5,"text-anchor":"middle","y-alignment":"middle",display:"none"},".foreground > rect":{fill:"white",stroke:"#e5e5e5",opacity:0,"pointer-events":"none"},".foreground .caption":{fill:"black",text:"",ref:".foreground > rect","ref-x":.5,"ref-y":10,"text-anchor":"middle","y-alignment":"middle","font-size":14},".foreground .subcaption":{fill:"black",text:"",ref:".foreground > rect","ref-x":.5,"ref-y":23,"text-anchor":"middle","y-alignment":"middle","font-size":10},".point":{display:"inline-block"},".point circle":{r:2,stroke:"black",fill:"black",opacity:.3},".point text":{fill:"black","font-size":8,"text-anchor":"middle",display:"none"},".axis path":{fill:"none",stroke:"black"},".axis .tick":{fill:"none",stroke:"black"},".y-axis .tick line":{fill:"none",stroke:"black",x2:2,y2:0,opacity:1},".x-axis .tick line":{fill:"none",stroke:"black",x2:0,y2:-3,opacity:1},".y-axis .tick text":{fill:"black",stroke:"none","font-size":10,"text-anchor":"end"},".x-axis .tick text":{fill:"black",stroke:"none","font-size":10,"text-anchor":"middle"},".y-axis .tick text > tspan":{dy:"-.5em",x:-5},".x-axis .tick text > tspan":{dy:".5em",x:0},".axis .markings":{fill:"black",stroke:"none","fill-opacity":1},".axis .markings text":{fill:"black","text-anchor":"end","font-size":10,dy:-5,dx:-5},".guideline":{"pointer-events":"none",display:"none"},".x-guideline":{stroke:"black",visibility:"hidden"},".y-guideline":{stroke:"black",visibility:"hidden"},".legend":{ref:".background","ref-x":10,"ref-y":10},".legend-item text":{fill:"black",transform:"translate(14, 0)","font-size":11},".legend-item circle":{r:5,transform:"translate(5,5)"},".legend-item":{cursor:"pointer"},".legend-item.disabled circle":{fill:"gray"},".legend-item.disabled text":{opacity:.5}}},joint.shapes.basic.Generic.prototype.defaults),legendPosition:function(a,b){b=b||{},this.trigger("batch:start"),this.removeAttr([".legend/ref-x",".legend/ref-y",".legend/ref-dx",".legend/ref-dy",".legend/x-alignment",".legend/y-alignment"],{silent:!0});var c=b.padding||10,d={n:{".legend":{"ref-x":.5,"x-alignment":-.5,"ref-y":c}},ne:{".legend":{"ref-dx":-c,"x-alignment":-.999,"ref-y":c}},e:{".legend":{"ref-dx":-c,"x-alignment":-.999,"ref-y":.5,"y-alignment":-.5}},se:{".legend":{"ref-dx":-c,"ref-dy":-c,"x-alignment":-.999,"y-alignment":-.999}},s:{".legend":{"ref-x":.5,"ref-dy":-c,"x-alignment":-.5,"y-alignment":-.999}},sw:{".legend":{"ref-x":c,"ref-dy":-c,"y-alignment":-.999}},w:{".legend":{"ref-x":c,"ref-y":.5,"y-alignment":-.5}},nw:{".legend":{"ref-x":c,"ref-y":c}},nnw:{".legend":{"ref-x":c,"ref-y":-c,"y-alignment":-.999}},nn:{".legend":{"ref-x":.5,"ref-y":-c,"x-alignment":-.5,"y-alignment":-.999}},nne:{".legend":{"ref-dx":-c,"ref-y":-c,"x-alignment":-.999,"y-alignment":-.999}},nnee:{".legend":{"ref-dx":c,"ref-y":-c,"y-alignment":-.999}},nee:{".legend":{"ref-y":c,"ref-dx":c}},ee:{".legend":{"ref-dx":c,"ref-y":.5,"y-alignment":-.5}},see:{".legend":{"ref-dx":c,"ref-dy":-c,"y-alignment":-.999}},ssee:{".legend":{"ref-dx":c,"ref-dy":c}},sse:{".legend":{"ref-dx":-c,"ref-dy":c,"x-alignment":-.999}},ss:{".legend":{"ref-x":.5,"ref-dy":c,"x-alignment":-.5}},ssw:{".legend":{"ref-x":c,"ref-dy":c}},ssww:{".legend":{"ref-x":-c,"ref-dy":c,"x-alignment":-.999}},sww:{".legend":{"ref-x":-c,"ref-dy":-c,"x-alignment":-.999,"y-alignment":-.999}},ww:{".legend":{"ref-x":-c,"ref-y":.5,"x-alignment":-.999,"y-alignment":-.5}},nww:{".legend":{"ref-x":-c,"ref-y":c,"x-alignment":-.999}},nnww:{".legend":{"ref-x":-c,"ref-y":-c,"x-alignment":-.999,"y-alignment":-.999}}};d[a]&&this.attr(d[a]),this.trigger("batch:stop")},addPoint:function(a,b,c){c=c||{};var d=this.get("series"),e=_.findIndex(d,{name:b});if(-1===e)throw new Error("Serie "+b+" was not found.");var f=_.cloneDeep(d[e]);f.data.push(a),_.isFinite(c.maxLen)&&f.data.length>c.maxLen&&f.data.shift(),d=d.slice(),d[e]=f,this.set("series",d,c)},lastPoint:function(a){return _.last(_.findWhere(this.get("series"),{name:a}).data)},firstPoint:function(a){return _.first(_.findWhere(this.get("series"),{name:a}).data)}}),joint.shapes.chart.PlotView=joint.dia.ElementView.extend({events:{mousemove:"onMouseMove",mouseout:"onMouseOut"},initialize:function(){joint.dia.ElementView.prototype.initialize.apply(this,arguments),this.listenTo(this.model,"change:series change:interpolate change:padding change:canvas change:markings change:axis",_.bind(function(){this.update()},this)),this.on("cell:pointerdown",this.onPointerDown,this),this._disabledSeries=[]},renderMarkup:function(){joint.dia.ElementView.prototype.renderMarkup.apply(this,arguments),this.elDataClipPath=this.$(".clip")[0],this.elDataClipPathRect=this.elDataClipPath.firstChild,this.elBackgroundRect=this.$(".background rect")[0],this.elBackgroundText=this.$(".background text")[0],this.elForeground=this.$(".foreground")[0],this.elForegroundRect=this.$(".foreground rect")[0],this.elDataSeries=this.$(".data .series")[0],this.elYAxisPath=this.$(".y-axis path")[0],this.elYAxisTicks=this.$(".y-axis .ticks")[0],this.elXAxisPath=this.$(".x-axis path")[0],this.elXAxisTicks=this.$(".x-axis .ticks")[0],this.elMarkings=this.$(".axis .markings")[0],this.elXGuideline=this.$(".x-guideline")[0],this.elYGuideline=this.$(".y-guideline")[0],this.elLegend=this.$(".legend")[0],this.elLegendItems=this.$(".legend-items")[0],this.elTick=V(this.model.tickMarkup),this.elMarking=V(this.model.markingMarkup),this.elLegendItem=V(this.model.legendItemMarkup),this.elPoint=V(this.model.pointMarkup),this.elBar=V(this.model.barMarkup),this.elSerie=V(this.model.serieMarkup),this.elDataClipPath.id="clip_"+this.cid,V(this.$(".data")[0]).attr("clip-path","url(#"+this.elDataClipPath.id+")"),V(this.elMarkings).attr("clip-path","url(#"+this.elDataClipPath.id+")")},update:function(a){a=this.filterSeries(a),this.calculateStats(a);var b=this.model.get("size"),c=b.width,d=b.height;this.canvas=_.extend({x:0,y:0,width:c,height:d},this.model.get("canvas"));var e,f={top:0,right:0,bottom:0,left:0},h=this.model.get("padding");e=_.isObject(h)?_.extend({},f,h):_.isUndefined(h)?f:{top:h,right:2*h,bottom:2*h,left:h},this.canvas=g.rect(this.canvas).moveAndExpand(g.rect(e.left,e.top,-e.right,-e.bottom));var i={x:0,y:0,width:c,height:d};V(this.elDataClipPathRect).attr(i),V(this.elBackgroundRect).attr(i),V(this.elForegroundRect).attr(i),this.updateAxis(),this.updateMarkings(),this.isEmpty()?$(this.elBackgroundText).show():$(this.elBackgroundText).hide(),this.updateSeries(a),this.updateLegend(),joint.dia.ElementView.prototype.update.apply(this,arguments)},calculateStats:function(a){a=a||this.model.get("series");var b=[],c=[],d={},e={},f={};_.each(a,function(a,g){var h=f[a.name||g]||(f[a.name||g]={});h.decreasingX=!0,h.decreasingY=!0,h.nonDecreasingX=!0,h.nonDecreasingY=!0;var i;_.each(a.data,function(f){h.minX=_.isUndefined(h.minX)?f.x:Math.min(h.minX,f.x),h.maxX=_.isUndefined(h.maxX)?f.x:Math.max(h.maxX,f.x),h.minY=_.isUndefined(h.minY)?f.y:Math.min(h.minY,f.y),h.maxY=_.isUndefined(h.maxY)?f.y:Math.max(h.maxY,f.y),i&&(h.decreasingX=h.decreasingX&&f.x<i.x,h.decreasingY=h.decreasingY&&f.y<i.y,h.nonDecreasingX=h.nonDecreasingX&&f.x>=i.x,h.nonDecreasingY=h.nonDecreasingY&&f.y>=i.y),_.contains(b,f.x)||b.push(f.x),_.contains(c,f.y)||c.push(f.y),(d[f.x]||(d[f.x]=[])).push({serie:a,x:f.x,y:f.y}),(e[f.y]||(e[f.y]=[])).push({serie:a,x:f.x,y:f.y}),i=f})});var g=this.model.get("axis")||{},h=g["x-axis"]||{},i=g["y-axis"]||{};this.stats={minX:_.isUndefined(h.min)?_.min(b):h.min,maxX:_.isUndefined(h.max)?_.max(b):h.max,minY:_.isUndefined(i.min)?_.min(c):i.min,maxY:_.isUndefined(i.max)?_.max(c):i.max,bySerie:f,xValues:b,yValues:c,xMap:d,yMap:e}},isEmpty:function(){return!this.stats.xValues.length},updateSeries:function(a){if(a=a||this.model.get("series"),this.elDataSeries.textContent="",!this.isEmpty()){var b=[this.stats.minX,this.stats.maxX],c=[this.stats.minY,this.stats.maxY],d=[this.canvas.x,this.canvas.x+this.canvas.width],e=[this.canvas.y+this.canvas.height,this.canvas.y],f=this.model.get("attrs");_.each(a,function(a,h){var i=a.data,j=[],k=this.elSerie.clone().attr("class",a.name||"serie-"+h);V(this.elDataSeries).append(k),_.each(i,function(h){var i=g.scale.linear(b,d,h.x),k=g.scale.linear(c,e,h.y);j.push({x:i,y:k}),f[".point"]&&"none"!==f[".point"].display&&this.renderPoint(h,a),a.bars&&this.renderBar(h,a)},this);var l=k.findOne(".serie-clip"),m=this.model.get("size"),n=this.stats.bySerie[a.name||h],o=g.scale.linear(b,d,n.minX),p=g.scale.linear(b,d,n.maxX),q=l.findOne("rect");if(q.attr(g.rect(o,0,p-o,m.height)),!a.bars){var r=k.findOne("path");r.attr({d:this.seriePathData(j,a,h),"clip-path":"url(#"+l.node.id+")"})}},this)}},seriePathClipData:function(a,b){var c=10,d=this.model.get("size"),e=_.first(a),f=(_.last(a),["M",e.x,e.y,"V",d.height+c]);return f.join(" ")},renderBar:function(a,b){var c=[this.stats.minX,this.stats.maxX],d=[this.stats.minY,this.stats.maxY],e=[this.canvas.x,this.canvas.x+this.canvas.width],f=[this.canvas.y+this.canvas.height,this.canvas.y],h=g.scale.linear(c,e,a.x),i=g.scale.linear(d,f,a.y),j=b.bars.barWidth||.8,k=j>1?j:this.canvas.width/(this.stats.maxX-this.stats.minX)*j,l=g.scale.linear(d,f,0)-i,m=a["top-rx"]||b.bars["top-rx"],n=a["top-ry"]||b.bars["top-ry"],o=a["bottom-rx"]||b.bars["bottom-rx"],p=a["bottom-ry"]||b.bars["bottom-ry"],q={left:h,middle:h-k/2,right:h-k}[b.bars.align||"middle"],r=this.elBar.clone();r.attr({"data-serie":b.name,"data-x":a.x,"data-y":a.y,d:V.rectToPath({x:q,y:i,width:k,height:l,"top-rx":m,"top-ry":n,"bottom-rx":o,"bottom-ry":p})});var s=b.name||"serie-"+this.model.get("series").indexOf(b);return V(this.elDataSeries).findOne("."+s+" .bars").append(r),r.node},renderPoint:function(a,b){var c=[this.stats.minX,this.stats.maxX],d=[this.stats.minY,this.stats.maxY],e=[this.canvas.x,this.canvas.x+this.canvas.width],f=[this.canvas.y+this.canvas.height,this.canvas.y],h=g.scale.linear(c,e,a.x),i=g.scale.linear(d,f,a.y),j=this.elPoint.clone();j.attr({"data-serie":b.name,"data-x":a.x,"data-y":a.y}),j.findOne("circle").attr({cx:h,cy:i}),j.findOne("text").attr({x:h,dy:i}).text(this.pointLabel(a,b));var k=b.name||"serie-"+this.model.get("series").indexOf(b);return V(this.elDataSeries).findOne("."+k+" .points").append(j),j.node},seriePathData:function(a,b,c){var d,e,f,h=_.isUndefined(b.interpolate)?this.model.get("interpolate"):b.interpolate,i=a.length;switch(h){case"bezier":d=g.bezier.curveThroughPoints(a);break;case"step":for(f=a[0],d=["M",f.x,f.y],e=1;i>e;e++)d.push("H",(f.x+a[e].x)/2,"V",a[e].y),f=a[e];break;case"stepBefore":for(d=["M",a[0].x,a[0].y],e=1;i>e;e++)d.push("V",a[e].y,"H",a[e].x);break;case"stepAfter":for(d=["M",a[0].x,a[0].y],e=1;i>e;e++)d.push("H",a[e].x,"V",a[e].y);break;default:for(d=["M"],e=0;i>e;e++)d.push(a[e].x,a[e].y)}return d=this.fixPathForFill(d,a,b,c),d.join(" ")},fixPathForFill:function(a,b,c,d){if(0===b.length)return a;var e=this.stats.bySerie[c.name||d];if(!e.nonDecreasingX)return a;var f=10,g=this.model.get("size"),h=_.first(b),i=_.last(b),j=["M",i.x,g.height+f,"H",h.x-f,"V",h.y];return a[0]="L",j.concat(a)},updateAxis:function(){var a=this.model.get("size"),b=a.width,c=a.height,d=this.model.get("axis"),e=this.canvas.height/c;this.canvas.width/b;if(V(this.elYAxisPath).attr("d",["M",0,0,"L",0,c].join(" ")),V(this.elXAxisPath).attr("d",["M",0,c,"L",b,c].join(" ")),this.elXAxisTicks.textContent="",this.elYAxisTicks.textContent="",!this.isEmpty()){var f=[this.stats.minX,this.stats.maxX],h=[this.stats.minY,this.stats.maxY],i=[this.canvas.x,this.canvas.x+this.canvas.width],j=[0,this.canvas.height],k=(f[1]-f[0],h[1]-h[0]),l=d&&d["y-axis"]||{},m=d&&d["x-axis"]||{},n=k>0?l.ticks-1||10:0,o=k/n/e,p=h[0];_.each(_.range(n+1),function(a){var b=g.scale.linear(h,j,p),c=this.elTick.clone();c.translate(0,b),V(this.elYAxisTicks).append(c);var d=h[1]-(p-h[0]);d+=g.scale.linear(j,h,this.canvas.y)-h[0],c.findOne("text").text(this.tickLabel(d,l)),p+=o},this),_.each(this.stats.xValues,function(a,d){if(d%(m.tickStep||1)===0){var e=g.scale.linear(f,i,a);if(!(e>b)){var h=this.elTick.clone();h.translate(e,c),V(this.elXAxisTicks).append(h),h.findOne("text").text(this.tickLabel(a,m))}}},this)}},tickLabel:function(a,b){if(_.isFunction(b.tickFormat))return b.tickFormat(a);var c=b.tickFormat||".1f",d=joint.util.format.number(c,a);return d+(_.isFunction(b.tickSuffix)?b.tickSuffix(a):b.tickSuffix||"")},pointLabel:function(a,b){if(_.isFunction(b.pointFormat))return b.pointFormat(a);var c=b.pointFormat||".1f",d=joint.util.format.number(c,a.y);return d+(b.pointSuffix||"")},updateMarkings:function(){function a(a,b){return _.isUndefined(a)?b:a}this.elMarkings.textContent="";var b=this.model.get("markings");if(b&&0!==b.length){var c=this.model.get("size"),d=c.width,e=c.height,f=[this.stats.minX,this.stats.maxX],h=[this.stats.minY,this.stats.maxY],i=[this.canvas.x,this.canvas.x+this.canvas.width],j=[this.canvas.y,this.canvas.y+this.canvas.height];_.each(b,function(b,c){var k=b.start||b.end,l=b.end||b.start,m=Math.min(a(k.x,this.stats.minX),a(l.x,this.stats.minX)),n=Math.max(a(k.x,this.stats.maxX),a(l.x,this.stats.maxX)),o=Math.min(a(k.y,this.stats.minY),a(l.y,this.stats.minY)),p=Math.max(a(k.y,this.stats.maxY),a(l.y,this.stats.maxY)),q=_.isUndefined(k.x)||_.isUndefined(l.x),r=_.isUndefined(k.y)||_.isUndefined(l.y);q&&(i=[0,d]),r&&(j=[0,e]);var s=g.scale.linear(f,i,m),t=g.scale.linear(f,i,n),u=g.scale.linear(h,j,o),v=g.scale.linear(h,j,p),w=s,x=j[1]-v+j[0],y=t-s,z=v-u;y=Math.max(y,1),z=Math.max(z,1);var A=this.elMarking.clone();A.findOne("rect").attr({x:w,y:x,width:y,height:z}),A.findOne("text").text(b.label||"").attr({x:w+y,y:x});var B=A.attr("class")+" "+(b.name||"marking-"+c);A.attr(_.extend({"class":B},b.attrs)),V(this.elMarkings).append(A)},this)}},updateLegend:function(){var a=this.model.get("series");this.elLegendItems.textContent="",_.each(a,function(a,b){if((!_.isFunction(a.showLegend)||a.showLegend(a,this.stats.bySerie[a.name||b]))&&a.showLegend!==!1){var c=this.elLegendItem.clone();_.contains(this._disabledSeries,a.name)&&c.addClass("disabled"),c.attr("data-serie",a.name),c.findOne("circle").attr({fill:this.getSerieColor(a.name)}),c.findOne("text").text(a.label||a.name),c.translate(0,b*(a.legendLabelLineHeight||16)),V(this.elLegendItems).append(c)}},this)},getSerieColor:function(a){var b=this.model.get("attrs"),c=_.find(b,function(b,c){return _.contains(c,a)?!0:void 0});return c?c.stroke||c.fill:"black"},hideSerie:function(a){_.contains(this._disabledSeries,a)||this._disabledSeries.push(a);var b=this.filterSeries();this.update(b)},showSerie:function(a){this._disabledSeries=_.without(this._disabledSeries,a);var b=this.filterSeries();this.update(b)},filterSeries:function(a){return a=a||this.model.get("series"),a=_.reject(a,function(a){return _.contains(this._disabledSeries,a.name)},this)},onPointerDown:function(a,b,c){var d=$(a.target).closest(".legend-item")[0];d&&(V(d).toggleClass("disabled"),V(d).hasClass("disabled")?this.hideSerie(V(d).attr("data-serie")):this.showSerie(V(d).attr("data-serie")))},onMouseMove:function(a){this.showGuidelines(a.clientX,a.clientY,a)},onMouseOut:function(a){this.hideGuidelines(),this.trigger("mouseout",a)},showGuidelines:function(a,b,c){var d=this.model.get("angle"),e=this.model.getBBox(),f=(this.model.get("series"),g.point(V(this.paper.viewport).toLocalPoint(a,b)).rotate(e.center(),d));if(g.rect(e).containsPoint(f)){var h=this.model.get("size"),i=f.x-e.x,j=f.y-e.y;V(this.elXGuideline).attr({x1:i,y1:0,x2:i,y2:h.height,visibility:"visible"}),V(this.elYGuideline).attr({x1:0,y1:j,x2:h.width,y2:j,visibility:"visible"});var k=g.scale.linear([this.canvas.x,this.canvas.x+this.canvas.width],[this.stats.minX,this.stats.maxX],i),l=g.scale.linear([this.canvas.y,this.canvas.y+this.canvas.height],[this.stats.minY,this.stats.maxY],j),m={x:k,y:this.stats.minY+this.stats.maxY-l},n={x:a,y:b},o=this.closestPoints(k);this.trigger("mouseover",m,n,o,c)}},closestPoints:function(a){var b=_.sortedIndex(this.stats.xValues,a),c=this.stats.xValues[b],d=this.stats.xValues[b-1],e=_.isUndefined(d)?c:Math.abs(a-c)<Math.abs(a-d)?c:d;return this.stats.xMap[e]},hideGuidelines:function(){V(this.elXGuideline).attr("visibility","hidden"),V(this.elYGuideline).attr("visibility","hidden")}}),joint.shapes.chart.Pie=joint.shapes.basic.Generic.extend({markup:['<g class="rotatable">','<g class="scalable"></g>','<g class="background"><rect/><text/></g>','<g class="data"></g>','<g class="foreground">','<rect/><text class="caption"/><text class="subcaption"/>','<g class="legend"><g class="legend-items"></g></g>',"</g>","</g>"].join(""),sliceMarkup:'<g class="slice"/>',sliceFillMarkup:'<path class="slice-fill"/>',sliceBorderMarkup:'<path class="slice-border"/>',sliceInnerLabelMarkup:'<text class="slice-inner-label"/>',legendSerieMarkup:'<g class="legend-serie"><text/></g>',legendSliceMarkup:'<g class="legend-slice"><circle/><text/></g>',defaults:joint.util.deepSupplement({type:"chart.Pie",size:{width:200,height:200},pieHole:0,serieDefaults:{startAngle:0,degree:360,label:null,showLegend:!0,labelLineHeight:6},sliceDefaults:{innerLabel:"{percentage:.0f}%",innerLabelMargin:6,legendLabel:"{label}: {value}",legendLabelLineHeight:6,legendLabelMargin:14,offset:0,onClickEffect:{type:"offset",offset:20},onHoverEffect:null},series:[],attrs:{".background > rect":{opacity:0},".background > text":{fill:"black",text:"No data available.",ref:".background > rect","ref-x":.5,"ref-y":.5,"text-anchor":"middle","y-alignment":"middle",display:"none"},".foreground > rect":{fill:"white",stroke:"#e5e5e5",opacity:0,"pointer-events":"none"},".foreground .caption":{fill:"black",text:"",ref:".foreground > rect","ref-x":2,"ref-y":6,"text-anchor":"start","y-alignment":"middle","font-size":14},".foreground .subcaption":{fill:"black",text:"",ref:".foreground > rect","ref-x":2,"ref-y":18,"text-anchor":"start","y-alignment":"middle","font-size":10},".data":{ref:".background","ref-x":.5,"ref-y":.5},".slice":{cursor:"pointer"},".slice > .slice-fill":{stroke:"#ffffff","stroke-width":1,"fill-opacity":1},".slice.hover > .slice-fill":{"fill-opacity":.8},".slice > .slice-border":{"stroke-width":6,"stroke-opacity":.4,"fill-opacity":1,fill:"none",display:"none"},".slice.hover > .slice-border":{display:"block"},".slice > .slice-inner-label":{"text-anchor":"middle","font-size":"12",stroke:"none","stroke-width":"0",fill:"#ffffff"},".slice > .slice-inner-label > tspan":{dy:"-.5em"},".legend":{ref:".background","ref-dx":20,"ref-y":5},".legend-serie text":{fill:"grey",transform:"translate(2, 0)","font-size":13},".legend-slice":{cursor:"pointer"},".legend-slice text":{"font-weight":"normal",fill:"black","font-size":11},".legend-slice.hover text":{"font-weight":"bold"},".legend-slice circle":{r:5,transform:"translate(5,5)"}}},joint.shapes.basic.Generic.prototype.defaults),addSlice:function(a,b,c){c=c||{},b=b||0;var d=this.get("series");_.isUndefined(d[b])&&(d[b]={data:[]});var e=_.cloneDeep(d[b]);e.data.push(a),d=d.slice(),d[b]=e,c=e.data.length>1?_.extend(c,{changedSerieIndex:b}):c,this.set("series",d,c)},editSlice:function(a,b,c,d){d=d||{},c=c||0;var e=this.get("series");if(_.isUndefined(e[c])||_.isUndefined(e[c].data[b]))throw new Error("Slice "+b+" on serie "+c+" was not found.");var f=_.cloneDeep(e[c]);f.data[b]=_.extend(f.data[b],a),e=e.slice(),e[c]=f,this.set("series",e,_.extend(d,{changedSerieIndex:c}))}}),joint.shapes.chart.PieView=joint.dia.ElementView.extend({events:{"mouseover .slice":"onMouseOverSlice","mouseout .slice":"onMouseOverSlice","mousemove .slice":"onMouseMoveSlice","mouseover .legend-slice":"onEventLegendItem","mouseout .legend-slice":"onEventLegendItem"},initialize:function(){joint.dia.ElementView.prototype.initialize.apply(this,arguments),this.listenTo(this.model,"change:series change:serieDefaults change:sliceDefaults change:pieHole",function(a,b,c){this.update(null,null,c.changedSerieIndex)}),this.on("cell:pointerclick",this.onClickSlice,this),this.on("cell:pointerclick",this.onEventLegendItem,this)},renderMarkup:function(){joint.dia.ElementView.prototype.renderMarkup.apply(this,arguments),this.elBackgroundRect=this.$(".background rect")[0],this.elBackgroundText=this.$(".background text")[0],this.elForegroundRect=this.$(".foreground rect")[0],this.elLegendItems=this.$(".legend-items")[0],this.elPie=this.$(".data")[0],this.elSlice=V(this.model.sliceMarkup),this.elSliceFill=V(this.model.sliceFillMarkup),this.elSliceBorder=V(this.model.sliceBorderMarkup),this.elSliceInnerLabel=V(this.model.sliceInnerLabelMarkup),this.elLegendSerie=V(this.model.legendSerieMarkup),this.elLegendSlice=V(this.model.legendSliceMarkup)},update:function(a,b,c){var d=this.calculateSeries(c);c in d?$(this.elPie).find(".serie-"+c).remove():$(this.elPie).empty();var e=this.model.get("size");V(this.elBackgroundRect).attr(e),V(this.elForegroundRect).attr(e),d.length?$(this.elBackgroundText).hide():$(this.elBackgroundText).show(),_.each(d,function(a,b){(_.isUndefined(c)||c===b)&&_.each(a.data,function(a){this.updateSlice(a)},this)},this),this.updateLegend(),joint.dia.ElementView.prototype.update.apply(this,arguments)},calculateSeries:function(a){var b=_.cloneDeep(this.model.get("series")),c=this.model.get("serieDefaults"),d=this.model.get("sliceDefaults"),e=this.model.get("size"),f=_.min([e.width,e.height])/2,h=this.model.get("pieHole");h=h>1?h:f*h;var i=f,j=(f-h)/b.length;return this._series=_.map(b,function(b,e){if(!_.isUndefined(a)&&a!==e)return b;b=_.defaults(b,c);var f=b.startAngle,h=_.reduce(b.data,function(a,b){return a+b.value},0),k=b.degree/h||0,l=100/h;return b.data=_.map(b.data,function(a,b){a=_.defaults(a,_.omit(d,"offset","onClickEffect","onHoverEffect")),a.outerRadius=i,a.innerRadius=i-j,e||(a=_.defaults(a,_.pick(d,"offset","onClickEffect","onHoverEffect")),a.outer=!0,a.offset=a.offset>1?a.offset:a.offset*a.outerRadius,a.onClickEffect.offset=a.onClickEffect.offset>1?a.onClickEffect.offset:a.onClickEffect.offset*a.outerRadius),a.serieIndex=e,a.sliceIndex=b,a.innerLabelMargin=a.innerLabelMargin<-1||a.innerLabelMargin>1?a.innerLabelMargin:a.innerLabelMargin*a.outerRadius,a.percentage=a.value*l;var c=a.value*k;return a.degree={angle:c,start:f,end:c+f},a.rad={angle:g.toRad(a.degree.angle,!0),start:g.toRad(a.degree.start,!0),end:g.toRad(a.degree.end,!0)},a.middleangle=(a.rad.start+a.rad.end)/2,f=a.degree.end,a}),i-=j,b}),this._series},updateLegend:function(){var a=this._series;this.elLegendItems.textContent="";var b=0,c=parseInt(this.model.attr(".legend-serie text/font-size"),10),d=parseInt(this.model.attr(".legend-slice text/font-size"),10);_.each(a,function(a,e){if(a.showLegend){if(a.label){var f=this.elLegendSerie.clone();a.name&&f.addClass(a.name),f.attr({"data-serie":e}),f.findOne("text").text(a.label),f.translate(0,b),V(this.elLegendItems).append(f),b+=c+a.labelLineHeight}_.each(a.data,function(a,c){var f=this.elLegendSlice.clone(),g=this.getSliceFillColor(c,e);a.name&&f.addClass(a.name),f.attr({"data-serie":e,"data-slice":c}),f.findOne("circle").attr({fill:g}),f.findOne("text").text(joint.util.format.string(a.legendLabel,a)),f.findOne("text").translate(a.legendLabelMargin),f.translate(0,b),b+=d+a.legendLabelLineHeight,V(this.elLegendItems).append(f),_.isObject(g)&&this.applyGradient("#"+f.findOne("circle").attr("id"),"fill",g)},this)}},this)},updateSlice:function(a){var b=this.elSlice.clone();V(this.elPie).append(b);var c=this.elSliceFill.clone(),d=this.getSliceFillColor(a.sliceIndex,a.serieIndex);c.attr({fill:d,d:V.createSlicePathData(a.innerRadius,a.outerRadius,a.rad.start,a.rad.end)}),b.append(c),_.isObject(d)&&this.applyGradient("#"+c.attr("id"),"fill",d);var e=this.elSliceBorder.clone(),f=parseInt(this.model.attr(".slice > .slice-border/stroke-width"),10),h=g.point.fromPolar(a.outerRadius+f/2,-a.rad.start,g.point(0,0)),i=g.point.fromPolar(a.outerRadius+f/2,-a.rad.end,g.point(0,0));e.attr({stroke:d,d:this.drawArc(h,i,a.outerRadius+f/2,a.rad.start,a.rad.end)}),b.append(e),_.isObject(d)&&this.applyGradient("#"+e.attr("id"),"stroke",d);var j=this.elSliceInnerLabel.clone();j.text(joint.util.format.string(a.innerLabel,a)),b.append(j);var k=j.bbox(),l=a.outerRadius-k.width/2-a.innerLabelMargin;j.translate(l*Math.cos(-a.middleangle),-l*Math.sin(-a.middleangle)),b.attr({"data-serie":a.serieIndex,"data-slice":a.sliceIndex,"data-value":a.value});var m=this._series[a.serieIndex].name;return m&&b.addClass(m),a.name&&b.addClass(a.name),b.addClass("serie-"+a.serieIndex+" slice-"+a.sliceIndex),a.outer&&(b.addClass("outer"),a.offset&&(b.addClass("clicked"),this.effectOnSlice(b,a,{type:"offset",offset:a.offset}))),b},getSliceFillColor:function(a,b){b=b||0;var c=this.model.get("attrs"),d=_.find(c,function(c,d){return d.indexOf(".serie-"+b+".slice-"+a+" > .slice-fill")>-1});return d?d.fill:this._series[b].data[a].fill},onMouseMoveSlice:function(a){var b=V(a.currentTarget),c=b.attr("data-serie"),d=b.attr("data-slice"),e=this._series[c].data[d];this.trigger(a.type,e,a)},mouseOverSlice:function(a,b){b=b||0;var c=V(this.$('.slice[data-serie="'+b+'"][data-slice="'+a+'"]')[0]),d=this._series[b].data[a];c.toggleClass("hover"),d.outer&&!_.isEmpty(d.onHoverEffect)&&this.effectOnSlice(c,d,d.onHoverEffect,!c.hasClass("hover"));var e=V(this.$('.legend-slice[data-serie="'+b+'"][data-slice="'+a+'"]')[0]);e&&e.toggleClass("hover");var f=_.filter(_.keys(this.model.get("attrs")),function(a){return a.indexOf(".slice")>-1||a.indexOf(".legend-slice")>-1});joint.dia.ElementView.prototype.update.call(this,this.model,_.pick(this.model.get("attrs"),f))},onMouseOverSlice:function(a){var b=V(a.currentTarget),c=b.attr("data-serie"),d=b.attr("data-slice");this.mouseOverSlice(d,c);var e=this._series[c].data[d];this.trigger(a.type,e,a)},clickSlice:function(a,b){b=b||0;var c=V(this.$('.slice[data-serie="'+b+'"][data-slice="'+a+'"]')[0]),d=this._series[b].data[a];d.outer&&(c.hasClass("clicked")?(c.removeClass("clicked"),this.model.get("series")[b].data[a].offset=0,this.effectOnSlice(c,d,d.onClickEffect,!0)):(c.addClass("clicked"),this.model.get("series")[b].data[a].offset=d.onClickEffect.offset,this.effectOnSlice(c,d,d.onClickEffect)))},onClickSlice:function(a){var b=V($(a.target).closest(".slice.outer")[0]);if(b){var c=b.attr("data-serie"),d=b.attr("data-slice");this.clickSlice(d,c);var e=this._series[c].data[d];this.trigger(a.type,e,a)}},onEventLegendItem:function(a){var b=V($(a.target).closest(".legend-slice")[0]);if(b){var c=b.attr("data-serie"),d=b.attr("data-slice");switch(a.type){case"click":this.clickSlice(d,c);break;case"mouseover":case"mouseout":this.mouseOverSlice(d,c)}}},effectOnSlice:function(a,b,c,d){switch(d=d||!1,c.type){case"enlarge":d?a.scale(1):a.scale(c.scale||1.05);break;case"offset":d?a.translate(0,0,{absolute:!0}):a.translate(c.offset*Math.cos(-b.middleangle),-c.offset*Math.sin(-b.middleangle))}},svgArcMax:2*Math.PI-1e-6,drawArc:function(a,b,c,d,e){var f=0,g=1,h=e-d;return h>Math.PI&&(f=1,h>=this.svgArcMax&&(f=0,g=0)),"M"+a.x+","+a.y+" A"+c+","+c+" 0 "+f+","+g+" "+b.x+","+b.y}}),joint.shapes.chart.Knob=joint.shapes.chart.Pie.extend({defaults:joint.util.deepSupplement({type:"chart.Knob",sliceDefaults:{legendLabel:"{value:.0f}",outer:{offsetOnClick:0}},pieHole:.7,value:0,attrs:{".legend":{"ref-x":.5,"ref-y":.5,"x-alignment":-.9,"y-alignment":-.4},".legend-slice text":{"font-size":30},".legend-slice circle":{display:"none"},".slice-inner-label":{display:"none"},".slice-fill":{stroke:"none"}}},joint.shapes.chart.Pie.prototype.defaults),initialize:function(){this.set("series",this.getKnobSeries(),{silent:!0}),joint.shapes.chart.Pie.prototype.initialize.apply(this,arguments),this.on("change:value change:min change:max change:fill",this.updateKnob,this)},getKnobSeries:function(){var a=_.isArray(this.get("value"))?this.get("value"):[this.get("value")],b=_.isArray(this.get("fill"))?this.get("fill"):[this.get("fill")],c=_.isArray(this.get("min"))?this.get("min"):[this.get("min")],d=_.isArray(this.get("max"))?this.get("max"):[this.get("max")],e=_.map(a,function(a,e){var f=_.isUndefined(c[e])?c[0]:c[e],h=_.isUndefined(d[e])?d[0]:d[e],i=_.isUndefined(b[e])?b[0]:b[e];return{degree:g.scale.linear([f,h],[0,360],a),data:[{value:a,fill:i}],showLegend:!(e>0)}});return e},updateKnob:function(){this.set("series",this.getKnobSeries())}}),joint.shapes.chart.KnobView=joint.shapes.chart.PieView,joint.shapes.chart.Matrix=joint.shapes.basic.Generic.extend({markup:['<g class="rotatable">','<g class="scalable">','<g class="background"><rect/></g>','<g class="cells"/>','<g class="foreground"/>',"</g>",'<g class="labels">','<g class="rows"/>','<g class="columns"/>',"</g>","</g>"].join(""),cellMarkup:'<rect class="cell"/>',labelMarkup:'<text class="label"/>',gridLineMarkup:'<path class="grid-line"/>',defaults:joint.util.deepSupplement({type:"chart.Matrix",attrs:{".background rect":{fill:"#eeeeee"},".grid-line":{stroke:"white","stroke-width":2},".label":{fill:"black","alignment-baseline":"middle"},".labels .rows .label":{"text-anchor":"end"},".labels .columns .label":{"text-anchor":"start"}}},joint.shapes.basic.Generic.prototype.defaults)}),joint.shapes.chart.MatrixView=joint.dia.ElementView.extend({initialize:function(){joint.dia.ElementView.prototype.initialize.apply(this,arguments),this.listenTo(this.model,"change:size",function(){this.renderLabels(),this.update()}),this.listenTo(this.model,"change:cells",function(){this.renderMarkup(),this.update()})},renderMarkup:function(){joint.dia.ElementView.prototype.renderMarkup.apply(this,arguments),this.elCells=this.$(".cells")[0],this.elRowLabels=this.$(".labels .rows")[0],this.elColumnLabels=this.$(".labels .columns")[0],this.elForeground=this.$(".foreground")[0],this.elCell=V(this.model.cellMarkup),this.elGridLine=V(this.model.gridLineMarkup);var a=this.model.get("cells")||[],b=this.model.get("size");this.elBackgroundRect=this.$(".background rect")[0],V(this.elBackgroundRect).attr(b);var c=b.height/a.length,d=b.width/a.length,e=document.createDocumentFragment();this.elCells.textContent="",this.elForeground.textContent="";for(var f=document.createDocumentFragment(),g=0;g<a.length;g++){var h=this.elGridLine.clone();h.addClass("horizontal"),h.attr("d","M 0 "+g*c+" "+b.width+" "+g*c),f.appendChild(h.node);for(var i=a[g],j=0;j<i.length;j++){if(0===g){var h=this.elGridLine.clone();h.addClass("vertical"),h.attr("d","M "+j*d+" 0 "+j*d+" "+b.height),f.appendChild(h.node)}var k=i[j];if(k){var l=this.elCell.clone();l.attr(_.extend({x:j*d,y:g*c,width:d,height:c},k)),e.appendChild(l.node)}}}this.elForeground.appendChild(f),this.elCells.appendChild(e),this.renderLabels()},renderLabels:function(){this.elLabel=V(this.model.labelMarkup);var a=this.model.get("cells")||[],b=this.model.get("labels")||{},c=b.rows||[],d=b.columns||[],e=this.model.get("size"),f=e.height/a.length,g=e.width/a.length;this.elRowLabels.textContent="",
this.elColumnLabels.textContent="";for(var h=document.createDocumentFragment(),i=0;i<c.length;i++){var j=b.rows[i],k=this.elLabel.clone();k.text(j.text),k.attr(_.extend({x:-(b.padding||5),y:i*f+f/2,"text-anchor":"end","alignment-baseline":"middle","font-size":f,"data-row":i},_.omit(j,"text"))),h.appendChild(k.node)}this.elRowLabels.appendChild(h);for(var l=document.createDocumentFragment(),m=0;m<d.length;m++){var j=b.columns[m],k=this.elLabel.clone();k.text(j.text);var n=m*g+g/2,o=-(b.padding||5);k.attr(_.extend({x:n,y:o,"text-anchor":"start","alignment-baseline":"middle","font-size":g,"data-column":m},_.omit(j,"text"))),k.rotate(-90,n,o),l.appendChild(k.node)}this.elColumnLabels.appendChild(l)}});