­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ (function ($) { "use strict"; function widgetLineChart( $scope ) { var id = $scope.data( 'id' ), $line_chart = $scope.find( '.jet-line-chart-container' ), $line_chart_canvas = $line_chart.find( '.jet-line-chart' ), $compare = $line_chart.data( 'compare' ), previous_label = $line_chart.data( 'previous-label' ), current_label = $line_chart.data( 'current-label' ), settings = $line_chart.data( 'settings' ), compare_labels_type = $line_chart.data( 'compare-labels-type' ), tooltip_prefix = $line_chart.data( 'tooltip-prefix' ) || '', tooltip_suffix = $line_chart.data( 'tooltip-suffix' ) || '', tooltip_separator = $line_chart.data( 'tooltip-separator' ) || ''; if ( ! $line_chart.length ) { return; } JetElements.observer( $line_chart_canvas, function() { var $this = $( this ), ctx = $this[0].getContext( '2d' ), myLineChart = new Chart( ctx, settings ); myLineChart.options.tooltips = { enabled: false, mode: 'x-axis', intersect: false, callbacks: { label: function( tooltipItem, data ) { var colorBox = data.datasets[tooltipItem.datasetIndex].borderColor; colorBox = colorBox.replace( /"/g, '"' ); if ( true === $compare ) { var currentLabel = 'custom' === compare_labels_type ? current_label : data.labels[tooltipItem.index], title = data.datasets[tooltipItem.datasetIndex].label, currentVal = '' != tooltip_separator ? JetElementsTools.addThousandCommaSeparator( data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index], tooltip_separator ) : data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index], current = '
' + currentLabel + ' : ' + tooltip_prefix + currentVal + tooltip_suffix + '
', previous = '', compareColorBox = data.datasets[tooltipItem.datasetIndex].borderColor, compareColorBox = compareColorBox.replace( /"/g, '"' ); if ( typeof (data.labels[tooltipItem.index - 1]) != "undefined" && data.labels[tooltipItem.index - 1] !== null ) { var previousLabel = 'custom' === compare_labels_type ? previous_label : data.labels[tooltipItem.index - 1], previousVal = '' != tooltip_separator ? JetElementsTools.addThousandCommaSeparator( data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index - 1], tooltip_separator ) : data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index - 1], previous = '
' + previousLabel + ' : ' + tooltip_prefix + previousVal + tooltip_suffix + '
'; } return '
' + title + '
' + current + previous + '
'; } else { var label = data.datasets[tooltipItem.datasetIndex].label, val = '' != tooltip_separator ? JetElementsTools.addThousandCommaSeparator( data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index], tooltip_separator ) : data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; return '
' + label + ' : ' + tooltip_prefix + val + tooltip_suffix + '
'; } }, }, custom: function( tooltipModel ) { // Tooltip Element var tooltipEl = document.getElementById( 'chartjs-tooltip_' + id ); // Create element on first render if ( !tooltipEl ) { tooltipEl = document.createElement( 'div' ); tooltipEl.id = 'chartjs-tooltip_' + id; tooltipEl.innerHTML = '
'; document.body.appendChild( tooltipEl ); } // Hide if no tooltip if ( tooltipModel.opacity === 0 ) { tooltipEl.style.opacity = 0; return; } // Set caret Position tooltipEl.classList.remove( 'above', 'below', 'no-transform' ); if ( tooltipModel.yAlign ) { tooltipEl.classList.add( tooltipModel.yAlign ); } else { tooltipEl.classList.add( 'no-transform' ); } function getBody( bodyItem ) { return bodyItem.lines; } // Set Text if ( tooltipModel.body ) { var titleLines = tooltipModel.title || []; var bodyLines = tooltipModel.body.map( getBody ); var innerHtml = ''; innerHtml += '
'; bodyLines.forEach( function( body, i ) { innerHtml += body; } ); innerHtml += '
'; var tableRoot = tooltipEl.querySelector( 'div' ); tableRoot.innerHTML = innerHtml; } // `this` will be the overall tooltip var _this = this, position = this._chart.canvas.getBoundingClientRect(), tooltipWidth = tooltipEl.offsetWidth, tooltipHeight = tooltipEl.offsetHeight, offsetX = 0, offsetY = 0; setTimeout( function(){ tooltipWidth = tooltipEl.offsetWidth; tooltipHeight = tooltipEl.offsetHeight; if ( _this._chart.width / 2 > _this._chart.tooltip._eventPosition.x ) { offsetX = 0; } else { offsetX = -tooltipWidth; } if ( _this._chart.height / 2 > _this._chart.tooltip._eventPosition.y ) { offsetY = 0; } else { offsetY = -tooltipHeight; } tooltipEl.style.left = position.left + window.pageXOffset + tooltipModel.caretX + offsetX + 'px'; tooltipEl.style.top = position.top + window.pageYOffset + tooltipModel.caretY + offsetY + 'px'; tooltipEl.style.opacity = 1; }, 10 ); // Display, position, and set styles for font tooltipEl.style.position = 'absolute'; tooltipEl.style.fontFamily = tooltipModel._bodyFontFamily; tooltipEl.style.fontSize = tooltipModel.bodyFontSize + 'px'; tooltipEl.style.fontStyle = tooltipModel._bodyFontStyle; tooltipEl.style.padding = tooltipModel.yPadding + 'px ' + tooltipModel.xPadding + 'px'; tooltipEl.style.pointerEvents = 'none'; }, }; myLineChart.update(); }, JetElements.prepareWaypointOptions( $scope, { offset: 'bottom-in-view' } ) ); } window.widgetLineChart = widgetLineChart; })( jQuery );