graphael.html 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset='utf-8'>
  5. <title>gRaphaël integration - Handsontable</title>
  6. <!--
  7. Loading Handsontable (full distribution that includes all dependencies apart from jQuery)
  8. -->
  9. <script data-jsfiddle="common" src="../demo/js/jquery.min.js"></script>
  10. <link data-jsfiddle="common" rel="stylesheet" media="screen" href="../dist/handsontable.css">
  11. <link data-jsfiddle="common" rel="stylesheet" media="screen" href="../dist/pikaday/pikaday.css">
  12. <script data-jsfiddle="common" src="../dist/pikaday/pikaday.js"></script>
  13. <script data-jsfiddle="common" src="../dist/moment/moment.js"></script>
  14. <script data-jsfiddle="common" src="../dist/zeroclipboard/ZeroClipboard.js"></script>
  15. <script data-jsfiddle="common" src="../dist/numbro/numbro.js"></script>
  16. <script data-jsfiddle="common" src="../dist/numbro/languages.js"></script>
  17. <script data-jsfiddle="common" src="../dist/handsontable.js"></script>
  18. <!--
  19. Loading demo dependencies. They are used here only to enhance the examples on this page
  20. -->
  21. <link data-jsfiddle="common" rel="stylesheet" media="screen" href="css/samples.css?20140331">
  22. <script src="js/samples.js"></script>
  23. <script src="js/highlight/highlight.pack.js"></script>
  24. <script data-jsfiddle="common" src="js/raphael/raphael-min.js"></script>
  25. <script data-jsfiddle="common" src="js/raphael/g.raphael-min.js"></script>
  26. <script data-jsfiddle="common" src="js/raphael/g.bar-min.js"></script>
  27. <link rel="stylesheet" media="screen" href="js/highlight/styles/github.css">
  28. <link rel="stylesheet" href="css/font-awesome/css/font-awesome.min.css">
  29. <style type="text/css">
  30. #example1 {
  31. float: left;
  32. margin-top: 30px;
  33. }
  34. #example1-side {
  35. margin-top: 30px;
  36. display: inline-block;
  37. }
  38. #graphael-example {
  39. margin-bottom: 30px;
  40. }
  41. #example1-side:after {
  42. content: "";
  43. display: table;
  44. clear: both;
  45. }
  46. </style>
  47. <!--
  48. Facebook open graph. Don't copy this to your project :)
  49. -->
  50. <meta property="og:title" content="gRaphael charts integration">
  51. <meta property="og:description"
  52. content="">
  53. <meta property="og:url" content="http://handsontable.com/demo/graphael.html">
  54. <meta property="og:image" content="http://handsontable.com/demo/image/og-image.png">
  55. <meta property="og:image:type" content="image/png">
  56. <meta property="og:image:width" content="409">
  57. <meta property="og:image:height" content="164">
  58. <link rel="canonical" href="http://handsontable.com/demo/graphael.html">
  59. <!--
  60. Google Analytics for GitHub Page. Don't copy this to your project :)
  61. -->
  62. <script src="js/ga.js"></script>
  63. </head>
  64. <body>
  65. <div class="wrapper">
  66. <div class="wrapper-row">
  67. <div id="global-menu-clone">
  68. <h1><a href="../index.html">Handsontable</a></h1>
  69. </div>
  70. <div id="container">
  71. <div class="columnLayout">
  72. <div class="rowLayout">
  73. <div class="descLayout">
  74. <div class="pad" data-jsfiddle="example1">
  75. <a name="lazy"></a>
  76. <h2>gRaphaël bar chart integration example</h2>
  77. <p>The following demo shows an example of data visualisation using <a href="http://g.raphaeljs.com/"
  78. rel="nofollow">gRaphaël's</a> bar
  79. charts.</p>
  80. <ul>
  81. <li>Choosing any of the <em>Aggregate</em> buttons changes the currently used column</li>
  82. <li>Editing data in the grid automatically refreshes the chart with updated values.</li>
  83. </ul>
  84. <div id="example1"></div>
  85. <div id="example1-side">
  86. <div id="graphael-example"></div>
  87. <div class="aggregation">Aggregate:
  88. <button data-aggregate="0" title="Aggregates the Cars column">
  89. Cars
  90. </button>
  91. <button data-aggregate="1" title="Aggregates the Years column">
  92. Years
  93. </button>
  94. <button data-aggregate="2" title="Aggregates the Colors column">
  95. Colors
  96. </button>
  97. </div>
  98. </div>
  99. </div>
  100. </div>
  101. <div class="codeLayout">
  102. <div class="pad">
  103. <div class="jsFiddle">
  104. <button class="jsFiddleLink" data-runfiddle="example1">Edit in jsFiddle</button>
  105. </div>
  106. <script data-jsfiddle="example1">
  107. var data = [
  108. ['Nissan', 2009, 'black'],
  109. ['Nissan', 2006, 'blue'],
  110. ['Chrysler', 2004, 'yellow'],
  111. ['Volvo', 2012, 'white'],
  112. ['Nissan', 2006, 'blue'],
  113. ['Chevrolet', 2004, 'yellow'],
  114. ['Volvo', 2012, "red"],
  115. ['Ford', 2006, 'yellow'],
  116. ['Chevrolet', 2004, 'yellow'],
  117. ['Ford', 2012, 'yellow']
  118. ],
  119. container = document.getElementById('example1'),
  120. r = Raphael('graphael-example', 250, 250),
  121. chartData = [],
  122. activeColumn = 0,
  123. lastChange = null,
  124. hot;
  125. hot = new Handsontable(container, {
  126. data: data,
  127. width: 250,
  128. colHeaders: ['Car', 'Year', 'Color'],
  129. rowHeaders: true,
  130. afterChange: refreshChart
  131. });
  132. chartData = [
  133. gatherColData(0),
  134. gatherColData(1),
  135. gatherColData(2)
  136. ];
  137. renderChart();
  138. function fin() {
  139. var label = chartData[activeColumn].labels[$('path').toArray().indexOf(this.bar[0])];
  140. this.flag = r.popup(this.bar.x, this.bar.y, label + " - " + this.bar.value || '0').insertBefore(this);
  141. }
  142. function fout() {
  143. this.flag.animate({opacity: 0}, 300, function () {
  144. this.remove();
  145. });
  146. }
  147. function refreshChart(changes, source) {
  148. if (source != 'loadData') {
  149. chartData[changes[0][1]] = gatherColData(changes[0][1]);
  150. activeColumn = changes[0][1];
  151. renderChart();
  152. }
  153. }
  154. function renderChart() {
  155. r.clear();
  156. r.text(125, 25, 'Aggregated by ' + $(".aggregation button[data-aggregate='" + activeColumn + "']").text()).attr({ font: "20px sans-serif" });
  157. r.barchart(10, 75, 220, 200, [chartData[activeColumn].values]).hover(fin, fout);
  158. }
  159. function gatherColData(colNum) {
  160. var data = hot.getDataAtCol(colNum),
  161. chartData = {labels: [], values: []},
  162. entryIndex = -1,
  163. labelsSize;
  164. for (var i = 0; i < data.length; i++) {
  165. entryIndex = chartData.labels.indexOf(data[i]);
  166. if (entryIndex != -1) {
  167. chartData.values[entryIndex]++;
  168. } else {
  169. labelsSize = chartData.labels.length;
  170. chartData.labels[labelsSize] = data[i];
  171. chartData.values[labelsSize] = 1;
  172. }
  173. }
  174. return chartData;
  175. }
  176. $('.aggregation').on('click', 'button', function () {
  177. activeColumn = $(this).attr('data-aggregate');
  178. renderChart();
  179. });
  180. </script>
  181. </div>
  182. </div>
  183. </div>
  184. <div class="footer-text">
  185. </div>
  186. </div>
  187. </div>
  188. </div>
  189. </div>
  190. <div id="outside-links-wrapper"></div>
  191. </body>
  192. </html>