argon-dashboard.js 23 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121
  1. /*!
  2. =========================================================
  3. * Argon Dashboard - v1.1.0
  4. =========================================================
  5. * Product Page: https://www.creative-tim.com/product/argon-dashboard
  6. * Copyright 2018 Creative Tim (https://www.creative-tim.com)
  7. * Licensed under MIT (https://github.com/creativetimofficial/argon-dashboard/blob/master/LICENSE.md)
  8. * Coded by www.creative-tim.com
  9. =========================================================
  10. * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
  11. */
  12. //
  13. // Bootstrap Datepicker
  14. //
  15. 'use strict';
  16. var Datepicker = (function() {
  17. // Variables
  18. var $datepicker = $('.datepicker');
  19. // Methods
  20. function init($this) {
  21. var options = {
  22. disableTouchKeyboard: true,
  23. autoclose: false
  24. };
  25. $this.datepicker(options);
  26. }
  27. // Events
  28. if ($datepicker.length) {
  29. $datepicker.each(function() {
  30. init($(this));
  31. });
  32. }
  33. })();
  34. //
  35. // Icon code copy/paste
  36. //
  37. 'use strict';
  38. var CopyIcon = (function() {
  39. // Variables
  40. var $element = '.btn-icon-clipboard',
  41. $btn = $($element);
  42. // Methods
  43. function init($this) {
  44. $this.tooltip().on('mouseleave', function() {
  45. // Explicitly hide tooltip, since after clicking it remains
  46. // focused (as it's a button), so tooltip would otherwise
  47. // remain visible until focus is moved away
  48. $this.tooltip('hide');
  49. });
  50. var clipboard = new ClipboardJS($element);
  51. clipboard.on('success', function(e) {
  52. $(e.trigger)
  53. .attr('title', 'Copied!')
  54. .tooltip('_fixTitle')
  55. .tooltip('show')
  56. .attr('title', 'Copy to clipboard')
  57. .tooltip('_fixTitle')
  58. e.clearSelection()
  59. });
  60. }
  61. // Events
  62. if ($btn.length) {
  63. init($btn);
  64. }
  65. })();
  66. //
  67. // Form control
  68. //
  69. 'use strict';
  70. var FormControl = (function() {
  71. // Variables
  72. var $input = $('.form-control');
  73. // Methods
  74. function init($this) {
  75. $this.on('focus blur', function(e) {
  76. $(this).parents('.form-group').toggleClass('focused', (e.type === 'focus' || this.value.length > 0));
  77. }).trigger('blur');
  78. }
  79. // Events
  80. if ($input.length) {
  81. init($input);
  82. }
  83. })();
  84. //
  85. // Google maps
  86. //
  87. var $map = $('#map-canvas'),
  88. map,
  89. lat,
  90. lng,
  91. color = "#5e72e4";
  92. function initMap() {
  93. map = document.getElementById('map-canvas');
  94. lat = map.getAttribute('data-lat');
  95. lng = map.getAttribute('data-lng');
  96. var myLatlng = new google.maps.LatLng(lat, lng);
  97. var mapOptions = {
  98. zoom: 12,
  99. scrollwheel: false,
  100. center: myLatlng,
  101. mapTypeId: google.maps.MapTypeId.ROADMAP,
  102. styles: [{
  103. "featureType": "administrative",
  104. "elementType": "labels.text.fill",
  105. "stylers": [{
  106. "color": "#444444"
  107. }]
  108. }, {
  109. "featureType": "landscape",
  110. "elementType": "all",
  111. "stylers": [{
  112. "color": "#f2f2f2"
  113. }]
  114. }, {
  115. "featureType": "poi",
  116. "elementType": "all",
  117. "stylers": [{
  118. "visibility": "off"
  119. }]
  120. }, {
  121. "featureType": "road",
  122. "elementType": "all",
  123. "stylers": [{
  124. "saturation": -100
  125. }, {
  126. "lightness": 45
  127. }]
  128. }, {
  129. "featureType": "road.highway",
  130. "elementType": "all",
  131. "stylers": [{
  132. "visibility": "simplified"
  133. }]
  134. }, {
  135. "featureType": "road.arterial",
  136. "elementType": "labels.icon",
  137. "stylers": [{
  138. "visibility": "off"
  139. }]
  140. }, {
  141. "featureType": "transit",
  142. "elementType": "all",
  143. "stylers": [{
  144. "visibility": "off"
  145. }]
  146. }, {
  147. "featureType": "water",
  148. "elementType": "all",
  149. "stylers": [{
  150. "color": color
  151. }, {
  152. "visibility": "on"
  153. }]
  154. }]
  155. }
  156. map = new google.maps.Map(map, mapOptions);
  157. var marker = new google.maps.Marker({
  158. position: myLatlng,
  159. map: map,
  160. animation: google.maps.Animation.DROP,
  161. title: 'Hello World!'
  162. });
  163. var contentString = '<div class="info-window-content"><h2>Argon Dashboard</h2>' +
  164. '<p>A beautiful Dashboard for Bootstrap 4. It is Free and Open Source.</p></div>';
  165. var infowindow = new google.maps.InfoWindow({
  166. content: contentString
  167. });
  168. google.maps.event.addListener(marker, 'click', function() {
  169. infowindow.open(map, marker);
  170. });
  171. }
  172. if ($map.length) {
  173. google.maps.event.addDomListener(window, 'load', initMap);
  174. }
  175. // //
  176. // // Headroom - show/hide navbar on scroll
  177. // //
  178. //
  179. // 'use strict';
  180. //
  181. // var Headroom = (function() {
  182. //
  183. // // Variables
  184. //
  185. // var $headroom = $('#navbar-main');
  186. //
  187. //
  188. // // Methods
  189. //
  190. // function init($this) {
  191. //
  192. // var headroom = new Headroom(document.querySelector("#navbar-main"), {
  193. // offset: 300,
  194. // tolerance: {
  195. // up: 30,
  196. // down: 30
  197. // },
  198. // });
  199. //
  200. //
  201. //
  202. // // Events
  203. //
  204. // if ($headroom.length) {
  205. // headroom.init();
  206. // }
  207. //
  208. // })();
  209. //
  210. // Navbar
  211. //
  212. 'use strict';
  213. var Navbar = (function() {
  214. // Variables
  215. var $nav = $('.navbar-nav, .navbar-nav .nav');
  216. var $collapse = $('.navbar .collapse');
  217. var $dropdown = $('.navbar .dropdown');
  218. // Methods
  219. function accordion($this) {
  220. $this.closest($nav).find($collapse).not($this).collapse('hide');
  221. }
  222. function closeDropdown($this) {
  223. var $dropdownMenu = $this.find('.dropdown-menu');
  224. $dropdownMenu.addClass('close');
  225. setTimeout(function() {
  226. $dropdownMenu.removeClass('close');
  227. }, 200);
  228. }
  229. // Events
  230. $collapse.on({
  231. 'show.bs.collapse': function() {
  232. accordion($(this));
  233. }
  234. })
  235. $dropdown.on({
  236. 'hide.bs.dropdown': function() {
  237. closeDropdown($(this));
  238. }
  239. })
  240. })();
  241. //
  242. // Navbar collapse
  243. //
  244. var NavbarCollapse = (function() {
  245. // Variables
  246. var $nav = $('.navbar-nav'),
  247. $collapse = $('.navbar .collapse');
  248. // Methods
  249. function hideNavbarCollapse($this) {
  250. $this.addClass('collapsing-out');
  251. }
  252. function hiddenNavbarCollapse($this) {
  253. $this.removeClass('collapsing-out');
  254. }
  255. // Events
  256. if ($collapse.length) {
  257. $collapse.on({
  258. 'hide.bs.collapse': function() {
  259. hideNavbarCollapse($collapse);
  260. }
  261. })
  262. $collapse.on({
  263. 'hidden.bs.collapse': function() {
  264. hiddenNavbarCollapse($collapse);
  265. }
  266. })
  267. }
  268. })();
  269. //
  270. // Form control
  271. //
  272. 'use strict';
  273. var noUiSlider = (function() {
  274. // Variables
  275. // var $sliderContainer = $('.input-slider-container'),
  276. // $slider = $('.input-slider'),
  277. // $sliderId = $slider.attr('id'),
  278. // $sliderMinValue = $slider.data('range-value-min');
  279. // $sliderMaxValue = $slider.data('range-value-max');;
  280. // // Methods
  281. //
  282. // function init($this) {
  283. // $this.on('focus blur', function(e) {
  284. // $this.parents('.form-group').toggleClass('focused', (e.type === 'focus' || this.value.length > 0));
  285. // }).trigger('blur');
  286. // }
  287. //
  288. //
  289. // // Events
  290. //
  291. // if ($input.length) {
  292. // init($input);
  293. // }
  294. if ($(".input-slider-container")[0]) {
  295. $('.input-slider-container').each(function() {
  296. var slider = $(this).find('.input-slider');
  297. var sliderId = slider.attr('id');
  298. var minValue = slider.data('range-value-min');
  299. var maxValue = slider.data('range-value-max');
  300. var sliderValue = $(this).find('.range-slider-value');
  301. var sliderValueId = sliderValue.attr('id');
  302. var startValue = sliderValue.data('range-value-low');
  303. var c = document.getElementById(sliderId),
  304. d = document.getElementById(sliderValueId);
  305. noUiSlider.create(c, {
  306. start: [parseInt(startValue)],
  307. connect: [true, false],
  308. //step: 1000,
  309. range: {
  310. 'min': [parseInt(minValue)],
  311. 'max': [parseInt(maxValue)]
  312. }
  313. });
  314. c.noUiSlider.on('update', function(a, b) {
  315. d.textContent = a[b];
  316. });
  317. })
  318. }
  319. if ($("#input-slider-range")[0]) {
  320. var c = document.getElementById("input-slider-range"),
  321. d = document.getElementById("input-slider-range-value-low"),
  322. e = document.getElementById("input-slider-range-value-high"),
  323. f = [d, e];
  324. noUiSlider.create(c, {
  325. start: [parseInt(d.getAttribute('data-range-value-low')), parseInt(e.getAttribute('data-range-value-high'))],
  326. connect: !0,
  327. range: {
  328. min: parseInt(c.getAttribute('data-range-value-min')),
  329. max: parseInt(c.getAttribute('data-range-value-max'))
  330. }
  331. }), c.noUiSlider.on("update", function(a, b) {
  332. f[b].textContent = a[b]
  333. })
  334. }
  335. })();
  336. //
  337. // Popover
  338. //
  339. 'use strict';
  340. var Popover = (function() {
  341. // Variables
  342. var $popover = $('[data-toggle="popover"]'),
  343. $popoverClass = '';
  344. // Methods
  345. function init($this) {
  346. if ($this.data('color')) {
  347. $popoverClass = 'popover-' + $this.data('color');
  348. }
  349. var options = {
  350. trigger: 'focus',
  351. template: '<div class="popover ' + $popoverClass + '" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'
  352. };
  353. $this.popover(options);
  354. }
  355. // Events
  356. if ($popover.length) {
  357. $popover.each(function() {
  358. init($(this));
  359. });
  360. }
  361. })();
  362. //
  363. // Scroll to (anchor links)
  364. //
  365. 'use strict';
  366. var ScrollTo = (function() {
  367. //
  368. // Variables
  369. //
  370. var $scrollTo = $('.scroll-me, [data-scroll-to], .toc-entry a');
  371. //
  372. // Methods
  373. //
  374. function scrollTo($this) {
  375. var $el = $this.attr('href');
  376. var offset = $this.data('scroll-to-offset') ? $this.data('scroll-to-offset') : 0;
  377. var options = {
  378. scrollTop: $($el).offset().top - offset
  379. };
  380. // Animate scroll to the selected section
  381. $('html, body').stop(true, true).animate(options, 600);
  382. event.preventDefault();
  383. }
  384. //
  385. // Events
  386. //
  387. if ($scrollTo.length) {
  388. $scrollTo.on('click', function(event) {
  389. scrollTo($(this));
  390. });
  391. }
  392. })();
  393. //
  394. // Tooltip
  395. //
  396. 'use strict';
  397. var Tooltip = (function() {
  398. // Variables
  399. var $tooltip = $('[data-toggle="tooltip"]');
  400. // Methods
  401. function init() {
  402. $tooltip.tooltip();
  403. }
  404. // Events
  405. if ($tooltip.length) {
  406. init();
  407. }
  408. })();
  409. //
  410. // Charts
  411. //
  412. 'use strict';
  413. var Charts = (function() {
  414. // Variable
  415. var $toggle = $('[data-toggle="chart"]');
  416. var mode = 'light'; //(themeMode) ? themeMode : 'light';
  417. var fonts = {
  418. base: 'Open Sans'
  419. }
  420. // Colors
  421. var colors = {
  422. gray: {
  423. 100: '#f6f9fc',
  424. 200: '#e9ecef',
  425. 300: '#dee2e6',
  426. 400: '#ced4da',
  427. 500: '#adb5bd',
  428. 600: '#8898aa',
  429. 700: '#525f7f',
  430. 800: '#32325d',
  431. 900: '#212529'
  432. },
  433. theme: {
  434. 'default': '#172b4d',
  435. 'primary': '#5e72e4',
  436. 'secondary': '#f4f5f7',
  437. 'info': '#11cdef',
  438. 'success': '#2dce89',
  439. 'danger': '#f5365c',
  440. 'warning': '#fb6340'
  441. },
  442. black: '#12263F',
  443. white: '#FFFFFF',
  444. transparent: 'transparent',
  445. };
  446. // Methods
  447. // Chart.js global options
  448. function chartOptions() {
  449. // Options
  450. var options = {
  451. defaults: {
  452. global: {
  453. responsive: true,
  454. maintainAspectRatio: false,
  455. defaultColor: (mode == 'dark') ? colors.gray[700] : colors.gray[600],
  456. defaultFontColor: (mode == 'dark') ? colors.gray[700] : colors.gray[600],
  457. defaultFontFamily: fonts.base,
  458. defaultFontSize: 13,
  459. layout: {
  460. padding: 0
  461. },
  462. legend: {
  463. display: false,
  464. position: 'bottom',
  465. labels: {
  466. usePointStyle: true,
  467. padding: 16
  468. }
  469. },
  470. elements: {
  471. point: {
  472. radius: 0,
  473. backgroundColor: colors.theme['primary']
  474. },
  475. line: {
  476. tension: .4,
  477. borderWidth: 4,
  478. borderColor: colors.theme['primary'],
  479. backgroundColor: colors.transparent,
  480. borderCapStyle: 'rounded'
  481. },
  482. rectangle: {
  483. backgroundColor: colors.theme['warning']
  484. },
  485. arc: {
  486. backgroundColor: colors.theme['primary'],
  487. borderColor: (mode == 'dark') ? colors.gray[800] : colors.white,
  488. borderWidth: 4
  489. }
  490. },
  491. tooltips: {
  492. enabled: false,
  493. mode: 'index',
  494. intersect: false,
  495. custom: function(model) {
  496. // Get tooltip
  497. var $tooltip = $('#chart-tooltip');
  498. // Create tooltip on first render
  499. if (!$tooltip.length) {
  500. $tooltip = $('<div id="chart-tooltip" class="popover bs-popover-top" role="tooltip"></div>');
  501. // Append to body
  502. $('body').append($tooltip);
  503. }
  504. // Hide if no tooltip
  505. if (model.opacity === 0) {
  506. $tooltip.css('display', 'none');
  507. return;
  508. }
  509. function getBody(bodyItem) {
  510. return bodyItem.lines;
  511. }
  512. // Fill with content
  513. if (model.body) {
  514. var titleLines = model.title || [];
  515. var bodyLines = model.body.map(getBody);
  516. var html = '';
  517. // Add arrow
  518. html += '<div class="arrow"></div>';
  519. // Add header
  520. titleLines.forEach(function(title) {
  521. html += '<h3 class="popover-header text-center">' + title + '</h3>';
  522. });
  523. // Add body
  524. bodyLines.forEach(function(body, i) {
  525. var colors = model.labelColors[i];
  526. var styles = 'background-color: ' + colors.backgroundColor;
  527. var indicator = '<span class="badge badge-dot"><i class="bg-primary"></i></span>';
  528. var align = (bodyLines.length > 1) ? 'justify-content-left' : 'justify-content-center';
  529. html += '<div class="popover-body d-flex align-items-center ' + align + '">' + indicator + body + '</div>';
  530. });
  531. $tooltip.html(html);
  532. }
  533. // Get tooltip position
  534. var $canvas = $(this._chart.canvas);
  535. var canvasWidth = $canvas.outerWidth();
  536. var canvasHeight = $canvas.outerHeight();
  537. var canvasTop = $canvas.offset().top;
  538. var canvasLeft = $canvas.offset().left;
  539. var tooltipWidth = $tooltip.outerWidth();
  540. var tooltipHeight = $tooltip.outerHeight();
  541. var top = canvasTop + model.caretY - tooltipHeight - 16;
  542. var left = canvasLeft + model.caretX - tooltipWidth / 2;
  543. // Display tooltip
  544. $tooltip.css({
  545. 'top': top + 'px',
  546. 'left': left + 'px',
  547. 'display': 'block',
  548. 'z-index': '100'
  549. });
  550. },
  551. callbacks: {
  552. label: function(item, data) {
  553. var label = data.datasets[item.datasetIndex].label || '';
  554. var yLabel = item.yLabel;
  555. var content = '';
  556. if (data.datasets.length > 1) {
  557. content += '<span class="badge badge-primary mr-auto">' + label + '</span>';
  558. }
  559. content += '<span class="popover-body-value">' + yLabel + '</span>';
  560. return content;
  561. }
  562. }
  563. }
  564. },
  565. doughnut: {
  566. cutoutPercentage: 83,
  567. tooltips: {
  568. callbacks: {
  569. title: function(item, data) {
  570. var title = data.labels[item[0].index];
  571. return title;
  572. },
  573. label: function(item, data) {
  574. var value = data.datasets[0].data[item.index];
  575. var content = '';
  576. content += '<span class="popover-body-value">' + value + '</span>';
  577. return content;
  578. }
  579. }
  580. },
  581. legendCallback: function(chart) {
  582. var data = chart.data;
  583. var content = '';
  584. data.labels.forEach(function(label, index) {
  585. var bgColor = data.datasets[0].backgroundColor[index];
  586. content += '<span class="chart-legend-item">';
  587. content += '<i class="chart-legend-indicator" style="background-color: ' + bgColor + '"></i>';
  588. content += label;
  589. content += '</span>';
  590. });
  591. return content;
  592. }
  593. }
  594. }
  595. }
  596. // yAxes
  597. Chart.scaleService.updateScaleDefaults('linear', {
  598. gridLines: {
  599. borderDash: [2],
  600. borderDashOffset: [2],
  601. color: (mode == 'dark') ? colors.gray[900] : colors.gray[300],
  602. drawBorder: false,
  603. drawTicks: false,
  604. lineWidth: 0,
  605. zeroLineWidth: 0,
  606. zeroLineColor: (mode == 'dark') ? colors.gray[900] : colors.gray[300],
  607. zeroLineBorderDash: [2],
  608. zeroLineBorderDashOffset: [2]
  609. },
  610. ticks: {
  611. beginAtZero: true,
  612. padding: 10,
  613. callback: function(value) {
  614. if (!(value % 10)) {
  615. return value
  616. }
  617. }
  618. }
  619. });
  620. // xAxes
  621. Chart.scaleService.updateScaleDefaults('category', {
  622. gridLines: {
  623. drawBorder: false,
  624. drawOnChartArea: false,
  625. drawTicks: false
  626. },
  627. ticks: {
  628. padding: 20
  629. },
  630. maxBarThickness: 10
  631. });
  632. return options;
  633. }
  634. // Parse global options
  635. function parseOptions(parent, options) {
  636. for (var item in options) {
  637. if (typeof options[item] !== 'object') {
  638. parent[item] = options[item];
  639. } else {
  640. parseOptions(parent[item], options[item]);
  641. }
  642. }
  643. }
  644. // Push options
  645. function pushOptions(parent, options) {
  646. for (var item in options) {
  647. if (Array.isArray(options[item])) {
  648. options[item].forEach(function(data) {
  649. parent[item].push(data);
  650. });
  651. } else {
  652. pushOptions(parent[item], options[item]);
  653. }
  654. }
  655. }
  656. // Pop options
  657. function popOptions(parent, options) {
  658. for (var item in options) {
  659. if (Array.isArray(options[item])) {
  660. options[item].forEach(function(data) {
  661. parent[item].pop();
  662. });
  663. } else {
  664. popOptions(parent[item], options[item]);
  665. }
  666. }
  667. }
  668. // Toggle options
  669. function toggleOptions(elem) {
  670. var options = elem.data('add');
  671. var $target = $(elem.data('target'));
  672. var $chart = $target.data('chart');
  673. if (elem.is(':checked')) {
  674. // Add options
  675. pushOptions($chart, options);
  676. // Update chart
  677. $chart.update();
  678. } else {
  679. // Remove options
  680. popOptions($chart, options);
  681. // Update chart
  682. $chart.update();
  683. }
  684. }
  685. // Update options
  686. function updateOptions(elem) {
  687. var options = elem.data('update');
  688. var $target = $(elem.data('target'));
  689. var $chart = $target.data('chart');
  690. // Parse options
  691. parseOptions($chart, options);
  692. // Toggle ticks
  693. toggleTicks(elem, $chart);
  694. // Update chart
  695. $chart.update();
  696. }
  697. // Toggle ticks
  698. function toggleTicks(elem, $chart) {
  699. if (elem.data('prefix') !== undefined || elem.data('prefix') !== undefined) {
  700. var prefix = elem.data('prefix') ? elem.data('prefix') : '';
  701. var suffix = elem.data('suffix') ? elem.data('suffix') : '';
  702. // Update ticks
  703. $chart.options.scales.yAxes[0].ticks.callback = function(value) {
  704. if (!(value % 10)) {
  705. return prefix + value + suffix;
  706. }
  707. }
  708. // Update tooltips
  709. $chart.options.tooltips.callbacks.label = function(item, data) {
  710. var label = data.datasets[item.datasetIndex].label || '';
  711. var yLabel = item.yLabel;
  712. var content = '';
  713. if (data.datasets.length > 1) {
  714. content += '<span class="popover-body-label mr-auto">' + label + '</span>';
  715. }
  716. content += '<span class="popover-body-value">' + prefix + yLabel + suffix + '</span>';
  717. return content;
  718. }
  719. }
  720. }
  721. // Events
  722. // Parse global options
  723. if (window.Chart) {
  724. parseOptions(Chart, chartOptions());
  725. }
  726. // Toggle options
  727. $toggle.on({
  728. 'change': function() {
  729. var $this = $(this);
  730. if ($this.is('[data-add]')) {
  731. toggleOptions($this);
  732. }
  733. },
  734. 'click': function() {
  735. var $this = $(this);
  736. if ($this.is('[data-update]')) {
  737. updateOptions($this);
  738. }
  739. }
  740. });
  741. // Return
  742. return {
  743. colors: colors,
  744. fonts: fonts,
  745. mode: mode
  746. };
  747. })();
  748. //
  749. // Orders chart
  750. //
  751. var OrdersChart = (function() {
  752. //
  753. // Variables
  754. //
  755. var $chart = $('#chart-orders');
  756. var $ordersSelect = $('[name="ordersSelect"]');
  757. //
  758. // Methods
  759. //
  760. // Init chart
  761. function initChart($chart) {
  762. // Create chart
  763. var ordersChart = new Chart($chart, {
  764. type: 'bar',
  765. options: {
  766. scales: {
  767. yAxes: [{
  768. gridLines: {
  769. lineWidth: 1,
  770. color: '#dfe2e6',
  771. zeroLineColor: '#dfe2e6'
  772. },
  773. ticks: {
  774. callback: function(value) {
  775. if (!(value % 10)) {
  776. //return '$' + value + 'k'
  777. return value
  778. }
  779. }
  780. }
  781. }]
  782. },
  783. tooltips: {
  784. callbacks: {
  785. label: function(item, data) {
  786. var label = data.datasets[item.datasetIndex].label || '';
  787. var yLabel = item.yLabel;
  788. var content = '';
  789. if (data.datasets.length > 1) {
  790. content += '<span class="popover-body-label mr-auto">' + label + '</span>';
  791. }
  792. content += '<span class="popover-body-value">' + yLabel + '</span>';
  793. return content;
  794. }
  795. }
  796. }
  797. },
  798. data: {
  799. labels: ['Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
  800. datasets: [{
  801. label: 'Sales',
  802. data: [25, 20, 30, 22, 17, 29]
  803. }]
  804. }
  805. });
  806. // Save to jQuery object
  807. $chart.data('chart', ordersChart);
  808. }
  809. // Init chart
  810. if ($chart.length) {
  811. initChart($chart);
  812. }
  813. })();
  814. //
  815. // Charts
  816. //
  817. 'use strict';
  818. //
  819. // Sales chart
  820. //
  821. var SalesChart = (function() {
  822. // Variables
  823. var $chart = $('#chart-sales');
  824. // Methods
  825. function init($chart) {
  826. var salesChart = new Chart($chart, {
  827. type: 'line',
  828. options: {
  829. scales: {
  830. yAxes: [{
  831. gridLines: {
  832. lineWidth: 1,
  833. color: Charts.colors.gray[900],
  834. zeroLineColor: Charts.colors.gray[900]
  835. },
  836. ticks: {
  837. callback: function(value) {
  838. if (!(value % 10)) {
  839. return '$' + value + 'k';
  840. }
  841. }
  842. }
  843. }]
  844. },
  845. tooltips: {
  846. callbacks: {
  847. label: function(item, data) {
  848. var label = data.datasets[item.datasetIndex].label || '';
  849. var yLabel = item.yLabel;
  850. var content = '';
  851. if (data.datasets.length > 1) {
  852. content += '<span class="popover-body-label mr-auto">' + label + '</span>';
  853. }
  854. content += '<span class="popover-body-value">$' + yLabel + 'k</span>';
  855. return content;
  856. }
  857. }
  858. }
  859. },
  860. data: {
  861. labels: ['May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
  862. datasets: [{
  863. label: 'Performance',
  864. data: [0, 20, 10, 30, 15, 40, 20, 60, 60]
  865. }]
  866. }
  867. });
  868. // Save to jQuery object
  869. $chart.data('chart', salesChart);
  870. };
  871. // Events
  872. if ($chart.length) {
  873. init($chart);
  874. }
  875. })();