Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

376 wiersze
9.5 KiB

  1. import { shuffle, getRandomBias } from '../../../src/js/utils/helpers';
  2. import { HEATMAP_COLORS_YELLOW, HEATMAP_COLORS_BLUE } from '../../../src/js/utils/constants';
  3. import { SEC_IN_DAY, clone, timestampToMidnight, timestampSec, addDays } from '../../../src/js/utils/date-utils';
  4. /* eslint-disable no-unused-vars */
  5. import { fireballOver25, fireball_2_5, fireball_5_25, lineCompositeData,
  6. barCompositeData, typeData, trendsData, moonData } from './data';
  7. /* eslint-enable no-unused-vars */
  8. import demoConfig from './demoConfig';
  9. // import { lineComposite, barComposite } from './demoConfig';
  10. // ================================================================================
  11. let Chart = xhiveframework.Chart; // eslint-disable-line no-undef
  12. let lc = demoConfig.lineComposite;
  13. let lineCompositeChart = new Chart (lc.elementID, lc.options);
  14. let bc = demoConfig.barComposite;
  15. let barCompositeChart = new Chart (bc.elementID, bc.options);
  16. lineCompositeChart.parent.addEventListener('data-select', (e) => {
  17. let i = e.index;
  18. barCompositeChart.updateDatasets([
  19. fireballOver25[i], fireball_5_25[i], fireball_2_5[i]
  20. ]);
  21. });
  22. // ================================================================================
  23. let customColors = ['purple', 'magenta', 'light-blue'];
  24. let typeChartArgs = {
  25. title: "My Awesome Chart",
  26. data: typeData,
  27. type: 'axis-mixed',
  28. height: 300,
  29. colors: customColors,
  30. // maxLegendPoints: 6,
  31. maxSlices: 10,
  32. tooltipOptions: {
  33. formatTooltipX: d => (d + '').toUpperCase(),
  34. formatTooltipY: d => d + ' pts',
  35. }
  36. };
  37. let aggrChart = new Chart("#chart-aggr", typeChartArgs);
  38. Array.prototype.slice.call(
  39. document.querySelectorAll('.aggr-type-buttons button')
  40. ).map(el => {
  41. el.addEventListener('click', (e) => {
  42. let btn = e.target;
  43. let type = btn.getAttribute('data-type');
  44. typeChartArgs.type = type;
  45. if(type !== 'axis-mixed') {
  46. typeChartArgs.colors = undefined;
  47. } else {
  48. typeChartArgs.colors = customColors;
  49. }
  50. if(type !== 'percentage') {
  51. typeChartArgs.height = 300;
  52. } else {
  53. typeChartArgs.height = undefined;
  54. }
  55. let newChart = new Chart("#chart-aggr", typeChartArgs);
  56. if(newChart){
  57. aggrChart = newChart;
  58. }
  59. Array.prototype.slice.call(
  60. btn.parentNode.querySelectorAll('button')).map(el => {
  61. el.classList.remove('active');
  62. });
  63. btn.classList.add('active');
  64. });
  65. });
  66. document.querySelector('.export-aggr').addEventListener('click', () => {
  67. aggrChart.export();
  68. });
  69. // Update values chart
  70. // ================================================================================
  71. let updateDataAllLabels = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue",
  72. "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri",
  73. "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon"];
  74. let getRandom = () => Math.floor(getRandomBias(-40, 60, 0.8, 1));
  75. let updateDataAllValues = Array.from({length: 30}, getRandom);
  76. // We're gonna be shuffling this
  77. let updateDataAllIndices = updateDataAllLabels.map((d,i) => i);
  78. let getUpdateData = (source_array, length=10) => {
  79. let indices = updateDataAllIndices.slice(0, length);
  80. return indices.map((index) => source_array[index]);
  81. };
  82. let updateData = {
  83. labels: getUpdateData(updateDataAllLabels),
  84. datasets: [{
  85. "values": getUpdateData(updateDataAllValues)
  86. }],
  87. yMarkers: [
  88. {
  89. label: "Altitude",
  90. value: 25,
  91. type: 'dashed'
  92. }
  93. ],
  94. yRegions: [
  95. {
  96. label: "Range",
  97. start: 10,
  98. end: 45
  99. },
  100. ],
  101. };
  102. let updateChart = new Chart("#chart-update", {
  103. data: updateData,
  104. type: 'line',
  105. height: 300,
  106. colors: ['#ff6c03'],
  107. lineOptions: {
  108. // hideLine: 1,
  109. regionFill: 1
  110. },
  111. });
  112. let chartUpdateButtons = document.querySelector('.chart-update-buttons');
  113. chartUpdateButtons.querySelector('[data-update="random"]').addEventListener("click", () => {
  114. shuffle(updateDataAllIndices);
  115. let value = getRandom();
  116. let start = getRandom();
  117. let end = getRandom();
  118. let data = {
  119. labels: updateDataAllLabels.slice(0, 10),
  120. datasets: [{values: getUpdateData(updateDataAllValues)}],
  121. yMarkers: [
  122. {
  123. label: "Altitude",
  124. value: value,
  125. type: 'dashed'
  126. }
  127. ],
  128. yRegions: [
  129. {
  130. label: "Range",
  131. start: start,
  132. end: end
  133. },
  134. ],
  135. };
  136. updateChart.update(data);
  137. });
  138. chartUpdateButtons.querySelector('[data-update="add"]').addEventListener("click", () => {
  139. let index = updateChart.state.datasetLength; // last index to add
  140. if(index >= updateDataAllIndices.length) return;
  141. updateChart.addDataPoint(
  142. updateDataAllLabels[index], [updateDataAllValues[index]]
  143. );
  144. });
  145. chartUpdateButtons.querySelector('[data-update="remove"]').addEventListener("click", () => {
  146. updateChart.removeDataPoint();
  147. });
  148. document.querySelector('.export-update').addEventListener('click', () => {
  149. updateChart.export();
  150. });
  151. // Trends Chart
  152. // ================================================================================
  153. let plotChartArgs = {
  154. title: "Mean Total Sunspot Count - Yearly",
  155. data: trendsData,
  156. type: 'line',
  157. height: 300,
  158. colors: ['#238e38'],
  159. lineOptions: {
  160. hideDots: 1,
  161. heatline: 1,
  162. },
  163. axisOptions: {
  164. xAxisMode: 'tick',
  165. yAxisMode: 'span',
  166. xIsSeries: 1
  167. }
  168. };
  169. let trendsChart = new Chart("#chart-trends", plotChartArgs);
  170. Array.prototype.slice.call(
  171. document.querySelectorAll('.chart-plot-buttons button')
  172. ).map(el => {
  173. el.addEventListener('click', (e) => {
  174. let btn = e.target;
  175. let type = btn.getAttribute('data-type');
  176. let config = {};
  177. config[type] = 1;
  178. if(['regionFill', 'heatline'].includes(type)) {
  179. config.hideDots = 1;
  180. }
  181. // plotChartArgs.init = false;
  182. plotChartArgs.lineOptions = config;
  183. new Chart("#chart-trends", plotChartArgs);
  184. Array.prototype.slice.call(
  185. btn.parentNode.querySelectorAll('button')).map(el => {
  186. el.classList.remove('active');
  187. });
  188. btn.classList.add('active');
  189. });
  190. });
  191. document.querySelector('.export-trends').addEventListener('click', () => {
  192. trendsChart.export();
  193. });
  194. // Event chart
  195. // ================================================================================
  196. let eventsData = {
  197. labels: ["Ganymede", "Callisto", "Io", "Europa"],
  198. datasets: [
  199. {
  200. "values": moonData.distances,
  201. "formatted": moonData.distances.map(d => d*1000 + " km")
  202. }
  203. ]
  204. };
  205. let eventsChart = new Chart("#chart-events", {
  206. title: "Jupiter's Moons: Semi-major Axis (1000 km)",
  207. data: eventsData,
  208. type: 'bar',
  209. height: 330,
  210. colors: ['grey'],
  211. isNavigable: 1,
  212. });
  213. let dataDiv = document.querySelector('.chart-events-data');
  214. eventsChart.parent.addEventListener('data-select', (e) => {
  215. let name = moonData.names[e.index];
  216. dataDiv.querySelector('.moon-name').innerHTML = name;
  217. dataDiv.querySelector('.semi-major-axis').innerHTML = moonData.distances[e.index] * 1000;
  218. dataDiv.querySelector('.mass').innerHTML = moonData.masses[e.index];
  219. dataDiv.querySelector('.diameter').innerHTML = moonData.diameters[e.index];
  220. dataDiv.querySelector('img').src = "./assets/img/" + name.toLowerCase() + ".jpg";
  221. });
  222. // Heatmap
  223. // ================================================================================
  224. let today = new Date();
  225. let start = clone(today);
  226. addDays(start, 4);
  227. let end = clone(start);
  228. start.setFullYear( start.getFullYear() - 2 );
  229. end.setFullYear( end.getFullYear() - 1 );
  230. let dataPoints = {};
  231. let startTs = timestampSec(start);
  232. let endTs = timestampSec(end);
  233. startTs = timestampToMidnight(startTs);
  234. endTs = timestampToMidnight(endTs, true);
  235. while (startTs < endTs) {
  236. dataPoints[parseInt(startTs)] = Math.floor(getRandomBias(0, 5, 0.2, 1));
  237. startTs += SEC_IN_DAY;
  238. }
  239. const heatmapData = {
  240. dataPoints: dataPoints,
  241. start: start,
  242. end: end
  243. };
  244. let heatmapArgs = {
  245. title: "Monthly Distribution",
  246. data: heatmapData,
  247. type: 'heatmap',
  248. discreteDomains: 1,
  249. countLabel: 'Level',
  250. colors: HEATMAP_COLORS_BLUE,
  251. legendScale: [0, 1, 2, 4, 5]
  252. };
  253. let heatmapChart = new Chart("#chart-heatmap", heatmapArgs);
  254. Array.prototype.slice.call(
  255. document.querySelectorAll('.heatmap-mode-buttons button')
  256. ).map(el => {
  257. el.addEventListener('click', (e) => {
  258. let btn = e.target;
  259. let mode = btn.getAttribute('data-mode');
  260. let discreteDomains = 0;
  261. if(mode === 'discrete') {
  262. discreteDomains = 1;
  263. }
  264. let colors = [];
  265. let colors_mode = document
  266. .querySelector('.heatmap-color-buttons .active')
  267. .getAttribute('data-color');
  268. if(colors_mode === 'halloween') {
  269. colors = HEATMAP_COLORS_YELLOW;
  270. } else if (colors_mode === 'blue') {
  271. colors = HEATMAP_COLORS_BLUE;
  272. }
  273. heatmapArgs.discreteDomains = discreteDomains;
  274. heatmapArgs.colors = colors;
  275. new Chart("#chart-heatmap", heatmapArgs);
  276. Array.prototype.slice.call(
  277. btn.parentNode.querySelectorAll('button')).map(el => {
  278. el.classList.remove('active');
  279. });
  280. btn.classList.add('active');
  281. });
  282. });
  283. Array.prototype.slice.call(
  284. document.querySelectorAll('.heatmap-color-buttons button')
  285. ).map(el => {
  286. el.addEventListener('click', (e) => {
  287. let btn = e.target;
  288. let colors_mode = btn.getAttribute('data-color');
  289. let colors = [];
  290. if(colors_mode === 'halloween') {
  291. colors = HEATMAP_COLORS_YELLOW;
  292. } else if (colors_mode === 'blue') {
  293. colors = HEATMAP_COLORS_BLUE;
  294. }
  295. let discreteDomains = 1;
  296. let view_mode = document
  297. .querySelector('.heatmap-mode-buttons .active')
  298. .getAttribute('data-mode');
  299. if(view_mode === 'continuous') {
  300. discreteDomains = 0;
  301. }
  302. heatmapArgs.discreteDomains = discreteDomains;
  303. heatmapArgs.colors = colors;
  304. new Chart("#chart-heatmap", heatmapArgs);
  305. Array.prototype.slice.call(
  306. btn.parentNode.querySelectorAll('button')).map(el => {
  307. el.classList.remove('active');
  308. });
  309. btn.classList.add('active');
  310. });
  311. });
  312. document.querySelector('.export-heatmap').addEventListener('click', () => {
  313. heatmapChart.export();
  314. });