(function($) { 'use strict'; function AysChartBuilder(element, options){ this.el = element; this.$el = $(element); this.ajaxAction = 'ays_chart_admin_ajax'; this.htmlClassPrefix = 'ays-chart-'; this.htmlNamePrefix = 'ays_'; this.dbOptions = undefined; this.chartSourceData = undefined; this.chartObj = undefined; this.chartOptions = null; this.chartData = null; this.chartTempData = null; this.chartSources = { 'bar_chart' : 'Bar Chart', 'pie_chart' : 'Pie Chart', 'column_chart' : 'Column Chart' } this.init(); return this; } AysChartBuilder.prototype.init = function() { var _this = this; _this.chartSourceData = window.ChartBuilderSourceData; _this.setEvents(); _this.initLibraries(); _this.setAccordionEvents(); }; // Set events AysChartBuilder.prototype.setEvents = function(e){ var _this = this; /* == Choose poll type from modal == */ _this.$el.on('dblclick' , '.'+_this.htmlClassPrefix+'layer_box_blocks label.'+_this.htmlClassPrefix+'dblclick-layer:not(.'+_this.htmlClassPrefix+'type-pro-feature)', function(){ _this.$el.find('.'+_this.htmlClassPrefix+'select_button_layer input.'+_this.htmlClassPrefix+'layer_button').trigger('click'); }); _this.$el.on('change' , '.'+_this.htmlClassPrefix+'choose-source', function(){ _this.$el.find('.'+_this.htmlClassPrefix+'select_button_layer input.'+_this.htmlClassPrefix+'layer_button').prop('disabled',false).attr("data-type" , $(this).val()); // _this.$el.find('#poll_choose_type').val($(this).val()); }); _this.$el.on('click', '.'+_this.htmlClassPrefix+'layer_button' ,function(){ var getCheckedChartTpye = _this.$el.find('.'+_this.htmlClassPrefix+'choose-source:checked').val(); _this.$el.find('.'+_this.htmlClassPrefix+'layer_container').css({'position':'unset' , 'display':'none'}); _this.$el.find('.'+_this.htmlClassPrefix+'type-info-box-text-changeable').text(_this.chartSources[getCheckedChartTpye]); _this.$el.find('#'+_this.htmlClassPrefix+'option-chart-type').val(getCheckedChartTpye); _this.$el.find('.'+_this.htmlClassPrefix+'charts-main-container').attr('id' , _this.htmlClassPrefix+getCheckedChartTpye); _this.loadChartBySource( getCheckedChartTpye ); }); /* */ /* == Tabulation == */ _this.$el.on('click', '.nav-tab-wrapper a.nav-tab' , _this.changeTabs); /* */ // /* == Range slider functions == */ // _this.$el.on('input', '#ays-chart-option-font-size', _this.rangeSliderChange); // _this.$el.on('mouseenter', '#ays-chart-option-font-size', function(e) { // $('#ays-chart-range-value').show(); // }); // _this.$el.on('mouseleave', '#ays-chart-option-font-size', function(e) { // $('#ays-chart-range-value').hide(); // }); // /* */ /* == Notifications dismiss button == */ _this.$el.on('click', '.notice-dismiss', function (e) { _this.changeCurrentUrl('status'); }); _this.$el.on('click', '.toggle_ddmenu' , _this.toggleDDmenu); /* */ /* Add Manual data */ _this.$el.on("click" , '.'+_this.htmlClassPrefix+'add-new-row-box', function(){ _this.addChartDataRow(); }); _this.$el.on("click" , '.'+_this.htmlClassPrefix+'add-new-column-box', function(){ _this.addLineChartDataColumn(); }); _this.$el.on('click', '.'+_this.htmlClassPrefix+'show-on-chart-bttn', function(e){ var loadedChartType = _this.$el.find('.'+_this.htmlClassPrefix+'choose-source:checked').val(); var chartType = (loadedChartType === undefined) ? _this.chartSourceData.chartType : loadedChartType; e.preventDefault(); _this.showOnChart($(this), chartType); }); /* */ /* Delete data */ _this.$el.on("click" , '.'+_this.htmlClassPrefix+'chart-source-data-remove-block', function(){ _this.deleteChartDataRow($(this)); }); _this.$el.on('mouseenter', '.'+_this.htmlClassPrefix+'chart-source-data-remove-block', function() { $(this).find('path').css('fill', '#ff0000'); }); _this.$el.on('mouseleave', '.'+_this.htmlClassPrefix+'chart-source-data-remove-block', function() { $(this).find('path').css('fill', '#b8b8b8'); }); /* */ /* Load data on the edit page */ if(_this.chartSourceData.action == 'edit'){ _this.loadChartBySource( _this.chartSourceData.chartType ); } /* */ /* Save with Ctrl + S */ _this.$el.on('keydown', $(document), _this.quickSaveHotKeys); /* */ // Submit buttons disabling _this.$el.on('click', '.'+_this.htmlClassPrefix+'loader-banner', _this.submitOnce); /* */ // Disabling submit when press enter button on inputing $(document).on("keypress", '.ays-text-input', _this.disableSubmit); /* */ // Modal close $(document).on('click', '.ays-close', function () { $(this).parents('.ays-modal').aysModal('hide'); }); } // Disabling submit when pressing enter button on input AysChartBuilder.prototype.disableSubmit = function(e){ if(e.which == 13){ if($(document).find("#ays-charts-form").length !== 0 || $(document).find("#ays-settings-form").length !== 0){ return false; } } } // Change tabs (tabulation) AysChartBuilder.prototype.changeTabs = function(e){ if(! $(this).hasClass('no-js')){ var elemenetID = $(this).attr('href'); var active_tab = $(this).attr('data-tab'); $(document).find('.nav-tab-wrapper a.nav-tab').each(function () { if ($(this).hasClass('nav-tab-active')) { $(this).removeClass('nav-tab-active'); } }); $(this).addClass('nav-tab-active'); $(document).find('.ays-tab-content').each(function () { $(this).css('display', 'none'); }); $(document).find("[name='ays_form_tab']").val(active_tab); $('.ays-tab-content' + elemenetID).css('display', 'block'); e.preventDefault(); } } // AysChartBuilder.prototype.rangeSliderChange = function(e){ // var min = e.target.min; // var max = e.target.max; // var val = e.target.value; // var width = $('#ays-chart-option-font-size').width(); // $(e.target).css('backgroundSize', (val - min) / (max - min) * 100 + '% 100%'); // $('#ays-chart-range-value').css('left', 12.8 + (val - min) / (max - min + 1) * width + 'px'); // $('#ays-chart-range-value span').html(val); // } AysChartBuilder.prototype.changeCurrentUrl = function(e){ var linkModified = location.href.split('?')[1].split('&'); for(var i = 0; i < linkModified.length; i++){ if(linkModified[i].split("=")[0] == key){ linkModified.splice(i, 1); } } linkModified = linkModified.join('&'); window.history.replaceState({}, document.title, '?'+linkModified); } AysChartBuilder.prototype.toggleDDmenu = function(e){ var ddmenu = $(this).next(); var state = ddmenu.attr('data-expanded'); switch (state) { case 'true': $(this).find('.ays_fa').css({ transform: 'rotate(0deg)' }); ddmenu.attr('data-expanded', 'false'); break; case 'false': $(this).find('.ays_fa').css({ transform: 'rotate(90deg)' }); ddmenu.attr('data-expanded', 'true'); break; } } AysChartBuilder.prototype.submitOnce = function(el) { setTimeout(function() { $(document).find('.ays-chart-loader-banner').attr('disabled', true); }, 50); setTimeout(function() { $(document).find('.ays-chart-loader-banner').attr('disabled', false); }, 5000); } // Load charts by given type main function AysChartBuilder.prototype.initLibraries = function (){ var _this = this; } // Load charts by given type main function AysChartBuilder.prototype.loadChartBySource = function( chartType ){ var _this = this; if( ! chartType ){ chartType = _this.chartSourceData.chartType; } if(typeof chartType !== undefined && chartType){ switch (chartType) { case 'pie_chart': _this.pieChartView( chartType ); break; case 'bar_chart': _this.barChartView( chartType ); break; case 'column_chart': _this.columnChartView( chartType ); break; default: _this.pieChartView( chartType ); break; } } } // Load chart by pie chart AysChartBuilder.prototype.pieChartView = function( chartType ){ var _this = this; var getChartSource = _this.chartSourceData.source; var dataTypes = _this.chartConvertData( getChartSource ); var settings = _this.chartSourceData.settings; var chartFontSize = settings['font_size']; var tooltipTrigger = settings['tooltip_trigger']; var showColorCode = (settings['show_color_code'] == 'checked') ? true : false; /* == Google part == */ google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { _this.chartData = google.visualization.arrayToDataTable( dataTypes ); _this.chartOptions = { backgroundColor: 'transparent', fontSize: chartFontSize, tooltip: { trigger: tooltipTrigger, showColorCode: showColorCode } }; // height: 250, // chartArea: { // width: '80%', // height: '80%' // }, _this.chartObj = new google.visualization.PieChart( document.getElementById(_this.htmlClassPrefix + chartType) ); _this.chartObj.draw( _this.chartData, _this.chartOptions ); _this.resizeChart(); } /* */ } // Load chart by bar chart AysChartBuilder.prototype.barChartView = function( chartType ){ var _this = this; var getChartSource = _this.chartSourceData.source; var dataTypes = _this.chartConvertData( getChartSource ); var settings = _this.chartSourceData.settings; var chartFontSize = settings['font_size']; var tooltipTrigger = settings['tooltip_trigger']; var showColorCode = (settings['show_color_code'] == 'checked') ? true : false; /* == Google part == */ google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { _this.chartData = google.visualization.arrayToDataTable(dataTypes); _this.chartOptions = { backgroundColor: 'transparent', fontSize: chartFontSize, legend: { position: 'none' }, tooltip: { trigger: tooltipTrigger, showColorCode: showColorCode } }; _this.chartObj = new google.visualization.BarChart(document.getElementById(_this.htmlClassPrefix + chartType)); _this.chartObj.draw( _this.chartData, _this.chartOptions ); _this.resizeChart(); } /* */ } // Load chart by column chart AysChartBuilder.prototype.columnChartView = function( chartType ){ var _this = this; var getChartSource = _this.chartSourceData.source; var dataTypes = _this.chartConvertData( getChartSource ); var settings = _this.chartSourceData.settings; var chartFontSize = settings['font_size']; var tooltipTrigger = settings['tooltip_trigger']; var showColorCode = (settings['show_color_code'] == 'checked') ? true : false; // Collect data in new array for chart rendering (Column chart) /* == Google part == */ google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { _this.chartData = google.visualization.arrayToDataTable(dataTypes); _this.chartOptions = { backgroundColor: 'transparent', fontSize: chartFontSize, legend: { position: 'none' }, tooltip: { trigger: tooltipTrigger, showColorCode: showColorCode } }; _this.chartObj = new google.visualization.ColumnChart(document.getElementById(_this.htmlClassPrefix + chartType)); _this.chartObj.draw( _this.chartData, _this.chartOptions ); _this.resizeChart(); } /* */ } // Detect window resize moment to draw charts responsively AysChartBuilder.prototype.resizeChart = function(){ var _this = this; //create trigger to resizeEnd event $(window).resize(function() { if(this.resizeTO) clearTimeout(this.resizeTO); this.resizeTO = setTimeout(function() { $(this).trigger('resizeEnd'); }, 100); }); //redraw graph when window resize is completed $(window).on('resizeEnd', function() { _this.chartObj.draw( _this.chartData, _this.chartOptions ); }); } // Load chart by pie chart AysChartBuilder.prototype.chartConvertData = function( data ){ var _this = this; // var dataTypes = [['Option', 'Value', { role: 'style' }]]; var dataTypes = [['Option', 'Value']]; // var defaultColors = _this.chartSourceData.settings['colors']; // Collect data in new array for chart rendering for ( var key in data ) { if ( data.hasOwnProperty( key ) ) { // var columnColor = (key <= 10) ? defaultColors[key] : Math.floor( Math.random() * 16777215 ).toString(16); dataTypes.push([ data[key][0], +(data[key][1]) ]); } } return dataTypes; } // Update chart data and display immediately AysChartBuilder.prototype.updateChartData = function( newData ){ var _this = this; _this.chartObj.draw( newData, _this.chartOptions ); } AysChartBuilder.prototype.addChartDataRow = function (element){ // var deleteImageUrl = ChartBuilderSourceData.removeManualDataRow; var content = ''; var addedTermsandConds = this.$el.find("."+this.htmlClassPrefix+"chart-source-data-edit-block"); var addedTermsandCondsId = this.$el.find("."+this.htmlClassPrefix+"chart-source-data-edit-block:last-child"); var dataId = addedTermsandConds.length >= 1 ? addedTermsandCondsId.data("sourceId") + 1 : 1; var colCount = addedTermsandConds.first().children().length - 1; var termsCondsMessageAttrName = this.newTermsCondsMessageAttrName( this.htmlNamePrefix + 'chart_source_data' , dataId ); // content += '