123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585 |
- /* ------------------------------------------------------------------------------
- *
- * # Statistics widgets
- *
- * Demo JS code for widgets_stats.html page
- *
- * ---------------------------------------------------------------------------- */
- // Setup module
- // ------------------------------
- var StatisticWidgets = function() {
- //
- // Setup module components
- //
- // Messages area chart
- var _areaChartWidget = function(element, chartHeight, color) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Basic setup
- // ------------------------------
- // Define main variables
- var d3Container = d3.select(element),
- margin = {top: 0, right: 0, bottom: 0, left: 0},
- width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
- height = chartHeight - margin.top - margin.bottom;
- // Date and time format
- var parseDate = d3.time.format('%Y-%m-%d').parse;
- // Create SVG
- // ------------------------------
- // Container
- var container = d3Container.append('svg');
- // SVG element
- var svg = container
- .attr('width', width + margin.left + margin.right)
- .attr('height', height + margin.top + margin.bottom)
- .append("g")
- .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
- // Construct chart layout
- // ------------------------------
- // Area
- var area = d3.svg.area()
- .x(function(d) { return x(d.date); })
- .y0(height)
- .y1(function(d) { return y(d.value); })
- .interpolate('monotone');
- // Construct scales
- // ------------------------------
- // Horizontal
- var x = d3.time.scale().range([0, width ]);
- // Vertical
- var y = d3.scale.linear().range([height, 0]);
- // Load data
- // ------------------------------
- d3.json("../../../../global_assets/demo_data/dashboard/monthly_sales.json", function (error, data) {
- // Show what's wrong if error
- if (error) return console.error(error);
- // Pull out values
- data.forEach(function (d) {
- d.date = parseDate(d.date);
- d.value = +d.value;
- });
- // Get the maximum value in the given array
- var maxY = d3.max(data, function(d) { return d.value; });
- // Reset start data for animation
- var startData = data.map(function(datum) {
- return {
- date: datum.date,
- value: 0
- };
- });
- // Set input domains
- // ------------------------------
- // Horizontal
- x.domain(d3.extent(data, function(d, i) { return d.date; }));
- // Vertical
- y.domain([0, d3.max( data, function(d) { return d.value; })]);
- //
- // Append chart elements
- //
- // Add area path
- svg.append("path")
- .datum(data)
- .attr("class", "d3-area")
- .style('fill', color)
- .attr("d", area)
- .transition() // begin animation
- .duration(1000)
- .attrTween('d', function() {
- var interpolator = d3.interpolateArray(startData, data);
- return function (t) {
- return area(interpolator (t));
- };
- });
- // Resize chart
- // ------------------------------
- // Call function on window resize
- $(window).on('resize', messagesAreaResize);
- // Call function on sidebar width change
- $(document).on('click', '.sidebar-control', messagesAreaResize);
- // Resize function
- //
- // Since D3 doesn't support SVG resize by default,
- // we need to manually specify parts of the graph that need to
- // be updated on window resize
- function messagesAreaResize() {
- // Layout variables
- width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
- // Layout
- // -------------------------
- // Main svg width
- container.attr("width", width + margin.left + margin.right);
- // Width of appended group
- svg.attr("width", width + margin.left + margin.right);
- // Horizontal range
- x.range([0, width]);
- // Chart elements
- // -------------------------
- // Area path
- svg.selectAll('.d3-area').datum( data ).attr("d", area);
- }
- });
- }
- };
- // Simple bar charts
- var _barChartWidget = function(element, barQty, height, animate, easing, duration, delay, color, tooltip) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Basic setup
- // ------------------------------
- // Add data set
- var bardata = [];
- for (var i=0; i < barQty; i++) {
- bardata.push(Math.round(Math.random() * 10) + 10);
- }
- // Main variables
- var d3Container = d3.select(element),
- width = d3Container.node().getBoundingClientRect().width;
-
- // Construct scales
- // ------------------------------
- // Horizontal
- var x = d3.scale.ordinal()
- .rangeBands([0, width], 0.3);
- // Vertical
- var y = d3.scale.linear()
- .range([0, height]);
- // Set input domains
- // ------------------------------
- // Horizontal
- x.domain(d3.range(0, bardata.length));
- // Vertical
- y.domain([0, d3.max(bardata)]);
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append('svg');
- // Add SVG group
- var svg = container
- .attr('width', width)
- .attr('height', height)
- .append('g');
- //
- // Append chart elements
- //
- // Bars
- var bars = svg.selectAll('rect')
- .data(bardata)
- .enter()
- .append('rect')
- .attr('class', 'd3-random-bars')
- .attr('width', x.rangeBand())
- .attr('x', function(d,i) {
- return x(i);
- })
- .style('fill', color);
- // Tooltip
- // ------------------------------
- // Initiate
- var tip = d3.tip()
- .attr('class', 'd3-tip')
- .offset([-10, 0]);
- // Show and hide
- if(tooltip == "hours" || tooltip == "goal" || tooltip == "members") {
- bars.call(tip)
- .on('mouseover', tip.show)
- .on('mouseout', tip.hide);
- }
- // Daily meetings tooltip content
- if(tooltip == "hours") {
- tip.html(function (d, i) {
- return "<div class='text-center'>" +
- "<h6 class='mb-0'>" + d + "</h6>" +
- "<span class='font-size-sm'>meetings</span>" +
- "<div class='font-size-sm'>" + i + ":00" + "</div>" +
- "</div>";
- });
- }
- // Statements tooltip content
- if(tooltip == "goal") {
- tip.html(function (d, i) {
- return "<div class='text-center'>" +
- "<h6 class='mb-0'>" + d + "</h6>" +
- "<span class='font-size-sm'>statements</span>" +
- "<div class='font-size-sm'>" + i + ":00" + "</div>" +
- "</div>";
- });
- }
- // Online members tooltip content
- if(tooltip == "members") {
- tip.html(function (d, i) {
- return "<div class='text-center'>" +
- "<h6 class='mb-0'>" + d + "0" + "</h6>" +
- "<span class='font-size-sm'>members</span>" +
- "<div class='font-size-sm'>" + i + ":00" + "</div>" +
- "</div>";
- });
- }
- // Bar loading animation
- // ------------------------------
- // Choose between animated or static
- if(animate) {
- withAnimation();
- } else {
- withoutAnimation();
- }
- // Animate on load
- function withAnimation() {
- bars
- .attr('height', 0)
- .attr('y', height)
- .transition()
- .attr('height', function(d) {
- return y(d);
- })
- .attr('y', function(d) {
- return height - y(d);
- })
- .delay(function(d, i) {
- return i * delay;
- })
- .duration(duration)
- .ease(easing);
- }
- // Load without animateion
- function withoutAnimation() {
- bars
- .attr('height', function(d) {
- return y(d);
- })
- .attr('y', function(d) {
- return height - y(d);
- });
- }
- // Resize chart
- // ------------------------------
- // Call function on window resize
- $(window).on('resize', barsResize);
- // Call function on sidebar width change
- $(document).on('click', '.sidebar-control', barsResize);
- // Resize function
- //
- // Since D3 doesn't support SVG resize by default,
- // we need to manually specify parts of the graph that need to
- // be updated on window resize
- function barsResize() {
- // Layout variables
- width = d3Container.node().getBoundingClientRect().width;
- // Layout
- // -------------------------
- // Main svg width
- container.attr("width", width);
- // Width of appended group
- svg.attr("width", width);
- // Horizontal range
- x.rangeBands([0, width], 0.3);
- // Chart elements
- // -------------------------
- // Bars
- svg.selectAll('.d3-random-bars')
- .attr('width', x.rangeBand())
- .attr('x', function(d,i) {
- return x(i);
- });
- }
- }
- };
- // Simple line chart
- var _lineChartWidget = function(element, chartHeight, lineColor, pathColor, pointerLineColor, pointerBgColor) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Basic setup
- // ------------------------------
- // Add data set
- var dataset = [
- {
- "date": "04/13/14",
- "alpha": "60"
- }, {
- "date": "04/14/14",
- "alpha": "35"
- }, {
- "date": "04/15/14",
- "alpha": "65"
- }, {
- "date": "04/16/14",
- "alpha": "50"
- }, {
- "date": "04/17/14",
- "alpha": "65"
- }, {
- "date": "04/18/14",
- "alpha": "20"
- }, {
- "date": "04/19/14",
- "alpha": "60"
- }
- ];
- // Main variables
- var d3Container = d3.select(element),
- margin = {top: 0, right: 0, bottom: 0, left: 0},
- width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
- height = chartHeight - margin.top - margin.bottom,
- padding = 20;
- // Format date
- var parseDate = d3.time.format("%m/%d/%y").parse,
- formatDate = d3.time.format("%a, %B %e");
- // Add tooltip
- // ------------------------------
- var tooltip = d3.tip()
- .attr('class', 'd3-tip')
- .html(function (d) {
- return "<ul class='list-unstyled mb-1'>" +
- "<li>" + "<div class='font-size-base my-1'><i class='icon-check2 mr-2'></i>" + formatDate(d.date) + "</div>" + "</li>" +
- "<li>" + "Sales: " + "<span class='font-weight-semibold float-right'>" + d.alpha + "</span>" + "</li>" +
- "<li>" + "Revenue: " + "<span class='font-weight-semibold float-right'>" + "$" + (d.alpha * 25).toFixed(2) + "</span>" + "</li>" +
- "</ul>";
- });
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append('svg');
- // Add SVG group
- var svg = container
- .attr('width', width + margin.left + margin.right)
- .attr('height', height + margin.top + margin.bottom)
- .append("g")
- .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
- .call(tooltip);
- // Load data
- // ------------------------------
- dataset.forEach(function (d) {
- d.date = parseDate(d.date);
- d.alpha = +d.alpha;
- });
- // Construct scales
- // ------------------------------
- // Horizontal
- var x = d3.time.scale()
- .range([padding, width - padding]);
- // Vertical
- var y = d3.scale.linear()
- .range([height, 5]);
- // Set input domains
- // ------------------------------
- // Horizontal
- x.domain(d3.extent(dataset, function (d) {
- return d.date;
- }));
- // Vertical
- y.domain([0, d3.max(dataset, function (d) {
- return Math.max(d.alpha);
- })]);
- // Construct chart layout
- // ------------------------------
- // Line
- var line = d3.svg.line()
- .x(function(d) {
- return x(d.date);
- })
- .y(function(d) {
- return y(d.alpha);
- });
- //
- // Append chart elements
- //
- // Add mask for animation
- // ------------------------------
- // Add clip path
- var clip = svg.append("defs")
- .append("clipPath")
- .attr("id", "clip-line-small");
- // Add clip shape
- var clipRect = clip.append("rect")
- .attr('class', 'clip')
- .attr("width", 0)
- .attr("height", height);
- // Animate mask
- clipRect
- .transition()
- .duration(1000)
- .ease('linear')
- .attr("width", width);
- // Line
- // ------------------------------
- // Path
- var path = svg.append('path')
- .attr({
- 'd': line(dataset),
- "clip-path": "url(#clip-line-small)",
- 'class': 'd3-line d3-line-medium'
- })
- .style('stroke', lineColor);
- // Animate path
- svg.select('.line-tickets')
- .transition()
- .duration(1000)
- .ease('linear');
- // Add vertical guide lines
- // ------------------------------
- // Bind data
- var guide = svg.append('g')
- .selectAll('.d3-line-guides-group')
- .data(dataset);
- // Append lines
- guide
- .enter()
- .append('line')
- .attr('class', 'd3-line-guides')
- .attr('x1', function (d, i) {
- return x(d.date);
- })
- .attr('y1', function (d, i) {
- return height;
- })
- .attr('x2', function (d, i) {
- return x(d.date);
- })
- .attr('y2', function (d, i) {
- return height;
- })
- .style('stroke', pathColor)
- .style('stroke-dasharray', '4,2')
- .style('shape-rendering', 'crispEdges');
- // Animate guide lines
- guide
- .transition()
- .duration(1000)
- .delay(function(d, i) { return i * 150; })
- .attr('y2', function (d, i) {
- return y(d.alpha);
- });
- // Alpha app points
- // ------------------------------
- // Add points
- var points = svg.insert('g')
- .selectAll('.d3-line-circle')
- .data(dataset)
- .enter()
- .append('circle')
- .attr('class', 'd3-line-circle d3-line-circle-medium')
- .attr("cx", line.x())
- .attr("cy", line.y())
- .attr("r", 3)
- .style({
- 'stroke': pointerLineColor,
- 'fill': pointerBgColor
- });
- // Animate points on page load
- points
- .style('opacity', 0)
- .transition()
- .duration(250)
- .ease('linear')
- .delay(1000)
- .style('opacity', 1);
- // Add user interaction
- points
- .on("mouseover", function (d) {
- tooltip.offset([-10, 0]).show(d);
- // Animate circle radius
- d3.select(this).transition().duration(250).attr('r', 4);
- })
- // Hide tooltip
- .on("mouseout", function (d) {
- tooltip.hide(d);
- // Animate circle radius
- d3.select(this).transition().duration(250).attr('r', 3);
- });
- // Change tooltip direction of first point
- d3.select(points[0][0])
- .on("mouseover", function (d) {
- tooltip.offset([0, 10]).direction('e').show(d);
- // Animate circle radius
- d3.select(this).transition().duration(250).attr('r', 4);
- })
- .on("mouseout", function (d) {
- tooltip.direction('n').hide(d);
- // Animate circle radius
- d3.select(this).transition().duration(250).attr('r', 3);
- });
- // Change tooltip direction of last point
- d3.select(points[0][points.size() - 1])
- .on("mouseover", function (d) {
- tooltip.offset([0, -10]).direction('w').show(d);
- // Animate circle radius
- d3.select(this).transition().duration(250).attr('r', 4);
- })
- .on("mouseout", function (d) {
- tooltip.direction('n').hide(d);
- // Animate circle radius
- d3.select(this).transition().duration(250).attr('r', 3);
- });
- // Resize chart
- // ------------------------------
- // Call function on window resize
- $(window).on('resize', lineChartResize);
- // Call function on sidebar width change
- $(document).on('click', '.sidebar-control', lineChartResize);
- // Resize function
- //
- // Since D3 doesn't support SVG resize by default,
- // we need to manually specify parts of the graph that need to
- // be updated on window resize
- function lineChartResize() {
- // Layout variables
- width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
- // Layout
- // -------------------------
- // Main svg width
- container.attr("width", width + margin.left + margin.right);
- // Width of appended group
- svg.attr("width", width + margin.left + margin.right);
- // Horizontal range
- x.range([padding, width - padding]);
- // Chart elements
- // -------------------------
- // Mask
- clipRect.attr("width", width);
- // Line path
- svg.selectAll('.d3-line').attr("d", line(dataset));
- // Circles
- svg.selectAll('.d3-line-circle').attr("cx", line.x());
- // Guide lines
- svg.selectAll('.d3-line-guides')
- .attr('x1', function (d, i) {
- return x(d.date);
- })
- .attr('x2', function (d, i) {
- return x(d.date);
- });
- }
- }
- };
- // Simple sparklines
- var _sparklinesWidget = function(element, chartType, qty, chartHeight, interpolation, duration, interval, color) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Basic setup
- // ------------------------------
- // Define main variables
- var d3Container = d3.select(element),
- margin = {top: 0, right: 0, bottom: 0, left: 0},
- width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
- height = chartHeight - margin.top - margin.bottom;
- // Generate random data (for demo only)
- var data = [];
- for (var i=0; i < qty; i++) {
- data.push(Math.floor(Math.random() * qty) + 5);
- }
- // Construct scales
- // ------------------------------
- // Horizontal
- var x = d3.scale.linear().range([0, width]);
- // Vertical
- var y = d3.scale.linear().range([height - 5, 5]);
- // Set input domains
- // ------------------------------
- // Horizontal
- x.domain([1, qty - 3]);
- // Vertical
- y.domain([0, qty]);
-
- // Construct chart layout
- // ------------------------------
- // Line
- var line = d3.svg.line()
- .interpolate(interpolation)
- .x(function(d, i) { return x(i); })
- .y(function(d, i) { return y(d); });
- // Area
- var area = d3.svg.area()
- .interpolate(interpolation)
- .x(function(d,i) {
- return x(i);
- })
- .y0(height)
- .y1(function(d) {
- return y(d);
- });
- // Create SVG
- // ------------------------------
- // Container
- var container = d3Container.append('svg');
- // SVG element
- var svg = container
- .attr('width', width + margin.left + margin.right)
- .attr('height', height + margin.top + margin.bottom)
- .append("g")
- .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
- // Add mask for animation
- // ------------------------------
- // Add clip path
- var clip = svg.append("defs")
- .append("clipPath")
- .attr('id', function(d, i) { return "load-clip-" + element.substring(1); });
- // Add clip shape
- var clips = clip.append("rect")
- .attr('class', 'load-clip')
- .attr("width", 0)
- .attr("height", height);
- // Animate mask
- clips
- .transition()
- .duration(1000)
- .ease('linear')
- .attr("width", width);
- //
- // Append chart elements
- //
- // Main path
- var path = svg.append("g")
- .attr("clip-path", function(d, i) { return "url(#load-clip-" + element.substring(1) + ")"; })
- .append("path")
- .datum(data)
- .attr("transform", "translate(" + x(0) + ",0)");
- // Add path based on chart type
- if(chartType == "area") {
- path.attr("d", area).attr('class', 'd3-area').style("fill", color); // area
- }
- else {
- path.attr("d", line).attr("class", "d3-line d3-line-medium").style('stroke', color); // line
- }
- // Animate path
- path
- .style('opacity', 0)
- .transition()
- .duration(500)
- .style('opacity', 1);
- // Set update interval. For demo only
- // ------------------------------
- setInterval(function() {
- // push a new data point onto the back
- data.push(Math.floor(Math.random() * qty) + 5);
- // pop the old data point off the front
- data.shift();
- update();
- }, interval);
- // Update random data. For demo only
- // ------------------------------
- function update() {
- // Redraw the path and slide it to the left
- path
- .attr("transform", null)
- .transition()
- .duration(duration)
- .ease("linear")
- .attr("transform", "translate(" + x(0) + ",0)");
- // Update path type
- if(chartType == "area") {
- path.attr("d", area).attr('class', 'd3-area').style("fill", color);
- }
- else {
- path.attr("d", line).attr("class", "d3-line d3-line-medium").style('stroke', color);
- }
- }
- // Resize chart
- // ------------------------------
- // Call function on window resize
- $(window).on('resize', resizeSparklines);
- // Call function on sidebar width change
- $(document).on('click', '.sidebar-control', resizeSparklines);
- // Resize function
- //
- // Since D3 doesn't support SVG resize by default,
- // we need to manually specify parts of the graph that need to
- // be updated on window resize
- function resizeSparklines() {
- // Layout variables
- width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
- // Layout
- // -------------------------
- // Main svg width
- container.attr("width", width + margin.left + margin.right);
- // Width of appended group
- svg.attr("width", width + margin.left + margin.right);
- // Horizontal range
- x.range([0, width]);
- // Chart elements
- // -------------------------
- // Clip mask
- clips.attr("width", width);
- // Line
- svg.select(".d3-line").attr("d", line);
- // Area
- svg.select(".d3-area").attr("d", area);
- }
- }
- };
- // Animated progress with icon
- var _progressIcon = function(element, radius, border, backgroundColor, foregroundColor, end, iconClass) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Basic setup
- // ------------------------------
- // Main variables
- var d3Container = d3.select(element),
- startPercent = 0,
- iconSize = 32,
- endPercent = end,
- twoPi = Math.PI * 2,
- formatPercent = d3.format('.0%'),
- boxSize = radius * 2;
- // Values count
- var count = Math.abs((endPercent - startPercent) / 0.01);
- // Values step
- var step = endPercent < startPercent ? -0.01 : 0.01;
- // Create chart
- // ------------------------------
- // Add SVG element
- var container = d3Container.append('svg');
- // Add SVG group
- var svg = container
- .attr('width', boxSize)
- .attr('height', boxSize)
- .append('g')
- .attr('transform', 'translate(' + (boxSize / 2) + ',' + (boxSize / 2) + ')');
- // Construct chart layout
- // ------------------------------
- // Arc
- var arc = d3.svg.arc()
- .startAngle(0)
- .innerRadius(radius)
- .outerRadius(radius - border)
- .cornerRadius(20);
- //
- // Append chart elements
- //
- // Paths
- // ------------------------------
- // Background path
- svg.append('path')
- .attr('class', 'd3-progress-background')
- .attr('d', arc.endAngle(twoPi))
- .style('fill', backgroundColor);
- // Foreground path
- var foreground = svg.append('path')
- .attr('class', 'd3-progress-foreground')
- .attr('filter', 'url(#blur)')
- .style({
- 'fill': foregroundColor,
- 'stroke': foregroundColor
- });
- // Front path
- var front = svg.append('path')
- .attr('class', 'd3-progress-front')
- .style({
- 'fill': foregroundColor,
- 'fill-opacity': 1
- });
- // Text
- // ------------------------------
- // Percentage text value
- var numberText = d3.select('.progress-percentage')
- .attr('class', 'pt-1 mt-2 mb-1');
- // Icon
- d3.select(element)
- .append("i")
- .attr("class", iconClass + " counter-icon")
- .style({
- 'color': foregroundColor,
- 'top': ((boxSize - iconSize) / 2) + 'px'
- });
- // Animation
- // ------------------------------
- // Animate path
- function updateProgress(progress) {
- foreground.attr('d', arc.endAngle(twoPi * progress));
- front.attr('d', arc.endAngle(twoPi * progress));
- numberText.text(formatPercent(progress));
- }
- // Animate text
- var progress = startPercent;
- (function loops() {
- updateProgress(progress);
- if (count > 0) {
- count--;
- progress += step;
- setTimeout(loops, 10);
- }
- })();
- }
- };
- // Animated progress with percentage count
- var _progressPercentage = function(element, radius, border, backgroundColor, foregroundColor, end) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Basic setup
- // ------------------------------
- // Main variables
- var d3Container = d3.select(element),
- startPercent = 0,
- fontSize = 22,
- endPercent = end,
- twoPi = Math.PI * 2,
- formatPercent = d3.format('.0%'),
- boxSize = radius * 2;
- // Values count
- var count = Math.abs((endPercent - startPercent) / 0.01);
- // Values step
- var step = endPercent < startPercent ? -0.01 : 0.01;
- // Create chart
- // ------------------------------
- // Add SVG element
- var container = d3Container.append('svg');
- // Add SVG group
- var svg = container
- .attr('width', boxSize)
- .attr('height', boxSize)
- .append('g')
- .attr('transform', 'translate(' + radius + ',' + radius + ')');
- // Construct chart layout
- // ------------------------------
- // Arc
- var arc = d3.svg.arc()
- .startAngle(0)
- .innerRadius(radius)
- .outerRadius(radius - border)
- .cornerRadius(20);
- //
- // Append chart elements
- //
- // Paths
- // ------------------------------
- // Background path
- svg.append('path')
- .attr('class', 'd3-progress-background')
- .attr('d', arc.endAngle(twoPi))
- .style('fill', backgroundColor);
- // Foreground path
- var foreground = svg.append('path')
- .attr('class', 'd3-progress-foreground')
- .attr('filter', 'url(#blur)')
- .style({
- 'fill': foregroundColor,
- 'stroke': foregroundColor
- });
- // Front path
- var front = svg.append('path')
- .attr('class', 'd3-progress-front')
- .style({
- 'fill': foregroundColor,
- 'fill-opacity': 1
- });
- // Text
- // ------------------------------
- // Percentage text value
- var numberText = svg
- .append('text')
- .attr('dx', 0)
- .attr('dy', (fontSize / 2) - border)
- .style({
- 'font-size': fontSize + 'px',
- 'line-height': 1,
- 'fill': foregroundColor,
- 'text-anchor': 'middle'
- });
- // Animation
- // ------------------------------
- // Animate path
- function updateProgress(progress) {
- foreground.attr('d', arc.endAngle(twoPi * progress));
- front.attr('d', arc.endAngle(twoPi * progress));
- numberText.text(formatPercent(progress));
- }
- // Animate text
- var progress = startPercent;
- (function loops() {
- updateProgress(progress);
- if (count > 0) {
- count--;
- progress += step;
- setTimeout(loops, 10);
- }
- })();
- }
- };
- // Simple pie
- var _animatedPie = function(element, size) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Add data set
- var data = [
- {
- "status": "Pending tickets",
- "icon": "<i class='badge badge-mark border-blue-300 mr-2'></i>",
- "value": 938,
- "color": "#29B6F6"
- }, {
- "status": "Resolved tickets",
- "icon": "<i class='badge badge-mark border-success-300 mr-2'></i>",
- "value": 490,
- "color": "#66BB6A"
- }, {
- "status": "Closed tickets",
- "icon": "<i class='badge badge-mark border-danger-300 mr-2'></i>",
- "value": 789,
- "color": "#EF5350"
- }
- ];
- // Main variables
- var d3Container = d3.select(element),
- distance = 2, // reserve 2px space for mouseover arc moving
- radius = (size/2) - distance,
- sum = d3.sum(data, function(d) { return d.value; });
- // Tooltip
- // ------------------------------
- var tip = d3.tip()
- .attr('class', 'd3-tip')
- .offset([-10, 0])
- .direction('e')
- .html(function (d) {
- return "<ul class='list-unstyled mb-1'>" +
- "<li>" + "<div class='font-size-base my-1'>" + d.data.icon + d.data.status + "</div>" + "</li>" +
- "<li>" + "Total: " + "<span class='font-weight-semibold float-right'>" + d.value + "</span>" + "</li>" +
- "<li>" + "Share: " + "<span class='font-weight-semibold float-right'>" + (100 / (sum / d.value)).toFixed(2) + "%" + "</span>" + "</li>" +
- "</ul>";
- });
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append("svg").call(tip);
-
- // Add SVG group
- var svg = container
- .attr("width", size)
- .attr("height", size)
- .append("g")
- .attr("transform", "translate(" + (size / 2) + "," + (size / 2) + ")");
- // Construct chart layout
- // ------------------------------
- // Pie
- var pie = d3.layout.pie()
- .sort(null)
- .startAngle(Math.PI)
- .endAngle(3 * Math.PI)
- .value(function (d) {
- return d.value;
- });
- // Arc
- var arc = d3.svg.arc()
- .outerRadius(radius);
- //
- // Append chart elements
- //
- // Group chart elements
- var arcGroup = svg.selectAll(".d3-arc")
- .data(pie(data))
- .enter()
- .append("g")
- .attr("class", "d3-arc")
- .style({
- 'stroke': '#fff',
- 'stroke-width': 2,
- 'cursor': 'pointer'
- });
-
- // Append path
- var arcPath = arcGroup
- .append("path")
- .style("fill", function (d) {
- return d.data.color;
- });
- // Add tooltip
- arcPath
- .on('mouseover', function (d, i) {
- // Transition on mouseover
- d3.select(this)
- .transition()
- .duration(500)
- .ease('elastic')
- .attr('transform', function (d) {
- d.midAngle = ((d.endAngle - d.startAngle) / 2) + d.startAngle;
- var x = Math.sin(d.midAngle) * distance;
- var y = -Math.cos(d.midAngle) * distance;
- return 'translate(' + x + ',' + y + ')';
- });
- })
- .on("mousemove", function (d) {
-
- // Show tooltip on mousemove
- tip.show(d)
- .style("top", (d3.event.pageY - 40) + "px")
- .style("left", (d3.event.pageX + 30) + "px");
- })
- .on('mouseout', function (d, i) {
- // Mouseout transition
- d3.select(this)
- .transition()
- .duration(500)
- .ease('bounce')
- .attr('transform', 'translate(0,0)');
- // Hide tooltip
- tip.hide(d);
- });
- // Animate chart on load
- arcPath
- .transition()
- .delay(function(d, i) { return i * 500; })
- .duration(500)
- .attrTween("d", function(d) {
- var interpolate = d3.interpolate(d.startAngle,d.endAngle);
- return function(t) {
- d.endAngle = interpolate(t);
- return arc(d);
- };
- });
- //
- // Append counter
- //
- // Append element
- d3Container
- .append('h2')
- .attr('class', 'pt-1 mt-2 mb-1 font-weight-semibold');
- // Animate counter
- d3Container.select('h2')
- .transition()
- .duration(1500)
- .tween("text", function(d) {
- var i = d3.interpolate(this.textContent, sum);
- return function(t) {
- this.textContent = d3.format(",d")(Math.round(i(t)));
- };
- });
- }
- };
- // Pie with legend
- var _animatedPieWithLegend = function(element, size) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Add data set
- var data = [
- {
- "status": "New",
- "value": 578,
- "color": "#29B6F6"
- }, {
- "status": "Pending",
- "value": 983,
- "color": "#66BB6A"
- }, {
- "status": "Shipped",
- "value": 459,
- "color": "#EF5350"
- }
- ];
- // Main variables
- var d3Container = d3.select(element),
- distance = 2, // reserve 2px space for mouseover arc moving
- radius = (size/2) - distance,
- sum = d3.sum(data, function(d) { return d.value; });
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append("svg");
-
- // Add SVG group
- var svg = container
- .attr("width", size)
- .attr("height", size)
- .append("g")
- .attr("transform", "translate(" + (size / 2) + "," + (size / 2) + ")");
- // Construct chart layout
- // ------------------------------
- // Pie
- var pie = d3.layout.pie()
- .sort(null)
- .startAngle(Math.PI)
- .endAngle(3 * Math.PI)
- .value(function (d) {
- return d.value;
- });
- // Arc
- var arc = d3.svg.arc()
- .outerRadius(radius);
- //
- // Append chart elements
- //
- // Group chart elements
- var arcGroup = svg.selectAll(".d3-arc")
- .data(pie(data))
- .enter()
- .append("g")
- .attr("class", "d3-arc")
- .style({
- 'stroke': '#fff',
- 'stroke-width': 2,
- 'cursor': 'pointer'
- });
-
- // Append path
- var arcPath = arcGroup
- .append("path")
- .style("fill", function (d) {
- return d.data.color;
- });
- // Add interactions
- arcPath
- .on('mouseover', function (d, i) {
- // Transition on mouseover
- d3.select(this)
- .transition()
- .duration(500)
- .ease('elastic')
- .attr('transform', function (d) {
- d.midAngle = ((d.endAngle - d.startAngle) / 2) + d.startAngle;
- var x = Math.sin(d.midAngle) * distance;
- var y = -Math.cos(d.midAngle) * distance;
- return 'translate(' + x + ',' + y + ')';
- });
- // Animate legend
- $(element + ' [data-slice]').css({
- 'opacity': 0.3,
- 'transition': 'all ease-in-out 0.15s'
- });
- $(element + ' [data-slice=' + i + ']').css({'opacity': 1});
- })
- .on('mouseout', function (d, i) {
- // Mouseout transition
- d3.select(this)
- .transition()
- .duration(500)
- .ease('bounce')
- .attr('transform', 'translate(0,0)');
- // Revert legend animation
- $(element + ' [data-slice]').css('opacity', 1);
- });
- // Animate chart on load
- arcPath
- .transition()
- .delay(function(d, i) { return i * 500; })
- .duration(500)
- .attrTween("d", function(d) {
- var interpolate = d3.interpolate(d.startAngle,d.endAngle);
- return function(t) {
- d.endAngle = interpolate(t);
- return arc(d);
- };
- });
- //
- // Append counter
- //
- // Append element
- d3Container
- .append('h2')
- .attr('class', 'pt-1 mt-2 mb-1 font-weight-semibold');
- // Animate counter
- d3Container.select('h2')
- .transition()
- .duration(1500)
- .tween("text", function(d) {
- var i = d3.interpolate(this.textContent, sum);
- return function(t) {
- this.textContent = d3.format(",d")(Math.round(i(t)));
- };
- });
- //
- // Append legend
- //
- // Add element
- var legend = d3.select(element)
- .append('ul')
- .attr('class', 'chart-widget-legend')
- .selectAll('li').data(pie(data))
- .enter().append('li')
- .attr('data-slice', function(d, i) {
- return i;
- })
- .attr('style', function(d, i) {
- return 'border-bottom: 2px solid ' + d.data.color;
- })
- .text(function(d, i) {
- return d.data.status + ': ';
- });
- // Add value
- legend.append('span')
- .text(function(d, i) {
- return d.data.value;
- });
- }
- };
- // Pie arc with legend
- var _pieArcWithLegend = function(element, size) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Basic setup
- // ------------------------------
- // Add data set
- var data = [
- {
- "status": "Pending",
- "icon": "<i class='badge badge-mark border-blue-300 mr-2'></i>",
- "value": 720,
- "color": "#29B6F6"
- }, {
- "status": "Resolved",
- "icon": "<i class='badge badge-mark border-success-300 mr-2'></i>",
- "value": 990,
- "color": "#66BB6A"
- }, {
- "status": "Closed",
- "icon": "<i class='badge badge-mark border-danger-300 mr-2'></i>",
- "value": 720,
- "color": "#EF5350"
- }
- ];
- // Main variables
- var d3Container = d3.select(element),
- distance = 2, // reserve 2px space for mouseover arc moving
- radius = (size/2) - distance,
- sum = d3.sum(data, function(d) { return d.value; });
- // Tooltip
- // ------------------------------
- var tip = d3.tip()
- .attr('class', 'd3-tip')
- .offset([-10, 0])
- .direction('e')
- .html(function (d) {
- return "<ul class='list-unstyled mb-1'>" +
- "<li>" + "<div class='font-size-base my-1'>" + d.data.icon + d.data.status + "</div>" + "</li>" +
- "<li>" + "Total: " + "<span class='font-weight-semibold float-right'>" + d.value + "</span>" + "</li>" +
- "<li>" + "Share: " + "<span class='font-weight-semibold float-right'>" + (100 / (sum / d.value)).toFixed(2) + "%" + "</span>" + "</li>" +
- "</ul>";
- });
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append("svg").call(tip);
-
- // Add SVG group
- var svg = container
- .attr("width", size)
- .attr("height", size / 2)
- .append("g")
- .attr("transform", "translate(" + (size / 2) + "," + (size / 2) + ")");
- // Construct chart layout
- // ------------------------------
- // Pie
- var pie = d3.layout.pie()
- .sort(null)
- .startAngle(-Math.PI / 2)
- .endAngle(Math.PI / 2)
- .value(function (d) {
- return d.value;
- });
- // Arc
- var arc = d3.svg.arc()
- .outerRadius(radius)
- .innerRadius(radius / 1.3);
- //
- // Append chart elements
- //
- // Group chart elements
- var arcGroup = svg.selectAll(".d3-arc")
- .data(pie(data))
- .enter()
- .append("g")
- .attr("class", "d3-arc")
- .style({
- 'stroke': '#fff',
- 'stroke-width': 2,
- 'cursor': 'pointer'
- });
-
- // Append path
- var arcPath = arcGroup
- .append("path")
- .style("fill", function (d) {
- return d.data.color;
- });
- //
- // Interactions
- //
- // Mouse
- arcPath
- .on('mouseover', function(d, i) {
- // Transition on mouseover
- d3.select(this)
- .transition()
- .duration(500)
- .ease('elastic')
- .attr('transform', function (d) {
- d.midAngle = ((d.endAngle - d.startAngle) / 2) + d.startAngle;
- var x = Math.sin(d.midAngle) * distance;
- var y = -Math.cos(d.midAngle) * distance;
- return 'translate(' + x + ',' + y + ')';
- });
- $(element + ' [data-slice]').css({
- 'opacity': 0.3,
- 'transition': 'all ease-in-out 0.15s'
- });
- $(element + ' [data-slice=' + i + ']').css({'opacity': 1});
- })
- .on('mouseout', function(d, i) {
- // Mouseout transition
- d3.select(this)
- .transition()
- .duration(500)
- .ease('bounce')
- .attr('transform', 'translate(0,0)');
- $(element + ' [data-slice]').css('opacity', 1);
- });
- // Animate chart on load
- arcPath
- .transition()
- .delay(function(d, i) {
- return i * 500;
- })
- .duration(500)
- .attrTween("d", function(d) {
- var interpolate = d3.interpolate(d.startAngle,d.endAngle);
- return function(t) {
- d.endAngle = interpolate(t);
- return arc(d);
- };
- });
- //
- // Append total text
- //
- svg.append('text')
- .attr('class', 'text-muted')
- .attr({
- 'class': 'half-donut-total',
- 'text-anchor': 'middle',
- 'dy': -33
- })
- .style({
- 'font-size': '12px',
- 'fill': '#999'
- })
- .text('Total');
- //
- // Append count
- //
- // Text
- svg
- .append('text')
- .attr('class', 'half-conut-count')
- .attr('text-anchor', 'middle')
- .attr('dy', -5)
- .style({
- 'font-size': '21px',
- 'font-weight': 500
- });
- // Animation
- svg.select('.half-conut-count')
- .transition()
- .duration(1500)
- .ease('linear')
- .tween("text", function(d) {
- var i = d3.interpolate(this.textContent, sum);
- return function(t) {
- this.textContent = d3.format(",d")(Math.round(i(t)));
- };
- });
- //
- // Legend
- //
- // Add legend list
- var legend = d3.select(element)
- .append('ul')
- .attr('class', 'chart-widget-legend')
- .selectAll('li')
- .data(pie(data))
- .enter()
- .append('li')
- .attr('data-slice', function(d, i) {
- return i;
- })
- .attr('style', function(d, i) {
- return 'border-bottom: solid 2px ' + d.data.color;
- })
- .text(function(d, i) {
- return d.data.status + ': ';
- });
- // Legend text
- legend.append('span')
- .text(function(d, i) {
- return d.data.value;
- });
- }
- };
- // Simple donut
- var _animatedDonut = function(element, size) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Add data set
- var data = [
- {
- "status": "Pending tickets",
- "icon": "<i class='badge badge-mark border-blue-300 mr-2'></i>",
- "value": 567,
- "color": "#29B6F6"
- }, {
- "status": "Resolved tickets",
- "icon": "<i class='badge badge-mark border-success-300 mr-2'></i>",
- "value": 234,
- "color": "#66BB6A"
- }, {
- "status": "Closed tickets",
- "icon": "<i class='badge badge-mark border-danger-300 mr-2'></i>",
- "value": 642,
- "color": "#EF5350"
- }
- ];
- // Main variables
- var d3Container = d3.select(element),
- distance = 2, // reserve 2px space for mouseover arc moving
- radius = (size/2) - distance,
- sum = d3.sum(data, function(d) { return d.value; });
- // Tooltip
- // ------------------------------
- var tip = d3.tip()
- .attr('class', 'd3-tip')
- .offset([-10, 0])
- .direction('e')
- .html(function (d) {
- return "<ul class='list-unstyled mb-1'>" +
- "<li>" + "<div class='font-size-base my-1'>" + d.data.icon + d.data.status + "</div>" + "</li>" +
- "<li>" + "Total: " + "<span class='font-weight-semibold float-right'>" + d.value + "</span>" + "</li>" +
- "<li>" + "Share: " + "<span class='font-weight-semibold float-right'>" + (100 / (sum / d.value)).toFixed(2) + "%" + "</span>" + "</li>" +
- "</ul>";
- });
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append("svg").call(tip);
-
- // Add SVG group
- var svg = container
- .attr("width", size)
- .attr("height", size)
- .append("g")
- .attr("transform", "translate(" + (size / 2) + "," + (size / 2) + ")");
- // Construct chart layout
- // ------------------------------
- // Pie
- var pie = d3.layout.pie()
- .sort(null)
- .startAngle(Math.PI)
- .endAngle(3 * Math.PI)
- .value(function (d) {
- return d.value;
- });
- // Arc
- var arc = d3.svg.arc()
- .outerRadius(radius)
- .innerRadius(radius / 1.5);
- //
- // Append chart elements
- //
- // Group chart elements
- var arcGroup = svg.selectAll(".d3-arc")
- .data(pie(data))
- .enter()
- .append("g")
- .attr("class", "d3-arc")
- .style({
- 'stroke': '#fff',
- 'stroke-width': 2,
- 'cursor': 'pointer'
- });
-
- // Append path
- var arcPath = arcGroup
- .append("path")
- .style("fill", function (d) {
- return d.data.color;
- });
- // Add tooltip
- arcPath
- .on('mouseover', function (d, i) {
- // Transition on mouseover
- d3.select(this)
- .transition()
- .duration(500)
- .ease('elastic')
- .attr('transform', function (d) {
- d.midAngle = ((d.endAngle - d.startAngle) / 2) + d.startAngle;
- var x = Math.sin(d.midAngle) * distance;
- var y = -Math.cos(d.midAngle) * distance;
- return 'translate(' + x + ',' + y + ')';
- });
- })
- .on("mousemove", function (d) {
-
- // Show tooltip on mousemove
- tip.show(d)
- .style("top", (d3.event.pageY - 40) + "px")
- .style("left", (d3.event.pageX + 30) + "px");
- })
- .on('mouseout', function (d, i) {
- // Mouseout transition
- d3.select(this)
- .transition()
- .duration(500)
- .ease('bounce')
- .attr('transform', 'translate(0,0)');
- // Hide tooltip
- tip.hide(d);
- });
- // Animate chart on load
- arcPath
- .transition()
- .delay(function(d, i) { return i * 500; })
- .duration(500)
- .attrTween("d", function(d) {
- var interpolate = d3.interpolate(d.startAngle,d.endAngle);
- return function(t) {
- d.endAngle = interpolate(t);
- return arc(d);
- };
- });
- //
- // Append counter
- //
- // Append text
- svg
- .append('text')
- .attr('text-anchor', 'middle')
- .attr('dy', 6)
- .style({
- 'font-size': '17px',
- 'font-weight': 500
- });
- // Animate text
- svg.select('text')
- .transition()
- .duration(1500)
- .tween("text", function(d) {
- var i = d3.interpolate(this.textContent, sum);
- return function(t) {
- this.textContent = d3.format(",d")(Math.round(i(t)));
- };
- });
- }
- };
- // Donut with legend
- var _animatedDonutWithLegend = function(element, size) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Add data set
- var data = [
- {
- "status": "New",
- "value": 790,
- "color": "#29B6F6"
- }, {
- "status": "Pending",
- "value": 850,
- "color": "#66BB6A"
- }, {
- "status": "Shipped",
- "value": 760,
- "color": "#EF5350"
- }
- ];
- // Main variables
- var d3Container = d3.select(element),
- distance = 2, // reserve 2px space for mouseover arc moving
- radius = (size/2) - distance,
- sum = d3.sum(data, function(d) { return d.value; });
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append("svg");
-
- // Add SVG group
- var svg = container
- .attr("width", size)
- .attr("height", size)
- .append("g")
- .attr("transform", "translate(" + (size / 2) + "," + (size / 2) + ")");
- // Construct chart layout
- // ------------------------------
- // Pie
- var pie = d3.layout.pie()
- .sort(null)
- .startAngle(Math.PI)
- .endAngle(3 * Math.PI)
- .value(function (d) {
- return d.value;
- });
- // Arc
- var arc = d3.svg.arc()
- .outerRadius(radius)
- .innerRadius(radius / 1.5);
- //
- // Append chart elements
- //
- // Group chart elements
- var arcGroup = svg.selectAll(".d3-arc")
- .data(pie(data))
- .enter()
- .append("g")
- .attr("class", "d3-arc")
- .style({
- 'stroke': '#fff',
- 'stroke-width': 2,
- 'cursor': 'pointer'
- });
-
- // Append path
- var arcPath = arcGroup
- .append("path")
- .style("fill", function (d) {
- return d.data.color;
- });
- // Add interactions
- arcPath
- .on('mouseover', function (d, i) {
- // Transition on mouseover
- d3.select(this)
- .transition()
- .duration(500)
- .ease('elastic')
- .attr('transform', function (d) {
- d.midAngle = ((d.endAngle - d.startAngle) / 2) + d.startAngle;
- var x = Math.sin(d.midAngle) * distance;
- var y = -Math.cos(d.midAngle) * distance;
- return 'translate(' + x + ',' + y + ')';
- });
- // Animate legend
- $(element + ' [data-slice]').css({
- 'opacity': 0.3,
- 'transition': 'all ease-in-out 0.15s'
- });
- $(element + ' [data-slice=' + i + ']').css({'opacity': 1});
- })
- .on('mouseout', function (d, i) {
- // Mouseout transition
- d3.select(this)
- .transition()
- .duration(500)
- .ease('bounce')
- .attr('transform', 'translate(0,0)');
- // Revert legend animation
- $(element + ' [data-slice]').css('opacity', 1);
- });
- // Animate chart on load
- arcPath
- .transition()
- .delay(function(d, i) {
- return i * 500;
- })
- .duration(500)
- .attrTween("d", function(d) {
- var interpolate = d3.interpolate(d.startAngle,d.endAngle);
- return function(t) {
- d.endAngle = interpolate(t);
- return arc(d);
- };
- });
- //
- // Append counter
- //
- // Append text
- svg
- .append('text')
- .attr('text-anchor', 'middle')
- .attr('dy', 6)
- .style({
- 'font-size': '17px',
- 'font-weight': 500
- });
- // Animate text
- svg.select('text')
- .transition()
- .duration(1500)
- .tween("text", function(d) {
- var i = d3.interpolate(this.textContent, sum);
- return function(t) {
- this.textContent = d3.format(",d")(Math.round(i(t)));
- };
- });
- //
- // Append legend
- //
- // Add element
- var legend = d3.select(element)
- .append('ul')
- .attr('class', 'chart-widget-legend')
- .selectAll('li').data(pie(data))
- .enter().append('li')
- .attr('data-slice', function(d, i) {
- return i;
- })
- .attr('style', function(d, i) {
- return 'border-bottom: 2px solid ' + d.data.color;
- })
- .text(function(d, i) {
- return d.data.status + ': ';
- });
- // Add value
- legend.append('span')
- .text(function(d, i) {
- return d.data.value;
- });
- }
- };
- // Donut with details
- var _donutWithDetails = function(element, size) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Basic setup
- // ------------------------------
- // Add data set
- var data = [
- {
- "status": "Pending",
- "icon": "<i class='badge badge-mark border-blue-300 mr-2'></i>",
- "value": 720,
- "color": "#29B6F6"
- }, {
- "status": "Resolved",
- "icon": "<i class='badge badge-mark border-success-300 mr-2'></i>",
- "value": 990,
- "color": "#66BB6A"
- }, {
- "status": "Closed",
- "icon": "<i class='badge badge-mark border-danger-300 mr-2'></i>",
- "value": 720,
- "color": "#EF5350"
- }
- ];
- // Main variables
- var d3Container = d3.select(element),
- distance = 2, // reserve 2px space for mouseover arc moving
- radius = (size/2) - distance,
- sum = d3.sum(data, function(d) { return d.value; });
- // Tooltip
- // ------------------------------
- var tip = d3.tip()
- .attr('class', 'd3-tip')
- .offset([-10, 0])
- .direction('e')
- .html(function (d) {
- return "<ul class='list-unstyled mb-1'>" +
- "<li>" + "<div class='font-size-base my-1'>" + d.data.icon + d.data.status + "</div>" + "</li>" +
- "<li>" + "Total: " + "<span class='font-weight-semibold float-right'>" + d.value + "</span>" + "</li>" +
- "<li>" + "Share: " + "<span class='font-weight-semibold float-right'>" + (100 / (sum / d.value)).toFixed(2) + "%" + "</span>" + "</li>" +
- "</ul>";
- });
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append("svg").call(tip);
-
- // Add SVG group
- var svg = container
- .attr("width", size)
- .attr("height", size)
- .append("g")
- .attr("transform", "translate(" + (size / 2) + "," + (size / 2) + ")");
- // Construct chart layout
- // ------------------------------
- // Pie
- var pie = d3.layout.pie()
- .sort(null)
- .startAngle(Math.PI)
- .endAngle(3 * Math.PI)
- .value(function (d) {
- return d.value;
- });
- // Arc
- var arc = d3.svg.arc()
- .outerRadius(radius)
- .innerRadius(radius / 1.35);
- //
- // Append chart elements
- //
- // Group chart elements
- var arcGroup = svg.selectAll(".d3-arc")
- .data(pie(data))
- .enter()
- .append("g")
- .attr("class", "d3-arc")
- .style({
- 'stroke': '#fff',
- 'stroke-width': 2,
- 'cursor': 'pointer'
- });
-
- // Append path
- var arcPath = arcGroup
- .append("path")
- .style("fill", function (d) {
- return d.data.color;
- });
- //
- // Add interactions
- //
- // Mouse
- arcPath
- .on('mouseover', function(d, i) {
- // Transition on mouseover
- d3.select(this)
- .transition()
- .duration(500)
- .ease('elastic')
- .attr('transform', function (d) {
- d.midAngle = ((d.endAngle - d.startAngle) / 2) + d.startAngle;
- var x = Math.sin(d.midAngle) * distance;
- var y = -Math.cos(d.midAngle) * distance;
- return 'translate(' + x + ',' + y + ')';
- });
- $(element + ' [data-slice]').css({
- 'opacity': 0.3,
- 'transition': 'all ease-in-out 0.15s'
- });
- $(element + ' [data-slice=' + i + ']').css({'opacity': 1});
- })
- .on('mouseout', function(d, i) {
- // Mouseout transition
- d3.select(this)
- .transition()
- .duration(500)
- .ease('bounce')
- .attr('transform', 'translate(0,0)');
- $(element + ' [data-slice]').css('opacity', 1);
- });
- // Animate chart on load
- arcPath
- .transition()
- .delay(function(d, i) {
- return i * 500;
- })
- .duration(500)
- .attrTween("d", function(d) {
- var interpolate = d3.interpolate(d.startAngle,d.endAngle);
- return function(t) {
- d.endAngle = interpolate(t);
- return arc(d);
- };
- });
- //
- // Add text
- //
- // Total
- svg.append('text')
- .attr('class', 'text-muted')
- .attr({
- 'class': 'half-donut-total',
- 'text-anchor': 'middle',
- 'dy': -13
- })
- .style({
- 'font-size': '12px',
- 'fill': '#999'
- })
- .text('Total');
- // Count
- svg
- .append('text')
- .attr('class', 'half-donut-count')
- .attr('text-anchor', 'middle')
- .attr('dy', 14)
- .style({
- 'font-size': '21px',
- 'font-weight': 500
- });
- // Animate count
- svg.select('.half-donut-count')
- .transition()
- .duration(1500)
- .ease('linear')
- .tween("text", function(d) {
- var i = d3.interpolate(this.textContent, sum);
- return function(t) {
- this.textContent = d3.format(",d")(Math.round(i(t)));
- };
- });
- //
- // Add legend
- //
- // Append list
- var legend = d3.select(element)
- .append('ul')
- .attr('class', 'chart-widget-legend')
- .selectAll('li')
- .data(pie(data))
- .enter()
- .append('li')
- .attr('data-slice', function(d, i) {
- return i;
- })
- .attr('style', function(d, i) {
- return 'border-bottom: solid 2px ' + d.data.color;
- })
- .text(function(d, i) {
- return d.data.status + ': ';
- });
- // Append text
- legend.append('span')
- .text(function(d, i) {
- return d.data.value;
- });
- }
- };
- // Progress arc - single color
- var _progressArcSingle = function(element, size) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Main variables
- var d3Container = d3.select(element),
- radius = size,
- thickness = 20,
- color = '#29B6F6';
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append("svg");
-
- // Add SVG group
- var svg = container
- .attr('width', radius * 2)
- .attr('height', radius + 20)
- .attr('class', 'gauge');
- // Construct chart layout
- // ------------------------------
- // Pie
- var arc = d3.svg.arc()
- .innerRadius(radius - thickness)
- .outerRadius(radius)
- .startAngle(-Math.PI / 2);
- // Append chart elements
- // ------------------------------
- //
- // Group arc elements
- //
- // Group
- var chart = svg.append('g')
- .attr('transform', 'translate(' + radius + ',' + radius + ')');
- // Background
- var background = chart.append('path')
- .datum({
- endAngle: Math.PI / 2
- })
- .attr({
- 'd': arc,
- 'fill': '#eee'
- });
- // Foreground
- var foreground = chart.append('path')
- .datum({
- endAngle: -Math.PI / 2
- })
- .style('fill', color)
- .attr('d', arc);
- // Counter value
- var value = svg.append('g')
- .attr('transform', 'translate(' + radius + ',' + (radius * 0.9) + ')')
- .append('text')
- .text(0 + '%')
- .attr({
- 'text-anchor': 'middle',
- 'fill': '#555'
- })
- .style({
- 'font-size': 19,
- 'font-weight': 400
- });
- //
- // Min and max text
- //
- // Group
- var scale = svg.append('g')
- .attr('transform', 'translate(' + radius + ',' + (radius + 15) + ')')
- .style({
- 'font-size': 12,
- 'fill': '#999'
- });
- // Max
- scale.append('text')
- .text(100)
- .attr({
- 'text-anchor': 'middle',
- 'x': (radius - thickness / 2)
- });
- // Min
- scale.append('text')
- .text(0)
- .attr({
- 'text-anchor': 'middle',
- 'x': -(radius - thickness / 2)
- });
- //
- // Animation
- //
- // Interval
- setInterval(function() {
- update(Math.random() * 100);
- }, 1500);
- // Update
- function update(v) {
- v = d3.format('.0f')(v);
- foreground.transition()
- .duration(750)
- .call(arcTween, v);
- value.transition()
- .duration(750)
- .call(textTween, v);
- }
- // Arc
- function arcTween(transition, v) {
- var newAngle = v / 100 * Math.PI - Math.PI / 2;
- transition.attrTween('d', function(d) {
- var interpolate = d3.interpolate(d.endAngle, newAngle);
- return function(t) {
- d.endAngle = interpolate(t);
- return arc(d);
- };
- });
- }
- // Text
- function textTween(transition, v) {
- transition.tween('text', function() {
- var interpolate = d3.interpolate(this.innerHTML, v),
- split = (v + '').split('.'),
- round = (split.length > 1) ? Math.pow(10, split[1].length) : 1;
- return function(t) {
- this.innerHTML = d3.format('.0f')(Math.round(interpolate(t) * round) / round) + '<tspan>%</tspan>';
- };
- });
- }
- }
- };
- // Progress arc - multiple colors
- var _progressArcMulti = function(element, size, goal) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Main variables
- var d3Container = d3.select(element),
- radius = size,
- thickness = 20,
- startColor = '#66BB6A',
- midColor = '#FFA726',
- endColor = '#EF5350';
- // Colors
- var color = d3.scale.linear()
- .domain([0, 70, 100])
- .range([startColor, midColor, endColor]);
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append("svg");
-
- // Add SVG group
- var svg = container
- .attr('width', radius * 2)
- .attr('height', radius + 20);
- // Construct chart layout
- // ------------------------------
- // Pie
- var arc = d3.svg.arc()
- .innerRadius(radius - thickness)
- .outerRadius(radius)
- .startAngle(-Math.PI / 2);
- // Append chart elements
- // ------------------------------
- //
- // Group arc elements
- //
- // Group
- var chart = svg.append('g')
- .attr('transform', 'translate(' + radius + ',' + radius + ')');
- // Background
- var background = chart.append('path')
- .datum({
- endAngle: Math.PI / 2
- })
- .attr({
- 'd': arc,
- 'fill': '#eee'
- });
- // Foreground
- var foreground = chart.append('path')
- .datum({
- endAngle: -Math.PI / 2
- })
- .style('fill', startColor)
- .attr('d', arc);
- // Counter value
- var value = svg.append('g')
- .attr('transform', 'translate(' + radius + ',' + (radius * 0.9) + ')')
- .append('text')
- .text(0 + '%')
- .attr({
- 'text-anchor': 'middle',
- 'fill': '#555'
- })
- .style({
- 'font-size': 19,
- 'font-weight': 400
- });
- //
- // Min and max text
- //
- // Group
- var scale = svg.append('g')
- .attr('transform', 'translate(' + radius + ',' + (radius + 15) + ')')
- .style({
- 'font-size': 12,
- 'fill': '#999'
- });
- // Max
- scale.append('text')
- .text(100)
- .attr({
- 'text-anchor': 'middle',
- 'x': (radius - thickness / 2)
- });
- // Min
- scale.append('text')
- .text(0)
- .attr({
- 'text-anchor': 'middle',
- 'x': -(radius - thickness / 2)
- });
- //
- // Animation
- //
- // Interval
- setInterval(function() {
- update(Math.random() * 100);
- }, 1500);
- // Update
- function update(v) {
- v = d3.format('.0f')(v);
- foreground.transition()
- .duration(750)
- .style('fill', function() {
- return color(v);
- })
- .call(arcTween, v);
- value.transition()
- .duration(750)
- .call(textTween, v);
- }
- // Arc
- function arcTween(transition, v) {
- var newAngle = v / 100 * Math.PI - Math.PI / 2;
- transition.attrTween('d', function(d) {
- var interpolate = d3.interpolate(d.endAngle, newAngle);
- return function(t) {
- d.endAngle = interpolate(t);
- return arc(d);
- };
- });
- }
- // Text
- function textTween(transition, v) {
- transition.tween('text', function() {
- var interpolate = d3.interpolate(this.innerHTML, v),
- split = (v + '').split('.'),
- round = (split.length > 1) ? Math.pow(10, split[1].length) : 1;
- return function(t) {
- this.innerHTML = d3.format('.0f')(Math.round(interpolate(t) * round) / round) + '<tspan>%</tspan>';
- };
- });
- }
- }
- };
- // Rounded progress - single arc
- var _roundedProgressSingle = function(element, size, goal, color) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Add random data
- var dataset = function () {
- return [
- {percentage: Math.random() * 100}
- ];
- };
- // Main variables
- var d3Container = d3.select(element),
- padding = 2,
- strokeWidth = 16,
- width = size,
- height = size,
- τ = 2 * Math.PI;
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append("svg");
-
- // Add SVG group
- var svg = container
- .attr("width", width)
- .attr("height", height)
- .append("g")
- .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
- // Construct chart layout
- // ------------------------------
- // Foreground arc
- var arc = d3.svg.arc()
- .startAngle(0)
- .endAngle(function (d) {
- return d.percentage / 100 * τ;
- })
- .innerRadius((size / 2) - strokeWidth)
- .outerRadius((size / 2) - padding)
- .cornerRadius(20);
- // Background arc
- var background = d3.svg.arc()
- .startAngle(0)
- .endAngle(τ)
- .innerRadius((size / 2) - strokeWidth)
- .outerRadius((size / 2) - padding);
- // Append chart elements
- // ------------------------------
- //
- // Group arc elements
- //
- // Group
- var field = svg.selectAll("g")
- .data(dataset)
- .enter().append("g");
- // Foreground arc
- field
- .append("path")
- .attr("class", "arc-foreground")
- .attr('fill', color);
- // Background arc
- field
- .append("path")
- .attr("d", background)
- .style({
- "fill": color,
- "opacity": 0.2
- });
- //
- // Text
- //
- // Goal
- field
- .append("text")
- .text("Out of " + goal)
- .attr("transform", "translate(0,20)")
- .style({
- 'font-size': 11,
- 'fill': '#999',
- 'font-weight': 500,
- 'text-transform': 'uppercase',
- 'text-anchor': 'middle'
- });
- // Count
- field
- .append("text")
- .attr('class', 'arc-goal-completed')
- .attr("transform", "translate(0,0)")
- .style({
- 'font-size': 23,
- 'font-weight': 500,
- 'text-anchor': 'middle'
- });
- //
- // Animate elements
- //
- // Add transition
- d3.transition().duration(2500).each(update);
- // Animation
- function update() {
- field = field
- .each(function (d) {
- this._value = d.percentage;
- })
- .data(dataset)
- .each(function (d) {
- d.previousValue = this._value;
- });
- // Foreground arc
- field
- .select(".arc-foreground")
- .transition()
- .duration(600)
- .ease("easeInOut")
- .attrTween("d", arcTween);
-
- // Update count text
- field
- .select(".arc-goal-completed")
- .text(function (d) {
- return Math.round(d.percentage /100 * goal);
- });
- // Animate count text
- svg.select('.arc-goal-completed')
- .transition()
- .duration(600)
- .tween("text", function(d) {
- var i = d3.interpolate(this.textContent, d.percentage);
- return function(t) {
- this.textContent = Math.floor(d.percentage/100 * goal);
- };
- });
- // Update every 4 seconds (for demo)
- setTimeout(update, 4000);
- }
- // Arc animation
- function arcTween(d) {
- var i = d3.interpolateNumber(d.previousValue, d.percentage);
- return function (t) {
- d.percentage = i(t);
- return arc(d);
- };
- }
- }
- };
- // Rounded progress - multiple arcs
- var _roundedProgressMultiple = function(element, size) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Add random data
- var data = [
- {index: 0, name: 'Memory', percentage: 0},
- {index: 1, name: 'CPU', percentage: 0},
- {index: 2, name: 'Sessions', percentage: 0}
- ];
- // Main variables
- var d3Container = d3.select(element),
- padding = 2,
- strokeWidth = 8,
- width = size,
- height = size,
- τ = 2 * Math.PI;
- // Colors
- var colors = ['#78909C', '#F06292', '#4DB6AC'];
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append("svg");
-
- // Add SVG group
- var svg = container
- .attr("width", width)
- .attr("height", height)
- .append("g")
- .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
- // Construct chart layout
- // ------------------------------
- // Foreground arc
- var arc = d3.svg.arc()
- .startAngle(0)
- .endAngle(function (d) {
- return d.percentage / 100 * τ;
- })
- .innerRadius(function (d) {
- return (size / 2) - d.index * (strokeWidth + padding);
- })
- .outerRadius(function (d) {
- return ((size / 2) - d.index * (strokeWidth + padding)) - strokeWidth;
- })
- .cornerRadius(20);
- // Background arc
- var background = d3.svg.arc()
- .startAngle(0)
- .endAngle(τ)
- .innerRadius(function (d) {
- return (size / 2) - d.index * (strokeWidth + padding);
- })
- .outerRadius(function (d) {
- return ((size / 2) - d.index * (strokeWidth + padding)) - strokeWidth;
- });
- // Append chart elements
- // ------------------------------
- //
- // Group arc elements
- //
- // Group
- var field = svg.selectAll("g")
- .data(data)
- .enter().append("g");
- // Foreground arcs
- field
- .append("path")
- .attr("class", "arc-foreground")
- .style("fill", function (d, i) {
- return colors[i];
- });
- // Background arcs
- field
- .append("path")
- .style("fill", function (d, i) {
- return colors[i];
- })
- .style("opacity", 0.1)
- .attr("d", background);
- //
- // Add legend
- //
- // Append list
- var legend = d3.select(element)
- .append('ul')
- .attr('class', 'chart-widget-legend text-muted')
- .selectAll('li')
- .data(data)
- .enter()
- .append('li')
- .attr('data-slice', function(d, i) {
- return i;
- })
- .attr('style', function(d, i) {
- return 'border-bottom: solid 2px ' + colors[i];
- })
- .text(function(d, i) {
- return d.name;
- });
- //
- // Animate elements
- //
- // Add transition
- d3.transition().each(update);
- // Animation
- function update() {
- field = field
- .each(function (d) {
- this._value = d.percentage;
- })
- .data(data)
- .each(function (d) {
- d.previousValue = this._value;
- d.percentage = Math.round(Math.random() * 100) + 1;
- });
- // Foreground arcs
- field
- .select("path.arc-foreground")
- .transition()
- .duration(750)
- .ease("easeInOut")
- .attrTween("d", arcTween);
-
- // Update every 4 seconds
- setTimeout(update, 4000);
- }
- // Arc animation
- function arcTween(d) {
- var i = d3.interpolateNumber(d.previousValue, d.percentage);
- return function (t) {
- d.percentage = i(t);
- return arc(d);
- };
- }
- }
- };
- // Pie with progress bar
- var _pieWithProgress = function(element, size) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Demo dataset
- var dataset = [
- { name: 'New', count: 639 },
- { name: 'Pending', count: 255 },
- { name: 'Shipped', count: 215 }
- ];
- // Main variables
- var d3Container = d3.select(element),
- total = 0,
- width = size,
- height = size,
- progressSpacing = 6,
- progressSize = (progressSpacing + 2),
- arcSize = 20,
- outerRadius = (width / 2),
- innerRadius = (outerRadius - arcSize);
- // Colors
- var color = d3.scale.ordinal()
- .range(['#EF5350', '#29b6f6', '#66BB6A']);
- // Create chart
- // ------------------------------
- // Add svg element
- var container = d3Container.append("svg");
-
- // Add SVG group
- var svg = container
- .attr("width", width)
- .attr("height", height)
- .append("g")
- .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
- // Construct chart layout
- // ------------------------------
- // Add dataset
- dataset.forEach(function(d){
- total+= d.count;
- });
- // Pie layout
- var pie = d3.layout.pie()
- .value(function(d){ return d.count; })
- .sort(null);
- // Inner arc
- var arc = d3.svg.arc()
- .innerRadius(innerRadius)
- .outerRadius(outerRadius);
- // Line arc
- var arcLine = d3.svg.arc()
- .innerRadius(innerRadius - progressSize)
- .outerRadius(innerRadius - progressSpacing)
- .startAngle(0);
- // Append chart elements
- // ------------------------------
- //
- // Animations
- //
- var arcTween = function(transition, newAngle) {
- transition.attrTween("d", function (d) {
- var interpolate = d3.interpolate(d.endAngle, newAngle);
- var interpolateCount = d3.interpolate(0, dataset[0].count);
- return function (t) {
- d.endAngle = interpolate(t);
- middleCount.text(d3.format(",d")(Math.floor(interpolateCount(t))));
- return arcLine(d);
- };
- });
- };
- //
- // Donut paths
- //
- // Donut
- var path = svg.selectAll('path')
- .data(pie(dataset))
- .enter()
- .append('path')
- .attr('d', arc)
- .attr('fill', function(d, i) {
- return color(d.data.name);
- })
- .style({
- 'stroke': '#fff',
- 'stroke-width': 2,
- 'cursor': 'pointer'
- });
- // Animate donut
- path
- .transition()
- .delay(function(d, i) { return i; })
- .duration(600)
- .attrTween("d", function(d) {
- var interpolate = d3.interpolate(d.startAngle, d.endAngle);
- return function(t) {
- d.endAngle = interpolate(t);
- return arc(d);
- };
- });
- //
- // Line path
- //
- // Line
- var pathLine = svg.append('path')
- .datum({endAngle: 0})
- .attr('d', arcLine)
- .style({
- fill: color('New')
- });
- // Line animation
- pathLine.transition()
- .duration(600)
- .delay(300)
- .call(arcTween, (2 * Math.PI) * (dataset[0].count / total));
- //
- // Add count text
- //
- var middleCount = svg.append('text')
- .datum(0)
- .attr('dy', 6)
- .style({
- 'font-size': '21px',
- 'font-weight': 500,
- 'text-anchor': 'middle'
- })
- .text(function(d){
- return d;
- });
- //
- // Add interactions
- //
- // Mouse
- path
- .on('mouseover', function(d, i) {
- $(element + ' [data-slice]').css({
- 'opacity': 0.3,
- 'transition': 'all ease-in-out 0.15s'
- });
- $(element + ' [data-slice=' + i + ']').css({'opacity': 1});
- })
- .on('mouseout', function(d, i) {
- $(element + ' [data-slice]').css('opacity', 1);
- });
- //
- // Add legend
- //
- // Append list
- var legend = d3.select(element)
- .append('ul')
- .attr('class', 'chart-widget-legend')
- .selectAll('li')
- .data(pie(dataset))
- .enter()
- .append('li')
- .attr('data-slice', function(d, i) {
- return i;
- })
- .attr('style', function(d, i) {
- return 'border-bottom: solid 2px ' + color(d.data.name);
- })
- .text(function(d, i) {
- return d.data.name + ': ';
- });
- // Append legend text
- legend.append('span')
- .text(function(d, i) {
- return d.data.count;
- });
- }
- };
- // Segmented gauge
- var _segmentedGauge = function(element, size, min, max, sliceQty) {
- if (typeof d3 == 'undefined') {
- console.warn('Warning - d3.min.js is not loaded.');
- return;
- }
- // Initialize chart only if element exsists in the DOM
- if(element) {
- // Main variables
- var d3Container = d3.select(element),
- width = size,
- height = (size / 2) + 20,
- radius = (size / 2),
- ringInset = 15,
- ringWidth = 20,
- pointerWidth = 10,
- pointerTailLength = 5,
- pointerHeadLengthPercent = 0.75,
-
- minValue = min,
- maxValue = max,
-
- minAngle = -90,
- maxAngle = 90,
-
- slices = sliceQty,
- range = maxAngle - minAngle,
- pointerHeadLength = Math.round(radius * pointerHeadLengthPercent);
- // Colors
- var colors = d3.scale.linear()
- .domain([0, slices - 1])
- .interpolate(d3.interpolateHsl)
- .range(['#66BB6A', '#EF5350']);
- // Create chart
- // ------------------------------
- // Add SVG element
- var container = d3Container.append('svg');
- // Add SVG group
- var svg = container
- .attr('width', width)
- .attr('height', height);
- // Construct chart layout
- // ------------------------------
-
- // Donut
- var arc = d3.svg.arc()
- .innerRadius(radius - ringWidth - ringInset)
- .outerRadius(radius - ringInset)
- .startAngle(function(d, i) {
- var ratio = d * i;
- return deg2rad(minAngle + (ratio * range));
- })
- .endAngle(function(d, i) {
- var ratio = d * (i + 1);
- return deg2rad(minAngle + (ratio * range));
- });
- // Linear scale that maps domain values to a percent from 0..1
- var scale = d3.scale.linear()
- .range([0, 1])
- .domain([minValue, maxValue]);
-
- // Ticks
- var ticks = scale.ticks(slices);
- var tickData = d3.range(slices)
- .map(function() {
- return 1 / slices;
- });
- // Calculate angles
- function deg2rad(deg) {
- return deg * Math.PI / 180;
- }
-
- // Calculate rotation angle
- function newAngle(d) {
- var ratio = scale(d);
- var newAngle = minAngle + (ratio * range);
- return newAngle;
- }
- // Append chart elements
- // ------------------------------
- //
- // Append arc
- //
- // Wrap paths in separate group
- var arcs = svg.append('g')
- .attr('transform', "translate(" + radius + "," + radius + ")")
- .style({
- 'stroke': '#fff',
- 'stroke-width': 2,
- 'shape-rendering': 'crispEdges'
- });
- // Add paths
- arcs.selectAll('path')
- .data(tickData)
- .enter()
- .append('path')
- .attr('fill', function(d, i) {
- return colors(i);
- })
- .attr('d', arc);
- //
- // Text labels
- //
- // Wrap text in separate group
- var arcLabels = svg.append('g')
- .attr('transform', "translate(" + radius + "," + radius + ")");
- // Add text
- arcLabels.selectAll('text')
- .data(ticks)
- .enter()
- .append('text')
- .attr('transform', function(d) {
- var ratio = scale(d);
- var newAngle = minAngle + (ratio * range);
- return 'rotate(' + newAngle + ') translate(0,' + (10 - radius) + ')';
- })
- .style({
- 'text-anchor': 'middle',
- 'font-size': 11,
- 'fill': '#999'
- })
- .text(function(d) { return d + "%"; });
- //
- // Pointer
- //
- // Line data
- var lineData = [
- [pointerWidth / 2, 0],
- [0, -pointerHeadLength],
- [-(pointerWidth / 2), 0],
- [0, pointerTailLength],
- [pointerWidth / 2, 0]
- ];
- // Create line
- var pointerLine = d3.svg.line()
- .interpolate('monotone');
- // Wrap all lines in separate group
- var pointerGroup = svg
- .append('g')
- .data([lineData])
- .attr('transform', "translate(" + radius + "," + radius + ")");
- // Paths
- pointer = pointerGroup
- .append('path')
- .attr('d', pointerLine)
- .attr('transform', 'rotate(' + minAngle + ')');
- // Random update
- // ------------------------------
- // Update values
- function update() {
- var ratio = scale(Math.random() * max);
- var newAngle = minAngle + (ratio * range);
- pointer.transition()
- .duration(2500)
- .ease('elastic')
- .attr('transform', 'rotate(' + newAngle + ')');
- }
- update();
- // Update values every 5 seconds
- setInterval(function() {
- update();
- }, 5000);
- }
- };
- //
- // Return objects assigned to module
- //
- return {
- init: function() {
- _areaChartWidget("#chart_area_basic", 50, '#5C6BC0');
- _areaChartWidget("#chart_area_color", 50, 'rgba(255,255,255,0.75)');
- _barChartWidget("#chart_bar_basic", 24, 50, true, "elastic", 1200, 50, "#EF5350", "members");
- _barChartWidget("#chart_bar_color", 24, 50, true, "elastic", 1200, 50, "rgba(255,255,255,0.75)", "members");
- _lineChartWidget('#line_chart_simple', 50, '#2196F3', 'rgba(33,150,243,0.5)', '#2196F3', '#fff');
- _lineChartWidget('#line_chart_color', 50, '#fff', 'rgba(255,255,255,0.5)', '#fff', '#29B6F6');
- _sparklinesWidget("#sparklines_basic", "area", 30, 50, "basis", 750, 2000, "#66BB6A");
- _sparklinesWidget("#sparklines_color", "area", 30, 50, "basis", 750, 2000, "rgba(255,255,255,0.75)");
- _progressIcon('#progress_icon_one', 42, 2.5, "#eee", "#EF5350", 0.68, "icon-heart6");
- _progressIcon('#progress_icon_two', 42, 2.5, "#eee", "#5C6BC0", 0.82, "icon-trophy3");
- _progressIcon('#progress_icon_three', 42, 2.5, "#00897B", "#fff", 0.73, "icon-bag");
- _progressIcon('#progress_icon_four', 42, 2.5, "#673AB7", "#fff", 0.49, "icon-truck");
- _progressPercentage('#progress_percentage_one', 46, 3, "#eee", "#2196F3", 0.79);
- _progressPercentage('#progress_percentage_two', 46, 3, "#eee", "#EF5350", 0.62);
- _progressPercentage('#progress_percentage_three', 46, 3, "#039BE5", "#fff", 0.69);
- _progressPercentage('#progress_percentage_four', 46, 3, "#E53935", "#fff", 0.43);
- _animatedPie("#pie_basic", 120);
- _animatedPieWithLegend("#pie_basic_legend", 120);
- _pieArcWithLegend("#pie_arc_legend", 170);
- _animatedDonut("#donut_basic_stats", 120);
- _animatedDonutWithLegend("#donut_basic_legend", 120);
- _donutWithDetails("#donut_basic_details", 146);
- _progressArcSingle("#arc_single", 78);
- _progressArcMulti("#arc_multi", 78, 700);
- _roundedProgressSingle("#rounded_progress_single", 150, 700, '#EC407A');
- _roundedProgressMultiple("#rounded_progress_multiple", 140);
- _pieWithProgress("#pie_progress_bar", 146);
- _segmentedGauge("#segmented_gauge", 200, 0, 100, 5);
- }
- }
- }();
- // Initialize module
- // ------------------------------
- // When content loaded
- document.addEventListener('DOMContentLoaded', function() {
- StatisticWidgets.init();
- });
|