donuts.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. /* ------------------------------------------------------------------------------
  2. *
  3. * # D3.js - horizontal bar chart
  4. *
  5. * Demo d3.js horizontal bar chart setup with .csv data source
  6. *
  7. * ---------------------------------------------------------------------------- */
  8. // Setup module
  9. // ------------------------------
  10. var DashboardDonuts = function() {
  11. //
  12. // Setup module components
  13. //
  14. // Marketing campaigns donut chart
  15. var _MarketingCampaignsDonutChart = function(element, size) {
  16. if (typeof d3 == 'undefined') {
  17. console.warn('Warning - d3.min.js is not loaded.');
  18. return;
  19. }
  20. // Initialize chart only if element exsists in the DOM
  21. if($(element).length > 0) {
  22. // Basic setup
  23. // ------------------------------
  24. // Add data set
  25. var data = [
  26. {
  27. "browser": "Google Adwords",
  28. "icon": "<i class='icon-google mr-2'></i>",
  29. "value": 1047
  30. }, {
  31. "browser": "Social media",
  32. "icon": "<i class='icon-share4 mr-2'></i>",
  33. "value": 2948
  34. }, {
  35. "browser": "Youtube video",
  36. "icon": "<i class='icon-youtube mr-2'></i>",
  37. "value": 3909
  38. }
  39. ];
  40. // Main variables
  41. var d3Container = d3.select(element),
  42. distance = 2, // reserve 2px space for mouseover arc moving
  43. radius = (size/2) - distance,
  44. sum = d3.sum(data, function(d) { return d.value; });
  45. // Colors
  46. var colorrange = ['#66BB6A','#9575CD','#FF7043'];
  47. // Tooltip
  48. // ------------------------------
  49. var tip = d3.tip()
  50. .attr('class', 'd3-tip')
  51. .offset([-10, 0])
  52. .direction('e')
  53. .html(function (d) {
  54. return '<ul class="list-unstyled mb-1">' +
  55. '<li>' + '<div class="font-size-base mb-1 mt-1">' + d.data.icon + d.data.browser + '</div>' + '</li>' +
  56. '<li>' + 'Visits: &nbsp;' + '<span class="font-weight-semibold float-right">' + d.value + '</span>' + '</li>' +
  57. '<li>' + 'Share: &nbsp;' + '<span class="font-weight-semibold float-right">' + (100 / (sum / d.value)).toFixed(2) + '%' + '</span>' + '</li>' +
  58. '</ul>';
  59. });
  60. // Create chart
  61. // ------------------------------
  62. // Add svg element
  63. var container = d3Container.append('svg').call(tip);
  64. // Add SVG group
  65. var svg = container
  66. .attr('width', size)
  67. .attr('height', size)
  68. .append('g')
  69. .attr('transform', 'translate(' + (size / 2) + ',' + (size / 2) + ')');
  70. // Construct chart layout
  71. // ------------------------------
  72. // Pie
  73. var pie = d3.layout.pie()
  74. .sort(null)
  75. .startAngle(Math.PI)
  76. .endAngle(3 * Math.PI)
  77. .value(function (d) {
  78. return d.value;
  79. });
  80. // Arc
  81. var arc = d3.svg.arc()
  82. .outerRadius(radius)
  83. .innerRadius(radius / 2);
  84. // Colors
  85. var colors = d3.scale.ordinal().range(colorrange);
  86. //
  87. // Append chart elements
  88. //
  89. // Group chart elements
  90. var arcGroup = svg.selectAll('.d3-arc')
  91. .data(pie(data))
  92. .enter()
  93. .append('g')
  94. .attr('class', 'd3-arc d3-slice-border')
  95. .style('cursor', 'pointer');
  96. // Append path
  97. var arcPath = arcGroup
  98. .append('path')
  99. .style('fill', function (d) { return colors(d.data.value); });
  100. // Add tooltip
  101. arcPath
  102. .on('mouseover', function (d, i) {
  103. // Transition on mouseover
  104. d3.select(this)
  105. .transition()
  106. .duration(500)
  107. .ease('elastic')
  108. .attr('transform', function (d) {
  109. d.midAngle = ((d.endAngle - d.startAngle) / 2) + d.startAngle;
  110. var x = Math.sin(d.midAngle) * distance;
  111. var y = -Math.cos(d.midAngle) * distance;
  112. return 'translate(' + x + ',' + y + ')';
  113. });
  114. })
  115. .on('mousemove', function (d) {
  116. // Show tooltip on mousemove
  117. tip.show(d)
  118. .style('top', (d3.event.pageY - 40) + 'px')
  119. .style('left', (d3.event.pageX + 30) + 'px');
  120. })
  121. .on('mouseout', function (d, i) {
  122. // Mouseout transition
  123. d3.select(this)
  124. .transition()
  125. .duration(500)
  126. .ease('bounce')
  127. .attr('transform', 'translate(0,0)');
  128. // Hide tooltip
  129. tip.hide(d);
  130. });
  131. // Animate chart on load
  132. arcPath
  133. .transition()
  134. .delay(function(d, i) { return i * 500; })
  135. .duration(500)
  136. .attrTween('d', function(d) {
  137. var interpolate = d3.interpolate(d.startAngle,d.endAngle);
  138. return function(t) {
  139. d.endAngle = interpolate(t);
  140. return arc(d);
  141. };
  142. });
  143. }
  144. };
  145. // Campaign status donut chart
  146. var _CampaignStatusDonutChart = function(element, size) {
  147. if (typeof d3 == 'undefined') {
  148. console.warn('Warning - d3.min.js is not loaded.');
  149. return;
  150. }
  151. // Initialize chart only if element exsists in the DOM
  152. if($(element).length > 0) {
  153. // Basic setup
  154. // ------------------------------
  155. // Add data set
  156. var data = [
  157. {
  158. "status": "Active campaigns",
  159. "icon": "<i class='icon-checkmark3 text-success mr-2'></i>",
  160. "value": 439
  161. }, {
  162. "status": "Closed campaigns",
  163. "icon": "<i class='icon-cross2 text-danger mr-2'></i>",
  164. "value": 290
  165. }, {
  166. "status": "Pending campaigns",
  167. "icon": "<i class='icon-history text-blue mr-2'></i>",
  168. "value": 190
  169. }, {
  170. "status": "Campaigns on hold",
  171. "icon": "<i class='icon-infinite text-grey mr-2'></i>",
  172. "value": 148
  173. }
  174. ];
  175. // Main variables
  176. var d3Container = d3.select(element),
  177. distance = 2, // reserve 2px space for mouseover arc moving
  178. radius = (size/2) - distance,
  179. sum = d3.sum(data, function(d) { return d.value; });
  180. // Colors
  181. var colorrange = ['#29B6F6', '#EF5350', '#81C784', '#999'];
  182. // Tooltip
  183. // ------------------------------
  184. var tip = d3.tip()
  185. .attr('class', 'd3-tip')
  186. .offset([-10, 0])
  187. .direction('e')
  188. .html(function (d) {
  189. return '<ul class="list-unstyled mb-1">' +
  190. '<li>' + '<div class="font-size-base mb-1 mt-1">' + d.data.icon + d.data.status + '</div>' + '</li>' +
  191. '<li>' + 'Total: &nbsp;' + '<span class="font-weight-semibold float-right">' + d.value + '</span>' + '</li>' +
  192. '<li>' + 'Share: &nbsp;' + '<span class="font-weight-semibold float-right">' + (100 / (sum / d.value)).toFixed(2) + '%' + '</span>' + '</li>' +
  193. '</ul>';
  194. });
  195. // Create chart
  196. // ------------------------------
  197. // Add svg element
  198. var container = d3Container.append('svg').call(tip);
  199. // Add SVG group
  200. var svg = container
  201. .attr('width', size)
  202. .attr('height', size)
  203. .append('g')
  204. .attr('transform', 'translate(' + (size / 2) + ',' + (size / 2) + ')');
  205. // Construct chart layout
  206. // ------------------------------
  207. // Pie
  208. var pie = d3.layout.pie()
  209. .sort(null)
  210. .startAngle(Math.PI)
  211. .endAngle(3 * Math.PI)
  212. .value(function (d) {
  213. return d.value;
  214. });
  215. // Arc
  216. var arc = d3.svg.arc()
  217. .outerRadius(radius)
  218. .innerRadius(radius / 2);
  219. // Colors
  220. var colors = d3.scale.ordinal().range(colorrange);
  221. //
  222. // Append chart elements
  223. //
  224. // Group chart elements
  225. var arcGroup = svg.selectAll('.d3-arc')
  226. .data(pie(data))
  227. .enter()
  228. .append('g')
  229. .attr('class', 'd3-arc d3-slice-border')
  230. .style('cursor', 'pointer');
  231. // Append path
  232. var arcPath = arcGroup
  233. .append('path')
  234. .style('fill', function (d) { return colors(d.data.value); });
  235. // Add tooltip
  236. arcPath
  237. .on('mouseover', function (d, i) {
  238. // Transition on mouseover
  239. d3.select(this)
  240. .transition()
  241. .duration(500)
  242. .ease('elastic')
  243. .attr('transform', function (d) {
  244. d.midAngle = ((d.endAngle - d.startAngle) / 2) + d.startAngle;
  245. var x = Math.sin(d.midAngle) * distance;
  246. var y = -Math.cos(d.midAngle) * distance;
  247. return 'translate(' + x + ',' + y + ')';
  248. });
  249. })
  250. .on('mousemove', function (d) {
  251. // Show tooltip on mousemove
  252. tip.show(d)
  253. .style('top', (d3.event.pageY - 40) + 'px')
  254. .style('left', (d3.event.pageX + 30) + 'px');
  255. })
  256. .on('mouseout', function (d, i) {
  257. // Mouseout transition
  258. d3.select(this)
  259. .transition()
  260. .duration(500)
  261. .ease('bounce')
  262. .attr('transform', 'translate(0,0)');
  263. // Hide tooltip
  264. tip.hide(d);
  265. });
  266. // Animate chart on load
  267. arcPath
  268. .transition()
  269. .delay(function(d, i) { return i * 500; })
  270. .duration(500)
  271. .attrTween('d', function(d) {
  272. var interpolate = d3.interpolate(d.startAngle,d.endAngle);
  273. return function(t) {
  274. d.endAngle = interpolate(t);
  275. return arc(d);
  276. };
  277. });
  278. }
  279. };
  280. // Tickets status donut chart
  281. var _TicketStatusDonutChart = function(element, size) {
  282. if (typeof d3 == 'undefined') {
  283. console.warn('Warning - d3.min.js is not loaded.');
  284. return;
  285. }
  286. // Initialize chart only if element exsists in the DOM
  287. if($(element).length > 0) {
  288. // Basic setup
  289. // ------------------------------
  290. // Add data set
  291. var data = [
  292. {
  293. "status": "Pending tickets",
  294. "icon": "<i class='icon-history text-blue mr-2'></i>",
  295. "value": 295
  296. }, {
  297. "status": "Resolved tickets",
  298. "icon": "<i class='icon-checkmark3 text-success mr-2'></i>",
  299. "value": 189
  300. }, {
  301. "status": "Closed tickets",
  302. "icon": "<i class='icon-cross2 text-danger mr-2'></i>",
  303. "value": 277
  304. }
  305. ];
  306. // Main variables
  307. var d3Container = d3.select(element),
  308. distance = 2, // reserve 2px space for mouseover arc moving
  309. radius = (size/2) - distance,
  310. sum = d3.sum(data, function(d) { return d.value; });
  311. // Colors
  312. var colorrange = ['#29B6F6','#66BB6A','#EF5350'];
  313. // Tooltip
  314. // ------------------------------
  315. var tip = d3.tip()
  316. .attr('class', 'd3-tip')
  317. .offset([-10, 0])
  318. .direction('e')
  319. .html(function (d) {
  320. return '<ul class="list-unstyled mb-1">' +
  321. '<li>' + '<div class="font-size-base mb-1 mt-1">' + d.data.icon + d.data.status + '</div>' + '</li>' +
  322. '<li>' + 'Total: &nbsp;' + '<span class="font-weight-semibold float-right">' + d.value + '</span>' + '</li>' +
  323. '<li>' + 'Share: &nbsp;' + '<span class="font-weight-semibold float-right">' + (100 / (sum / d.value)).toFixed(2) + '%' + '</span>' + '</li>' +
  324. '</ul>';
  325. });
  326. // Create chart
  327. // ------------------------------
  328. // Add svg element
  329. var container = d3Container.append('svg').call(tip);
  330. // Add SVG group
  331. var svg = container
  332. .attr('width', size)
  333. .attr('height', size)
  334. .append('g')
  335. .attr('transform', 'translate(' + (size / 2) + ',' + (size / 2) + ')');
  336. // Construct chart layout
  337. // ------------------------------
  338. // Pie
  339. var pie = d3.layout.pie()
  340. .sort(null)
  341. .startAngle(Math.PI)
  342. .endAngle(3 * Math.PI)
  343. .value(function (d) {
  344. return d.value;
  345. });
  346. // Arc
  347. var arc = d3.svg.arc()
  348. .outerRadius(radius)
  349. .innerRadius(radius / 2);
  350. // Colors
  351. var colors = d3.scale.ordinal().range(colorrange);
  352. //
  353. // Append chart elements
  354. //
  355. // Group chart elements
  356. var arcGroup = svg.selectAll('.d3-arc')
  357. .data(pie(data))
  358. .enter()
  359. .append('g')
  360. .attr('class', 'd3-arc d3-slice-border')
  361. .style('cursor', 'pointer');
  362. // Append path
  363. var arcPath = arcGroup
  364. .append('path')
  365. .style('fill', function (d) { return colors(d.data.value); });
  366. // Add tooltip
  367. arcPath
  368. .on('mouseover', function (d, i) {
  369. // Transition on mouseover
  370. d3.select(this)
  371. .transition()
  372. .duration(500)
  373. .ease('elastic')
  374. .attr('transform', function (d) {
  375. d.midAngle = ((d.endAngle - d.startAngle) / 2) + d.startAngle;
  376. var x = Math.sin(d.midAngle) * distance;
  377. var y = -Math.cos(d.midAngle) * distance;
  378. return 'translate(' + x + ',' + y + ')';
  379. });
  380. })
  381. .on('mousemove', function (d) {
  382. // Show tooltip on mousemove
  383. tip.show(d)
  384. .style('top', (d3.event.pageY - 40) + 'px')
  385. .style('left', (d3.event.pageX + 30) + 'px');
  386. })
  387. .on('mouseout', function (d, i) {
  388. // Mouseout transition
  389. d3.select(this)
  390. .transition()
  391. .duration(500)
  392. .ease('bounce')
  393. .attr('transform', 'translate(0,0)');
  394. // Hide tooltip
  395. tip.hide(d);
  396. });
  397. // Animate chart on load
  398. arcPath
  399. .transition()
  400. .delay(function(d, i) { return i * 500; })
  401. .duration(500)
  402. .attrTween('d', function(d) {
  403. var interpolate = d3.interpolate(d.startAngle,d.endAngle);
  404. return function(t) {
  405. d.endAngle = interpolate(t);
  406. return arc(d);
  407. };
  408. });
  409. }
  410. };
  411. //
  412. // Return objects assigned to module
  413. //
  414. return {
  415. init: function() {
  416. _MarketingCampaignsDonutChart('#campaigns-donut', 42);
  417. _CampaignStatusDonutChart('#campaign-status-pie', 42);
  418. _TicketStatusDonutChart('#tickets-status', 42);
  419. }
  420. }
  421. }();
  422. // Initialize module
  423. // ------------------------------
  424. document.addEventListener('DOMContentLoaded', function() {
  425. DashboardDonuts.init();
  426. });