Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 

576 Zeilen
16 KiB

  1. (function () {
  2. 'use strict';
  3. function __$styleInject(css, returnValue) {
  4. if (typeof document === 'undefined') {
  5. return returnValue;
  6. }
  7. css = css || '';
  8. var head = document.head || document.getElementsByTagName('head')[0];
  9. var style = document.createElement('style');
  10. style.type = 'text/css';
  11. head.appendChild(style);
  12. if (style.styleSheet){
  13. style.styleSheet.cssText = css;
  14. } else {
  15. style.appendChild(document.createTextNode(css));
  16. }
  17. return returnValue;
  18. }
  19. var HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];
  20. var HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];
  21. // Universal constants
  22. var ANGLE_RATIO = Math.PI / 180;
  23. /**
  24. * Shuffles array in place. ES6 version
  25. * @param {Array} array An array containing the items.
  26. */
  27. function shuffle(array) {
  28. // Awesomeness: https://bost.ocks.org/mike/shuffle/
  29. // https://stackoverflow.com/a/2450976/6495043
  30. // https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1
  31. for (var i = array.length - 1; i > 0; i--) {
  32. var j = Math.floor(Math.random() * (i + 1));
  33. var _ref = [array[j], array[i]];
  34. array[i] = _ref[0];
  35. array[j] = _ref[1];
  36. }
  37. return array;
  38. }
  39. // https://stackoverflow.com/a/29325222
  40. function getRandomBias(min, max, bias, influence) {
  41. var range = max - min;
  42. var biasValue = range * bias + min;
  43. var rnd = Math.random() * range + min,
  44. // random in range
  45. mix = Math.random() * influence; // random mixer
  46. return rnd * (1 - mix) + biasValue * mix; // mix full range and bias
  47. }
  48. // Playing around with dates
  49. var NO_OF_MILLIS = 1000;
  50. var SEC_IN_DAY = 86400;
  51. var MONTH_NAMES_SHORT = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
  52. function clone(date) {
  53. return new Date(date.getTime());
  54. }
  55. function timestampSec(date) {
  56. return date.getTime() / NO_OF_MILLIS;
  57. }
  58. function timestampToMidnight(timestamp) {
  59. var roundAhead = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  60. var midnightTs = Math.floor(timestamp - timestamp % SEC_IN_DAY);
  61. if (roundAhead) {
  62. return midnightTs + SEC_IN_DAY;
  63. }
  64. return midnightTs;
  65. }
  66. // mutates
  67. function addDays(date, numberOfDays) {
  68. date.setDate(date.getDate() + numberOfDays);
  69. }
  70. // Composite Chart
  71. // ================================================================================
  72. var reportCountList = [152, 222, 199, 287, 534, 709, 1179, 1256, 1632, 1856, 1850];
  73. var lineCompositeData = {
  74. labels: ["2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017"],
  75. yMarkers: [{
  76. label: "Average 100 reports/month",
  77. value: 1200,
  78. options: { labelPos: 'left' }
  79. }],
  80. datasets: [{
  81. "name": "Events",
  82. "values": reportCountList
  83. }]
  84. };
  85. var fireball_5_25 = [[4, 0, 3, 1, 1, 2, 1, 1, 1, 0, 1, 1], [2, 3, 3, 2, 1, 3, 0, 1, 2, 7, 10, 4], [5, 6, 2, 4, 0, 1, 4, 3, 0, 2, 0, 1], [0, 2, 6, 2, 1, 1, 2, 3, 6, 3, 7, 8], [6, 8, 7, 7, 4, 5, 6, 5, 22, 12, 10, 11], [7, 10, 11, 7, 3, 2, 7, 7, 11, 15, 22, 20], [13, 16, 21, 18, 19, 17, 12, 17, 31, 28, 25, 29], [24, 14, 21, 14, 11, 15, 19, 21, 41, 22, 32, 18], [31, 20, 30, 22, 14, 17, 21, 35, 27, 50, 117, 24], [32, 24, 21, 27, 11, 27, 43, 37, 44, 40, 48, 32], [31, 38, 36, 26, 23, 23, 25, 29, 26, 47, 61, 50]];
  86. var fireball_2_5 = [[22, 6, 6, 9, 7, 8, 6, 14, 19, 10, 8, 20], [11, 13, 12, 8, 9, 11, 9, 13, 10, 22, 40, 24], [20, 13, 13, 19, 13, 10, 14, 13, 20, 18, 5, 9], [7, 13, 16, 19, 12, 11, 21, 27, 27, 24, 33, 33], [38, 25, 28, 22, 31, 21, 35, 42, 37, 32, 46, 53], [50, 33, 36, 34, 35, 28, 27, 52, 58, 59, 75, 69], [54, 67, 67, 45, 66, 51, 38, 64, 90, 113, 116, 87], [84, 52, 56, 51, 55, 46, 50, 87, 114, 83, 152, 93], [73, 58, 59, 63, 56, 51, 83, 140, 103, 115, 265, 89], [106, 95, 94, 71, 77, 75, 99, 136, 129, 154, 168, 156], [81, 102, 95, 72, 58, 91, 89, 122, 124, 135, 183, 171]];
  87. var fireballOver25 = [
  88. // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  89. [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0], [1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2], [3, 2, 1, 3, 2, 0, 2, 2, 2, 3, 0, 1], [2, 3, 5, 2, 1, 3, 0, 2, 3, 5, 1, 4], [7, 4, 6, 1, 9, 2, 2, 2, 20, 9, 4, 9], [5, 6, 1, 2, 5, 4, 5, 5, 16, 9, 14, 9], [5, 4, 7, 5, 1, 5, 3, 3, 5, 7, 22, 2], [5, 13, 11, 6, 1, 7, 9, 8, 14, 17, 16, 3], [8, 9, 8, 6, 4, 8, 5, 6, 14, 11, 21, 12]];
  90. var barCompositeData = {
  91. labels: MONTH_NAMES_SHORT,
  92. datasets: [{
  93. name: "Over 25 reports",
  94. values: fireballOver25[9]
  95. }, {
  96. name: "5 to 25 reports",
  97. values: fireball_5_25[9]
  98. }, {
  99. name: "2 to 5 reports",
  100. values: fireball_2_5[9]
  101. }]
  102. };
  103. // Demo Chart multitype Chart
  104. // ================================================================================
  105. var typeData = {
  106. labels: ["12am-3am", "3am-6am", "6am-9am", "9am-12pm", "12pm-3pm", "3pm-6pm", "6pm-9pm", "9pm-12am"],
  107. yMarkers: [{
  108. label: "Marker",
  109. value: 43,
  110. options: { labelPos: 'left'
  111. // type: 'dashed'
  112. } }],
  113. yRegions: [{
  114. label: "Region",
  115. start: -10,
  116. end: 50,
  117. options: { labelPos: 'right' }
  118. }],
  119. datasets: [{
  120. name: "Some Data",
  121. values: [18, 40, 30, 35, 8, 52, 17, -4],
  122. axisPosition: 'right',
  123. chartType: 'bar'
  124. }, {
  125. name: "Another Set",
  126. values: [30, 50, -10, 15, 18, 32, 27, 14],
  127. axisPosition: 'right',
  128. chartType: 'bar'
  129. }, {
  130. name: "Yet Another",
  131. values: [15, 20, -3, -15, 58, 12, -17, 37],
  132. chartType: 'line'
  133. }]
  134. };
  135. var trendsData = {
  136. labels: [1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016],
  137. datasets: [{
  138. values: [132.9, 150.0, 149.4, 148.0, 94.4, 97.6, 54.1, 49.2, 22.5, 18.4, 39.3, 131.0, 220.1, 218.9, 198.9, 162.4, 91.0, 60.5, 20.6, 14.8, 33.9, 123.0, 211.1, 191.8, 203.3, 133.0, 76.1, 44.9, 25.1, 11.6, 28.9, 88.3, 136.3, 173.9, 170.4, 163.6, 99.3, 65.3, 45.8, 24.7, 12.6, 4.2, 4.8, 24.9, 80.8, 84.5, 94.0, 113.3, 69.8, 39.8]
  139. }]
  140. };
  141. var moonData = {
  142. names: ["Ganymede", "Callisto", "Io", "Europa"],
  143. masses: [14819000, 10759000, 8931900, 4800000],
  144. distances: [1070.412, 1882.709, 421.700, 671.034],
  145. diameters: [5262.4, 4820.6, 3637.4, 3121.6]
  146. };
  147. // const jupiterMoons = {
  148. // 'Ganymede': {
  149. // mass: '14819000 x 10^16 kg',
  150. // 'semi-major-axis': '1070412 km',
  151. // 'diameter': '5262.4 km'
  152. // },
  153. // 'Callisto': {
  154. // mass: '10759000 x 10^16 kg',
  155. // 'semi-major-axis': '1882709 km',
  156. // 'diameter': '4820.6 km'
  157. // },
  158. // 'Io': {
  159. // mass: '8931900 x 10^16 kg',
  160. // 'semi-major-axis': '421700 km',
  161. // 'diameter': '3637.4 km'
  162. // },
  163. // 'Europa': {
  164. // mass: '4800000 x 10^16 kg',
  165. // 'semi-major-axis': '671034 km',
  166. // 'diameter': '3121.6 km'
  167. // },
  168. // };
  169. // ================================================================================
  170. var today = new Date();
  171. var start = clone(today);
  172. addDays(start, 4);
  173. var end = clone(start);
  174. start.setFullYear(start.getFullYear() - 2);
  175. end.setFullYear(end.getFullYear() - 1);
  176. var dataPoints = {};
  177. var startTs = timestampSec(start);
  178. var endTs = timestampSec(end);
  179. startTs = timestampToMidnight(startTs);
  180. endTs = timestampToMidnight(endTs, true);
  181. while (startTs < endTs) {
  182. dataPoints[parseInt(startTs)] = Math.floor(getRandomBias(0, 5, 0.2, 1));
  183. startTs += SEC_IN_DAY;
  184. }
  185. var heatmapData = {
  186. dataPoints: dataPoints,
  187. start: start,
  188. end: end
  189. };
  190. // ================================================================================
  191. var c1 = document.querySelector("#chart-composite-1");
  192. var c2 = document.querySelector("#chart-composite-2");
  193. var Chart = frappe.Chart; // eslint-disable-line no-undef
  194. var lineCompositeChart = new Chart(c1, {
  195. title: "Fireball/Bolide Events - Yearly (reported)",
  196. data: lineCompositeData,
  197. type: 'line',
  198. height: 190,
  199. colors: ['green'],
  200. isNavigable: 1,
  201. valuesOverPoints: 1,
  202. lineOptions: {
  203. dotSize: 8
  204. }
  205. // yAxisMode: 'tick'
  206. // regionFill: 1
  207. });
  208. var barCompositeChart = new Chart(c2, {
  209. data: barCompositeData,
  210. type: 'bar',
  211. height: 210,
  212. colors: ['violet', 'light-blue', '#46a9f9'],
  213. valuesOverPoints: 1,
  214. axisOptions: {
  215. xAxisMode: 'tick'
  216. },
  217. barOptions: {
  218. stacked: 1
  219. }
  220. });
  221. lineCompositeChart.parent.addEventListener('data-select', function (e) {
  222. var i = e.index;
  223. barCompositeChart.updateDatasets([fireballOver25[i], fireball_5_25[i], fireball_2_5[i]]);
  224. });
  225. // ================================================================================
  226. var customColors = ['purple', 'magenta', 'light-blue'];
  227. var typeChartArgs = {
  228. title: "My Awesome Chart",
  229. data: typeData,
  230. type: 'axis-mixed',
  231. height: 300,
  232. colors: customColors,
  233. // maxLegendPoints: 6,
  234. maxSlices: 10,
  235. tooltipOptions: {
  236. formatTooltipX: function formatTooltipX(d) {
  237. return (d + '').toUpperCase();
  238. },
  239. formatTooltipY: function formatTooltipY(d) {
  240. return d + ' pts';
  241. }
  242. }
  243. };
  244. var aggrChart = new Chart("#chart-aggr", typeChartArgs);
  245. Array.prototype.slice.call(document.querySelectorAll('.aggr-type-buttons button')).map(function (el) {
  246. el.addEventListener('click', function (e) {
  247. var btn = e.target;
  248. var type = btn.getAttribute('data-type');
  249. typeChartArgs.type = type;
  250. if (type !== 'axis-mixed') {
  251. typeChartArgs.colors = undefined;
  252. } else {
  253. typeChartArgs.colors = customColors;
  254. }
  255. if (type !== 'percentage') {
  256. typeChartArgs.height = 300;
  257. } else {
  258. typeChartArgs.height = undefined;
  259. }
  260. var newChart = new Chart("#chart-aggr", typeChartArgs);
  261. if (newChart) {
  262. aggrChart = newChart;
  263. }
  264. Array.prototype.slice.call(btn.parentNode.querySelectorAll('button')).map(function (el) {
  265. el.classList.remove('active');
  266. });
  267. btn.classList.add('active');
  268. });
  269. });
  270. document.querySelector('.export-aggr').addEventListener('click', function () {
  271. aggrChart.export();
  272. });
  273. // Update values chart
  274. // ================================================================================
  275. var updateDataAllLabels = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon"];
  276. var getRandom = function getRandom() {
  277. return Math.floor(getRandomBias(-40, 60, 0.8, 1));
  278. };
  279. var updateDataAllValues = Array.from({ length: 30 }, getRandom);
  280. // We're gonna be shuffling this
  281. var updateDataAllIndices = updateDataAllLabels.map(function (d, i) {
  282. return i;
  283. });
  284. var getUpdateData = function getUpdateData(source_array) {
  285. var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10;
  286. var indices = updateDataAllIndices.slice(0, length);
  287. return indices.map(function (index) {
  288. return source_array[index];
  289. });
  290. };
  291. var updateData = {
  292. labels: getUpdateData(updateDataAllLabels),
  293. datasets: [{
  294. "values": getUpdateData(updateDataAllValues)
  295. }],
  296. yMarkers: [{
  297. label: "Altitude",
  298. value: 25,
  299. type: 'dashed'
  300. }],
  301. yRegions: [{
  302. label: "Range",
  303. start: 10,
  304. end: 45
  305. }]
  306. };
  307. var updateChart = new Chart("#chart-update", {
  308. data: updateData,
  309. type: 'line',
  310. height: 300,
  311. colors: ['#ff6c03'],
  312. lineOptions: {
  313. // hideLine: 1,
  314. regionFill: 1
  315. }
  316. });
  317. var chartUpdateButtons = document.querySelector('.chart-update-buttons');
  318. chartUpdateButtons.querySelector('[data-update="random"]').addEventListener("click", function () {
  319. shuffle(updateDataAllIndices);
  320. var value = getRandom();
  321. var start = getRandom();
  322. var end = getRandom();
  323. var data = {
  324. labels: updateDataAllLabels.slice(0, 10),
  325. datasets: [{ values: getUpdateData(updateDataAllValues) }],
  326. yMarkers: [{
  327. label: "Altitude",
  328. value: value,
  329. type: 'dashed'
  330. }],
  331. yRegions: [{
  332. label: "Range",
  333. start: start,
  334. end: end
  335. }]
  336. };
  337. updateChart.update(data);
  338. });
  339. chartUpdateButtons.querySelector('[data-update="add"]').addEventListener("click", function () {
  340. var index = updateChart.state.datasetLength; // last index to add
  341. if (index >= updateDataAllIndices.length) return;
  342. updateChart.addDataPoint(updateDataAllLabels[index], [updateDataAllValues[index]]);
  343. });
  344. chartUpdateButtons.querySelector('[data-update="remove"]').addEventListener("click", function () {
  345. updateChart.removeDataPoint();
  346. });
  347. document.querySelector('.export-update').addEventListener('click', function () {
  348. updateChart.export();
  349. });
  350. // Trends Chart
  351. // ================================================================================
  352. var plotChartArgs = {
  353. title: "Mean Total Sunspot Count - Yearly",
  354. data: trendsData,
  355. type: 'line',
  356. height: 300,
  357. colors: ['#238e38'],
  358. lineOptions: {
  359. hideDots: 1,
  360. heatline: 1
  361. },
  362. axisOptions: {
  363. xAxisMode: 'tick',
  364. yAxisMode: 'span',
  365. xIsSeries: 1
  366. }
  367. };
  368. var trendsChart = new Chart("#chart-trends", plotChartArgs);
  369. Array.prototype.slice.call(document.querySelectorAll('.chart-plot-buttons button')).map(function (el) {
  370. el.addEventListener('click', function (e) {
  371. var btn = e.target;
  372. var type = btn.getAttribute('data-type');
  373. var config = {};
  374. config[type] = 1;
  375. if (['regionFill', 'heatline'].includes(type)) {
  376. config.hideDots = 1;
  377. }
  378. // plotChartArgs.init = false;
  379. plotChartArgs.lineOptions = config;
  380. new Chart("#chart-trends", plotChartArgs);
  381. Array.prototype.slice.call(btn.parentNode.querySelectorAll('button')).map(function (el) {
  382. el.classList.remove('active');
  383. });
  384. btn.classList.add('active');
  385. });
  386. });
  387. document.querySelector('.export-trends').addEventListener('click', function () {
  388. trendsChart.export();
  389. });
  390. // Event chart
  391. // ================================================================================
  392. var eventsData = {
  393. labels: ["Ganymede", "Callisto", "Io", "Europa"],
  394. datasets: [{
  395. "values": moonData.distances,
  396. "formatted": moonData.distances.map(function (d) {
  397. return d * 1000 + " km";
  398. })
  399. }]
  400. };
  401. var eventsChart = new Chart("#chart-events", {
  402. title: "Jupiter's Moons: Semi-major Axis (1000 km)",
  403. data: eventsData,
  404. type: 'bar',
  405. height: 330,
  406. colors: ['grey'],
  407. isNavigable: 1
  408. });
  409. var dataDiv = document.querySelector('.chart-events-data');
  410. eventsChart.parent.addEventListener('data-select', function (e) {
  411. var name = moonData.names[e.index];
  412. dataDiv.querySelector('.moon-name').innerHTML = name;
  413. dataDiv.querySelector('.semi-major-axis').innerHTML = moonData.distances[e.index] * 1000;
  414. dataDiv.querySelector('.mass').innerHTML = moonData.masses[e.index];
  415. dataDiv.querySelector('.diameter').innerHTML = moonData.diameters[e.index];
  416. dataDiv.querySelector('img').src = "./assets/img/" + name.toLowerCase() + ".jpg";
  417. });
  418. // Heatmap
  419. // ================================================================================
  420. var heatmapArgs = {
  421. title: "Monthly Distribution",
  422. data: heatmapData,
  423. type: 'heatmap',
  424. discreteDomains: 1,
  425. countLabel: 'Level',
  426. colors: HEATMAP_COLORS_BLUE,
  427. legendScale: [0, 1, 2, 4, 5]
  428. };
  429. var heatmapChart = new Chart("#chart-heatmap", heatmapArgs);
  430. Array.prototype.slice.call(document.querySelectorAll('.heatmap-mode-buttons button')).map(function (el) {
  431. el.addEventListener('click', function (e) {
  432. var btn = e.target;
  433. var mode = btn.getAttribute('data-mode');
  434. var discreteDomains = 0;
  435. if (mode === 'discrete') {
  436. discreteDomains = 1;
  437. }
  438. var colors = [];
  439. var colors_mode = document.querySelector('.heatmap-color-buttons .active').getAttribute('data-color');
  440. if (colors_mode === 'halloween') {
  441. colors = HEATMAP_COLORS_YELLOW;
  442. } else if (colors_mode === 'blue') {
  443. colors = HEATMAP_COLORS_BLUE;
  444. }
  445. heatmapArgs.discreteDomains = discreteDomains;
  446. heatmapArgs.colors = colors;
  447. new Chart("#chart-heatmap", heatmapArgs);
  448. Array.prototype.slice.call(btn.parentNode.querySelectorAll('button')).map(function (el) {
  449. el.classList.remove('active');
  450. });
  451. btn.classList.add('active');
  452. });
  453. });
  454. Array.prototype.slice.call(document.querySelectorAll('.heatmap-color-buttons button')).map(function (el) {
  455. el.addEventListener('click', function (e) {
  456. var btn = e.target;
  457. var colors_mode = btn.getAttribute('data-color');
  458. var colors = [];
  459. if (colors_mode === 'halloween') {
  460. colors = HEATMAP_COLORS_YELLOW;
  461. } else if (colors_mode === 'blue') {
  462. colors = HEATMAP_COLORS_BLUE;
  463. }
  464. var discreteDomains = 1;
  465. var view_mode = document.querySelector('.heatmap-mode-buttons .active').getAttribute('data-mode');
  466. if (view_mode === 'continuous') {
  467. discreteDomains = 0;
  468. }
  469. heatmapArgs.discreteDomains = discreteDomains;
  470. heatmapArgs.colors = colors;
  471. new Chart("#chart-heatmap", heatmapArgs);
  472. Array.prototype.slice.call(btn.parentNode.querySelectorAll('button')).map(function (el) {
  473. el.classList.remove('active');
  474. });
  475. btn.classList.add('active');
  476. });
  477. });
  478. document.querySelector('.export-heatmap').addEventListener('click', function () {
  479. heatmapChart.export();
  480. });
  481. }());
  482. //# sourceMappingURL=index.min.js.map