funnel-chart-js
Version:
The funnel plugin for Chart.js
11 lines • 6.55 kB
JavaScript
/*!
* Chart.Funnel.js
* A funnel plugin for Chart.js(http://chartjs.org/)
* Version: 1.1.2
*
* Copyright 2016 Jone Casaper
* Copyright 2019 Steve Yardumian
* Released under the MIT license
* https://github.com/CopperHill-Consulting/Chart.Funnel.js/blob/master/LICENSE.md
*/
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,(t.Chart||(t.Chart={})).Funnel=e()}}(function(){return function(){function e(t,r,o){function n(i,d){if(!r[i]){if(!t[i]){var l="function"==typeof require&&require;if(!d&&l)return l(i,!0);if(a)return a(i,!0);var s=new Error("Cannot find module '"+i+"'");throw s.code="MODULE_NOT_FOUND",s}var u=r[i]={exports:{}};t[i][0].call(u.exports,function(e){var r=t[i][1][e];return n(r||e)},u,u.exports,e,t,r,o)}return r[i].exports}for(var a="function"==typeof require&&require,i=0;i<o.length;i++)n(o[i]);return n}return e}()({1:[function(e,t,r){},{}],2:[function(e,t,r){"use strict";var o=e(1);o="function"==typeof o?o:window.Chart,e(4)(o),e(3)(o),t.exports=o},{1:1,3:3,4:4}],3:[function(e,t,r){"use strict";t.exports=function(e){var t=e.helpers;e.defaults.funnel={hover:{mode:"index"},sort:"asc",gap:2,bottomWidth:null,topWidth:0,keep:"auto",elements:{borderWidth:0},tooltips:{callbacks:{title:function(e,t){return""},label:function(e,t){return t.labels[e.index]+": "+t.datasets[e.datasetIndex].data[e.index]}}},legendCallback:function(e){var t=[];t.push('<ul class="'+e.id+'-legend">');var r=e.data,o=r.datasets,n=r.labels;if(o.length)for(var a=0;a<o[0].data.length;++a)t.push('<li><span style="background-color:'+o[0].backgroundColor[a]+'"></span>'),n[a]&&t.push(n[a]),t.push("</li>");return t.push("</ul>"),t.join("")},legend:{labels:{generateLabels:function(e){var r=e.data;return r.labels.length&&r.datasets.length?r.labels.map(function(o,n){var a=e.getDatasetMeta(0),i=r.datasets[0],d=a.data[n],l=d.custom||{},s=t.getValueAtIndexOrDefault,u=e.options.elements.trapezium,h=l.backgroundColor?l.backgroundColor:s(i.backgroundColor,n,u.backgroundColor),f=l.borderColor?l.borderColor:s(i.borderColor,n,u.borderColor),c=l.borderWidth?l.borderWidth:s(i.borderWidth,n,u.borderWidth);return{text:o,fillStyle:h,strokeStyle:f,lineWidth:c,hidden:isNaN(i.data[n])||a.data[n].hidden,index:n,_index:d._index}}):[]}},onClick:function(e,t){var r,o,n,a=t.index,i=this.chart;for(r=0,o=(i.data.datasets||[]).length;r<o;++r)n=i.getDatasetMeta(r),n.data[a].hidden=!n.data[a].hidden;i.update()}}},e.controllers.funnel=e.DatasetController.extend({dataElementType:e.elements.Trapezium,linkScales:t.noop,update:function(e){var r=this,o=r.chart,n=o.chartArea,a=o.options,i=r.getMeta(),d=i.data,l=a.elements.borderWidth||0,s=n.right-n.left-2*l,u=n.bottom-n.top-2*l,h=s,f=(a.topWidth<s?a.topWidth:s)||0;a.bottomWidth&&(h=a.bottomWidth<s?a.bottomWidth:s);var c=a.sort,p=r.getDataset(),b=[],v=0,g=0;t.each(p.data,function(e,r){var n=t.getValueAtIndexOrDefault(p.backgroundColor,r),a=d[r].hidden;b.push({hidden:a,orgIndex:r,val:e,backgroundColor:n,borderColor:t.getValueAtIndexOrDefault(p.borderColor,r,n),label:t.getValueAtIndexOrDefault(p.label,r,o.data.labels[r])}),d[r].hidden||(v++,g=e>g?e:g)});var x=h/g,m=b.sort("asc"===c?function(e,t){return e.val-t.val}:function(e,t){return t.val-e.val}),C=0;t.each(m,function(e,t){e._viewIndex=e.hidden?-1:C++});var W=a.gap||0,y=(u-(v-1)*W)/v;r.topWidth=f,r.dwRatio=x,r.elHeight=y,r.sortedDataAndLabels=m,t.each(d,function(t,o){r.updateElement(t,o,e)},r)},updateElement:function(e,r,o){var n,a,i,d,l,s,u=this,h=u.chart,f=h.chartArea,c=h.options,p=c.sort,b=u.dwRatio,v=u.elHeight,g=c.gap||0,x=c.elements.borderWidth||0,m="isosceles",C=u.sortedDataAndLabels[r],W=C._viewIndex<0?r:C._viewIndex,y=f.top+(W+1)*(v+g)-g;if("asc"===p){var k=t.findPreviousWhere(u.sortedDataAndLabels,function(e){return!e.hidden},r);l=k?k.val*b:u.topWidth,s=C.val*b}else{var w=t.findNextWhere(u.sortedDataAndLabels,function(e){return!e.hidden},r);l=C.val*b,s=w?w.val*b:u.topWidth}a=f.top+W*(v+g),"left"===c.keep?(m="scalene",i=f.left+l/2,d=f.left+s/2):"right"===c.keep?(m="scalene",i=f.right-l/2,d=f.right-s/2):n=(f.left+f.right)/2,t.extend(e,{_datasetIndex:u.index,_index:C.orgIndex,_model:{type:m,y:a,base:y>f.bottom?f.bottom:y,x:n,x1:i,x2:d,upperWidth:o||C.hidden?0:l,bottomWidth:o||C.hidden?0:s,borderWidth:x,backgroundColor:C&&C.backgroundColor,borderColor:C&&C.borderColor,label:C&&C.label}}),e.pivot()},removeHoverStyle:function(t){e.DatasetController.prototype.removeHoverStyle.call(this,t,this.chart.options.elements.trapezium)}})}},{}],4:[function(e,t,r){"use strict";t.exports=function(e){var t=(e.helpers,e.defaults.global);t.elements.trapezium={backgroundColor:t.defaultColor,borderWidth:0,borderColor:t.defaultColor,borderSkipped:"bottom",type:"isosceles"};var r=function(e,t){for(var r=e[0],o=e[1],n=!1,a=0,i=t.length-1;a<t.length;i=a++){var d=t[a][0],l=t[a][1],s=t[i][0],u=t[i][1],h=l>o!=u>o&&r<(s-d)*(o-l)/(u-l)+d;h&&(n=!n)}return n};e.elements.Trapezium=e.Element.extend({getCorners:function(){var e=this._view,r=t.elements.trapezium,o=[],n=e.type||r.type,a=e.y,i=e.borderWidth||r.borderWidth,d=e.upperWidth/2,l=e.bottomWidth/2,s=i/2;if(s=s<0?0:s,"isosceles"==n){var u=e.x;o=[[u-l+s,e.base],[u-d+s,a+s],[u+d-s,a+s],[u+l-s,e.base]]}else if("scalene"==n){var h=e.x1,f=e.x2;o=[[f-l+s,e.base],[h-d+s,a+s],[h+d-s,a+s],[f+l-s,e.base]]}return o},draw:function(){function e(e){return a[(d+e)%4]}var r=this._chart.ctx,o=this._view,n=t.elements.trapezium,a=this.getCorners();this._cornersCache=a,r.beginPath(),r.fillStyle=o.backgroundColor||n.backgroundColor,r.strokeStyle=o.borderColor||n.borderColor,r.lineWidth=o.borderWidth||n.borderWidth;var i=["bottom","left","top","right"],d=i.indexOf(o.borderSkipped||n.borderSkipped,0);d===-1&&(d=0),r.moveTo.apply(r,e(0));for(var l=1;l<4;l++)r.lineTo.apply(r,e(l));r.fill(),o.borderWidth&&r.stroke()},height:function(){var e=this._view;return e?e.base-e.y:0},inRange:function(e,t){var o=this._view;if(!o)return!1;var n=this._cornersCache?this._cornersCache:this.getCorners();return r([e,t],n)},inLabelRange:function(e){var t=this._view;if(!t)return!1;if("scalene"==t.type)return t.x1>t.x2?e>=t.x2-t.bottomWidth/2&&e<=t.x1+t.upperWidth/2:e<=t.x2+t.bottomWidth/2&&e>=t.x1-t.upperWidth/2;var r=Math.max(t.upperWidth,t.bottomWidth);return e>=t.x-r/2&&e<=t.x+r/2},tooltipPosition:function(){var e=this._view;return{x:e.x||e.x2,y:e.base-(e.base-e.y)/2}}})}},{}]},{},[2])(2)});