d3-parliament-chart
Version:
parliament / congress / legislature charts simplified
1 lines • 3.27 kB
JavaScript
!function(t,a){"object"==typeof exports&&"undefined"!=typeof module?a(exports):"function"==typeof define&&define.amd?define(["exports"],a):a((t="undefined"!=typeof globalThis?globalThis:t||self).d3=t.d3||{})}(this,function(t){"use strict";const p=({seats:t,startRad:a,endRad:e,seatRadius:r,rowHeight:s,graphicHeight:n,sectionGap:o})=>{var i=n-r;let l=[],c=0;for(;l.length<t;){var h=i-s*c,d=Math.atan((r+o/2)/h),p=a+d,f=e-d;if(f<=p||h<=0)break;var d=Math.atan(2.5*r/h),g=Math.min(Math.floor((f-p)/d),t-l.length-1),u=g?(f-p)/g:0;for(let t=0;t<=g;t+=1){var y=g?t*u+p:(p+f)/2;l=l.concat([{x:Math.cos(y)*(i-s*c)+n,y:n-(Math.sin(y)*(i-s*c)+r)+r+o/4,angle:y}])}c+=1}return l};const M="#1abc9c";t.parliamentChart=(t=[],a=0)=>{let f=parseFloat(a),e=t.map(({x:t,y:a,...e})=>e);const g={sections:4,sectionGap:60,seatRadius:12,rowHeight:42};let u=!1;const y=t=>{0===f&&(f=t.node().getBoundingClientRect().width);var a=y.data().filter(t=>t.x&&t.y);t.select("g.parliament-chart").remove();const e=t.append("g").attr("class","parliament-chart");if(e.select("g.debug").remove(),u){var t=e,r=f,s=g,n=a.length,o=Math.min(n,s.sections);const p=t.append("g").attr("class","debug").attr("transform",`translate(0, ${s.sectionGap/4})`);var i=r/2,l=(p.append("path").attr("d",`M${r},${i} a1,1 0 0,0 -${r},0 m 0 -${s.sectionGap/2} l ${r} 0`).attr("stroke",M).attr("stroke-width",2).attr("stroke-dasharray","5 5").attr("fill","none"),Math.PI/o);for(let t=1;t<o;t+=1){var c,h,d=l*t;s.sectionGap<=0?p.append("line").attr("x1",i).attr("y1",i).attr("x2",Math.cos(d)*i+i).attr("y2",i-Math.sin(d)*i).attr("stroke",M).attr("stroke-width",2).attr("stroke-dasharray","5 5"):(c=Math.sin(d)*(s.sectionGap/2),h=Math.cos(d)*(s.sectionGap/2),p.append("line").attr("x1",i-c).attr("y1",i-h).attr("x2",Math.cos(d)*i+i-c).attr("y2",i-Math.sin(d)*i-h).attr("stroke",M).attr("stroke-width",2).attr("stroke-dasharray","5 5"),p.append("line").attr("x1",i+c).attr("y1",i+h).attr("x2",Math.cos(d)*i+i+c).attr("y2",i-Math.sin(d)*i+h).attr("stroke",M).attr("stroke-width",2).attr("stroke-dasharray","5 5"))}}return e.selectAll("circle").data(a).enter().insert("circle").attr("cx",t=>t.x).attr("cy",t=>t.y).attr("r",g.seatRadius).attr("fill",t=>t.color||"#AAA")};return y.width=t=>(isNaN(t)||(f=parseFloat(t)),y),Object.keys(g).forEach(a=>{y[a]=t=>isNaN(t)?g[a]:(g[a]=parseInt(t,10),y)}),y.debug=t=>(u=!!t,y),y.data=t=>{if(t)return e=t.map(({x:t,y:a,...e})=>e),y;if(f<=0||e.length<=0)return e;if(e.every(t=>t.x&&t.y))return e;const a=((t,{sections:a,sectionGap:e,seatRadius:r,rowHeight:s},n)=>{const o=n/2;n=Math.min(t,a);const i=Math.PI/n,l=Array(n).fill({seats:Math.floor(t/n)}).map((t,a)=>({...t,startRad:a*i,endRad:(a+1)*i}));let c=t%n;if(0!==c){const h=Array(n).fill(null).map((t,a)=>a),d=h.splice(0,Math.floor(n/2)).reverse();for(;0<c;)d.length>=h.length?l[d.shift()].seats+=1:l[h.shift()].seats+=1,--c}return l.map(t=>p({...t,seatRadius:r,rowHeight:s,graphicHeight:o,sectionGap:e})).reduce((t,a)=>[...t,...a],[]).sort((t,a)=>a.angle-t.angle).map(t=>{const{angle:a,...e}=t;return e})})(e.length,g,f);return a.forEach((t,a)=>e[a]={...e[a],...t}),e},y.aggregatedData=t=>(e=t.reduce((t,a)=>{const{seats:e=0,x:r,y:s,...n}=a;return[...t,...Array(e).fill(n)]},[]),y),y},Object.defineProperty(t,"__esModule",{value:!0})});