bars.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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 DashboardBars = function() {
  11. //
  12. // Setup module components
  13. //
  14. // Bar charts
  15. var _BarChart = function(element, barQty, height, animate, easing, duration, delay, color, tooltip) {
  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 bardata = [];
  26. for (var i=0; i < barQty; i++) {
  27. bardata.push(Math.round(Math.random()*10) + 10);
  28. }
  29. // Main variables
  30. var d3Container = d3.select(element),
  31. width = d3Container.node().getBoundingClientRect().width;
  32. // Construct scales
  33. // ------------------------------
  34. // Horizontal
  35. var x = d3.scale.ordinal()
  36. .rangeBands([0, width], 0.3);
  37. // Vertical
  38. var y = d3.scale.linear()
  39. .range([0, height]);
  40. // Set input domains
  41. // ------------------------------
  42. // Horizontal
  43. x.domain(d3.range(0, bardata.length));
  44. // Vertical
  45. y.domain([0, d3.max(bardata)]);
  46. // Create chart
  47. // ------------------------------
  48. // Add svg element
  49. var container = d3Container.append('svg');
  50. // Add SVG group
  51. var svg = container
  52. .attr('width', width)
  53. .attr('height', height)
  54. .append('g');
  55. //
  56. // Append chart elements
  57. //
  58. // Bars
  59. var bars = svg.selectAll('rect')
  60. .data(bardata)
  61. .enter()
  62. .append('rect')
  63. .attr('class', 'd3-random-bars')
  64. .attr('width', x.rangeBand())
  65. .attr('x', function(d,i) {
  66. return x(i);
  67. })
  68. .style('fill', color);
  69. // Tooltip
  70. // ------------------------------
  71. var tip = d3.tip()
  72. .attr('class', 'd3-tip')
  73. .offset([-10, 0]);
  74. // Show and hide
  75. if(tooltip == 'hours' || tooltip == 'goal' || tooltip == 'members') {
  76. bars.call(tip)
  77. .on('mouseover', tip.show)
  78. .on('mouseout', tip.hide);
  79. }
  80. // Daily meetings tooltip content
  81. if(tooltip == 'hours') {
  82. tip.html(function (d, i) {
  83. return '<div class="text-center">' +
  84. '<h6 class="m-0">' + d + '</h6>' +
  85. '<span class="font-size-sm">meetings</span>' +
  86. '<div class="font-size-sm">' + i + ':00' + '</div>' +
  87. '</div>'
  88. });
  89. }
  90. // Statements tooltip content
  91. if(tooltip == 'goal') {
  92. tip.html(function (d, i) {
  93. return '<div class="text-center">' +
  94. '<h6 class="m-0">' + d + '</h6>' +
  95. '<span class="font-size-sm">statements</span>' +
  96. '<div class="font-size-sm">' + i + ':00' + '</div>' +
  97. '</div>'
  98. });
  99. }
  100. // Online members tooltip content
  101. if(tooltip == 'members') {
  102. tip.html(function (d, i) {
  103. return '<div class="text-center">' +
  104. '<h6 class="m-0">' + d + '0' + '</h6>' +
  105. '<span class="font-size-sm">members</span>' +
  106. '<div class="font-size-sm">' + i + ':00' + '</div>' +
  107. '</div>'
  108. });
  109. }
  110. // Bar loading animation
  111. // ------------------------------
  112. // Choose between animated or static
  113. if(animate) {
  114. withAnimation();
  115. } else {
  116. withoutAnimation();
  117. }
  118. // Animate on load
  119. function withAnimation() {
  120. bars
  121. .attr('height', 0)
  122. .attr('y', height)
  123. .transition()
  124. .attr('height', function(d) {
  125. return y(d);
  126. })
  127. .attr('y', function(d) {
  128. return height - y(d);
  129. })
  130. .delay(function(d, i) {
  131. return i * delay;
  132. })
  133. .duration(duration)
  134. .ease(easing);
  135. }
  136. // Load without animation
  137. function withoutAnimation() {
  138. bars
  139. .attr('height', function(d) {
  140. return y(d);
  141. })
  142. .attr('y', function(d) {
  143. return height - y(d);
  144. })
  145. }
  146. // Resize chart
  147. // ------------------------------
  148. // Call function on window resize
  149. window.addEventListener('resize', barsResize);
  150. // Call function on sidebar width change
  151. var sidebarToggle = document.querySelector('.sidebar-control');
  152. sidebarToggle && sidebarToggle.addEventListener('click', barsResize);
  153. // Resize function
  154. //
  155. // Since D3 doesn't support SVG resize by default,
  156. // we need to manually specify parts of the graph that need to
  157. // be updated on window resize
  158. function barsResize() {
  159. // Layout variables
  160. width = d3Container.node().getBoundingClientRect().width;
  161. // Layout
  162. // -------------------------
  163. // Main svg width
  164. container.attr('width', width);
  165. // Width of appended group
  166. svg.attr('width', width);
  167. // Horizontal range
  168. x.rangeBands([0, width], 0.3);
  169. // Chart elements
  170. // -------------------------
  171. // Bars
  172. svg.selectAll('.d3-random-bars')
  173. .attr('width', x.rangeBand())
  174. .attr('x', function(d,i) {
  175. return x(i);
  176. });
  177. }
  178. }
  179. };
  180. //
  181. // Return objects assigned to module
  182. //
  183. return {
  184. init: function() {
  185. _BarChart('#hours-available-bars', 24, 40, true, 'elastic', 1200, 50, '#EC407A', 'hours');
  186. _BarChart('#goal-bars', 24, 40, true, 'elastic', 1200, 50, '#5C6BC0', 'goal');
  187. // _BarChart('#members-online', 24, 50, true, 'elastic', 1200, 50, 'rgba(255,255,255,0.5)', 'members');
  188. }
  189. }
  190. }();
  191. // Initialize module
  192. // ------------------------------
  193. document.addEventListener('DOMContentLoaded', function() {
  194. DashboardBars.init();
  195. });