4
0

statsWithChartjs.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. // @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0
  2. "use strict";
  3. /* globals Chart */
  4. /* jshint esversion:6, strict:global */
  5. function initCharts() {
  6. if (!window.Chart) {
  7. if (window.console) {
  8. console.log('FreshRSS is waiting for Chart.js...');
  9. }
  10. window.setTimeout(initCharts, 25);
  11. return;
  12. }
  13. const jsonData = document.getElementsByClassName('jsonData-stats');
  14. var jsonDataParsed;
  15. var chartConfig;
  16. for (var i = 0; i < jsonData.length; i++) {
  17. jsonDataParsed = JSON.parse(jsonData[i].innerHTML);
  18. switch(jsonDataParsed.charttype) {
  19. case 'bar':
  20. chartConfig = jsonChartBar(jsonDataParsed.label, jsonDataParsed.data, jsonDataParsed.xAxisLabels);
  21. break;
  22. case 'doughnut':
  23. chartConfig = jsonChartDoughnut(jsonDataParsed.labels, jsonDataParsed.data);
  24. break;
  25. case 'barWithAverage':
  26. chartConfig = jsonChartBarWithAvarage(jsonDataParsed.labelBarChart, jsonDataParsed.dataBarChart, jsonDataParsed.labelAverage, jsonDataParsed.dataAverage, jsonDataParsed.xAxisLabels);
  27. }
  28. new Chart(
  29. document.getElementById(jsonDataParsed.canvasID),
  30. chartConfig
  31. );
  32. }
  33. if (window.console) {
  34. console.log('Chart.js finished');
  35. }
  36. }
  37. function jsonChartBar(label, data, xAxisLabels = '') {
  38. return {
  39. type: 'bar',
  40. data: {
  41. labels: xAxisLabels,
  42. datasets: [{
  43. label: label,
  44. backgroundColor: '#0062BD',
  45. borderColor: '#0062BD',
  46. data: data,
  47. barPercentage: 1.0,
  48. categoryPercentage: 1.0,
  49. order: 2,
  50. }]
  51. },
  52. options: {
  53. scales: {
  54. y: {
  55. beginAtZero: true
  56. },
  57. x: {
  58. grid: {
  59. display: false,
  60. }
  61. }
  62. },
  63. plugins: {
  64. legend: {
  65. display: false,
  66. }
  67. }
  68. }
  69. };
  70. }
  71. function jsonChartDoughnut(labels, data) {
  72. return {
  73. type: 'doughnut',
  74. data: {
  75. labels: labels,
  76. datasets: [{
  77. backgroundColor: [
  78. '#0b84a5', //petrol
  79. '#f6c85f', // sand
  80. '#6f4e7c', //purple
  81. '#9dd866', //green
  82. '#ca472f', //red
  83. '#ffa056', //orange
  84. '#8dddd0', // turkis
  85. '#f6c85f', // sand
  86. '#6f4e7c', //purple
  87. '#9dd866', //green
  88. '#ca472f', //red
  89. '#ffa056', //orange
  90. '#8dddd0', // turkis
  91. ],
  92. data: data,
  93. }]
  94. },
  95. options: {
  96. layout: {
  97. padding: 20,
  98. },
  99. plugins: {
  100. legend: {
  101. position: 'bottom',
  102. align: 'start',
  103. }
  104. }
  105. }
  106. };
  107. }
  108. function jsonChartBarWithAvarage(labelBarChart, dataBarChart, labelAverage, dataAverage, xAxisLabels = '') {
  109. return {
  110. type: 'bar',
  111. data: {
  112. datasets: [
  113. {
  114. // bar chart layout
  115. label: labelBarChart,
  116. backgroundColor: '#0062BD',
  117. borderColor: '#0062BD',
  118. data: dataBarChart,
  119. barPercentage: 1.0,
  120. categoryPercentage: 1.0,
  121. order: 2,
  122. },
  123. {
  124. // average line chart
  125. type: 'line',
  126. label: labelAverage, // Todo: i18n
  127. borderColor: 'rgb(192,216,0)',
  128. data: {
  129. '-30' : dataAverage,
  130. '-1' : dataAverage,
  131. },
  132. order: 1,
  133. }
  134. ]
  135. },
  136. options: {
  137. scales: {
  138. y: {
  139. beginAtZero: true,
  140. },
  141. x: {
  142. ticks: {
  143. callback: function(val){
  144. if (xAxisLabels.length > 0) {
  145. return xAxisLabels[val];
  146. } else {
  147. return val;
  148. }
  149. }
  150. },
  151. grid: {
  152. display: false,
  153. }
  154. }
  155. },
  156. elements: {
  157. point: {
  158. radius: 0,
  159. }
  160. },
  161. plugins: {
  162. tooltip: {
  163. callbacks: {
  164. title: function(tooltipitem) {
  165. if (xAxisLabels.length > 0) {
  166. return xAxisLabels[tooltipitem[0].dataIndex];
  167. } else {
  168. return tooltipitem[0].label;
  169. }
  170. }
  171. }
  172. },
  173. legend: {
  174. display: false,
  175. }
  176. }
  177. }
  178. };
  179. }
  180. initCharts();
  181. // @license-end