4
0

statsWithChartjs.js 3.6 KB

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