(function($) { 'use strict'; function ChartBuilderChartsJs(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.chartType = 'pie_chart'; this.chartSourceType = 'chart-js'; this.chartObject = null; this.chartSources = { 'pie_chart' : 'Pie Chart', 'bar_chart' : 'Bar Chart', 'line_chart' : 'Line Chart', } this.init(); return this; } ChartBuilderChartsJs.prototype.init = function() { var _this = this; _this.chartSourceData = window.ChartBuilderSourceData; _this.setEvents(); _this.initLibraries(); _this.setAccordionEvents(); }; // Set events ChartBuilderChartsJs.prototype.setEvents = function(e){ var _this = this; _this.chartType = _this.chartSourceData.chartType; _this.chartSourceType = _this.chartSourceData.chartSourceType; _this.chartData = _this.chartSourceData.source; _this.loadChartBySource(); _this.configureOptions(); _this.resizeChart(); /* == Tabulation == */ _this.$el.on('click', '.nav-tab-wrapper a.nav-tab' , _this.changeTabs); /* */ /* == 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.addChartDataColumn(); }); _this.$el.on('click', '.'+_this.htmlClassPrefix+'show-on-chart-bttn', function(e){ e.preventDefault(); _this.showOnChart(); }); /* */ /* Delete data */ _this.$el.on("click" , '.'+_this.htmlClassPrefix+'chart-source-data-remove-row', function(){ _this.deleteChartDataRow($(this)); _this.detectManualChange(); }); _this.$el.on("click" , '.'+_this.htmlClassPrefix+'chart-source-data-remove-col', function(){ _this.deleteChartDataColumn($(this)); _this.detectManualChange(); }); _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'); }); /* */ /* 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.keyBoardConfig.bind(_this)); /* */ // Modal close $(document).on('click', '.ays-close', function () { $(this).parents('.ays-modal').aysModal('hide'); }); // Changing source type to manual _this.$el.on('input', '.'+_this.htmlClassPrefix+'chart-source-data-content input', function () { _this.detectManualChange(); }); // Shortcode text for editor tooltip $(document).find('strong.ays-chart-shortcode-box').on('mouseleave', function(){ var _this = $(this); _this.attr('data-original-title', aysChartBuilderAdmin.clickForCopy); _this.attr("data-bs-original-title", aysChartBuilderAdmin.clickForCopy); _this.attr("title", aysChartBuilderAdmin.clickForCopy); }); _this.$el.find('.'+_this.htmlClassPrefix+'toggle-hidden-option').on('change', function () { // var animationOptions = _this.$el.find('.'+_this.htmlClassPrefix+'hidden-options-section'); var currentSettings = $(this).parents('.' + _this.htmlClassPrefix + 'settings-data-main-wrap') var hiddenSection = currentSettings.find('.' + _this.htmlClassPrefix + 'hidden-options-section'); var notHiddenSection = currentSettings.find('.' + _this.htmlClassPrefix + 'not-hidden-options-section'); if ($(this).is(':checked')) { hiddenSection.removeClass('display_none'); notHiddenSection.addClass('display_none'); } else { hiddenSection.addClass('display_none'); notHiddenSection.removeClass('display_none'); } }); _this.$el.on("click", '.'+_this.htmlClassPrefix+'chart-source-data-sort', function(){ _this.sortDataByColumn($(this)); _this.detectManualChange(); }); // Live preview _this.liveSettingsPreview(); } ChartBuilderChartsJs.prototype.liveSettingsPreview = function () { var _this = this; // title _this.$el.find('#ays-title').on('input', function () { _this.$el.find('.'+_this.htmlClassPrefix+'charts-title').text($(this).val()); }); // description _this.$el.find('#'+_this.htmlClassPrefix+'description').on('input', function () { _this.$el.find('.'+_this.htmlClassPrefix+'charts-description').text($(this).val()); }); // advanced options _this.$el.find('#'+_this.htmlClassPrefix+'option-outer-radius').on('input', function () { _this.chartSourceData.settings.outer_radius = $(this).val(); _this.chartObject.options.radius = _this.chartSourceData.settings.outer_radius; _this.chartObject.update(); }); _this.$el.find('#'+_this.htmlClassPrefix+'option-slice-spacing').on('input', function () { _this.chartSourceData.settings.slice_spacing = $(this).val(); _this.chartObject.options.spacing = _this.chartSourceData.settings.slice_spacing; _this.chartObject.update(); }); _this.$el.find('#'+_this.htmlClassPrefix+'option-circumference').on('input', function () { _this.chartSourceData.settings.circumference = $(this).val(); _this.chartObject.options.circumference = _this.chartSourceData.settings.circumference; _this.chartObject.update(); }); _this.$el.find('#'+_this.htmlClassPrefix+'option-start-angle').on('input', function () { _this.chartSourceData.settings.start_angle = $(this).val(); _this.chartObject.options.rotation = _this.chartSourceData.settings.start_angle; _this.chartObject.update(); }); } ChartBuilderChartsJs.prototype.detectManualChange = function (e) { var input = $(document).find('input[name="ays_source_type"]'); if (input.val() !== 'manual') input.val('manual'); } ChartBuilderChartsJs.prototype.keyBoardConfig = function(e) { if (e.which == 13) { if ($(document).find("#ays-charts-form-chart-js").length !== 0 || $(document).find("#ays-settings-form").length !== 0) { var parent = $(e.target).parents('.ays-chart-chart-source-data-edit-block'); var index = $(e.target).parents('.ays-chart-chart-source-data-input-box').index(); index = parent.index() == 0 ? index - 1 : index - 2; if (e.shiftKey) { var prevRow; if (parent.prev('.ays-chart-chart-source-data-edit-block').length === 0) { return false; } prevRow = parent.prev('.ays-chart-chart-source-data-edit-block'); prevRow.children('.ays-chart-chart-source-data-input-box').eq(index).find('.ays-text-input').focus(); } else { var nextRow; if (parent.next('.ays-chart-chart-source-data-edit-block').length === 0) { this.addChartDataRow(); } nextRow = parent.next('.ays-chart-chart-source-data-edit-block'); nextRow.children('.ays-chart-chart-source-data-input-box').eq(index).find('.ays-text-input').focus(); } return false; } } } // Change tabs (tabulation) ChartBuilderChartsJs.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).removeClass('ays-tab-content-active'); }); $(document).find("[name='ays_chart_tab']").val(active_tab); $('.ays-tab-content' + elemenetID).addClass('ays-tab-content-active'); e.preventDefault(); } } ChartBuilderChartsJs.prototype.changeCurrentUrl = function(key){ 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); } ChartBuilderChartsJs.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; } } ChartBuilderChartsJs.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 ChartBuilderChartsJs.prototype.initLibraries = function (){ var _this = this; _this.$el.find('#ays-chart-option-create-author').select2({ placeholder: aysChartBuilderAdmin.selectUser, minimumInputLength: 1, allowClear: true, language: { searching: function() { return aysChartBuilderAdmin.searching; }, inputTooShort: function () { return aysChartBuilderAdmin.pleaseEnterMore; } }, ajax: { url: ajaxurl, dataType: 'json', data: function (response) { var checkedUsers = _this.$el.find('#ays-chart-option-create-author').val(); return { action: _this.ajaxAction, function: window.aysChartBuilderChartSettings.ajax['actions']['author_user_search'], security: window.aysChartBuilderChartSettings.ajax['nonces']['author_user_search'], params: { search: response.term, val: checkedUsers } }; } } }); _this.$el.find('.' + _this.htmlClassPrefix + 'chart-source-data-content').sortable({ items: "> div." + _this.htmlClassPrefix + "chart-source-data-edit-block:not(:first)", handle: "." + _this.htmlClassPrefix + "chart-source-data-move-row", update: function (event, ui) { _this.$el.find('div.' + _this.htmlClassPrefix + 'chart-source-data-edit-block:not(:first)').each(function (index) { $(this).attr('data-source-id', index + 1); $(this).find("input.ays-text-input").attr('name', 'ays_chart_source_data[' + (index + 1) + '][]') }); } }); } // Load charts by given type main function ChartBuilderChartsJs.prototype.loadChartBySource = function(isChangedType = false){ var _this = this; if( ! _this.chartType ){ _this.chartType = _this.chartSourceData.chartType; } if(typeof _this.chartType !== undefined && _this.chartType){ switch (_this.chartType) { case 'pie_chart': _this.pieChartView(isChangedType); break; case 'bar_chart': _this.barChartView(isChangedType); break; case 'line_chart': _this.lineChartView(isChangedType); break; default: _this.pieChartView(isChangedType); break; } } } // Load chart by pie chart ChartBuilderChartsJs.prototype.pieChartView = function(isChangedType){ var _this = this; var getChartSource = _this.chartSourceData.source; var dataTypes = _this.chartConvertData( getChartSource ); var settings = _this.chartSourceData.settings; var nSettings = _this.configOptionsForCharts(settings); var ctx = document.getElementById(_this.htmlClassPrefix + '-canvas'); _this.chartObject = new Chart(ctx, { type: 'pie', data: { labels: dataTypes?.labels, datasets: dataTypes?.dataSets, }, options: { radius: nSettings.outerRadius, spacing: nSettings.sliceSpacing, circumference: nSettings.circumference, rotation: nSettings.startAngle, } }); _this.resizeChart(); } // Load chart by bar chart ChartBuilderChartsJs.prototype.barChartView = function(isChangedType){ var _this = this; var getChartSource = _this.chartSourceData.source; var dataTypes = _this.chartConvertData( getChartSource ); var settings = _this.chartSourceData.settings; var nSettings = _this.configOptionsForCharts(settings); var ctx = document.getElementById(_this.htmlClassPrefix + '-canvas'); _this.chartObject = new Chart(ctx, { type: 'bar', data: { labels: dataTypes?.labels, datasets: dataTypes?.dataSets, }, options: { // indexAxis: nSettings.indexAxis, } }); _this.resizeChart(); } // Load chart by line chart ChartBuilderChartsJs.prototype.lineChartView = function(isChangedType){ var _this = this; var getChartSource = _this.chartSourceData.source; var dataTypes = _this.chartConvertData( getChartSource ); var settings = _this.chartSourceData.settings; var nSettings = _this.configOptionsForCharts(settings); var ctx = document.getElementById(_this.htmlClassPrefix + '-canvas'); _this.chartObject = new Chart(ctx, { type: 'line', data: { labels: dataTypes?.labels, datasets: dataTypes?.dataSets, }, options: { // indexAxis: nSettings.indexAxis, } }); _this.resizeChart(); } /* Configure all settings for all chart types Getting settings for each chart type in respective function */ ChartBuilderChartsJs.prototype.configOptionsForCharts = function (settings) { var newSettings = {}; // newSettings.indexAxis = (settings['index_axis'] == 'checked') ? 'y' : 'x'; newSettings.outerRadius = settings['outer_radius']; newSettings.sliceSpacing = settings['slice_spacing']; newSettings.circumference = settings['circumference']; newSettings.startAngle = settings['start_angle']; return newSettings; } // Detect window resize moment to draw charts responsively ChartBuilderChartsJs.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.chartObject.resize(); }); } ChartBuilderChartsJs.prototype.chartConvertData = function( data ){ var _this = this; var dataTypes = []; var dataTypes = Array.from({ length: data[0].length }, () => []); for (var i = 0; i < data.length; i++) { for (var j = 0; j < data[i].length; j++) { if (i === 0) { dataTypes[j].push(data[i][j]); } else { dataTypes[j].push(i === 0 || j === 0 ? data[i][j] : +data[i][j]); } } } var labels = dataTypes.shift(); labels.shift(); var dataSets = dataTypes.map(item => ({ label: item[0], data: item.slice(1).map(Number), })); return {labels, dataSets}; } // Update chart data and display immediately ChartBuilderChartsJs.prototype.updateChartData = function(){ var _this = this; var newData = _this.chartConvertData( _this.chartData ); _this.chartObject.data = { ..._this.chartObject.data, labels: newData?.labels, datasets: newData?.dataSets, }, _this.chartObject.update(); } ChartBuilderChartsJs.prototype.addChartDataRow = function (element){ var _this = this; 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 += '