{"version":3,"file":"GraphinaApexChartBase-C-IYbsiB.js","sources":["../assets/elementor/js/apex-chart/GraphinaApexChartBase.js"],"sourcesContent":["// Parent class to manage shared functionalities for Graphina charts\nexport default class GraphinaApexChartBase {\n constructor() {\n this.chartHandlers = {};\n this.init();\n this.mainChart = {}\n }\n\n // Initialize the class by setting up handlers and events\n init() {\n this.setUpChartsHandler();\n this.bindEventHandlers();\n }\n\n // Bind event listeners\n bindEventHandlers() {\n jQuery(document.body).on('change', '.graphina-select-apex-chart-type', this.debounce(this.handleChartTypeChange.bind(this), 300)); \n jQuery(window).on('elementor/frontend/init', this.handleElementorWidgetInit.bind(this));\n jQuery(window).on('elementor/editor/init', this.handleElementorWidgetInit.bind(this));\n jQuery(document.body).off('click','.graphina-filter-div-button.apex')\n jQuery(document.body).on('click','.graphina-filter-div-button.apex', this.debounce(this.handleChartFilter.bind(this), 300));\n }\n\n debounce(func, wait) {\n let timeout;\n \n return function(...args) {\n const context = this;\n clearTimeout(timeout);\n timeout = setTimeout(() => func.apply(context, args), wait);\n };\n }\n\n\n\n // Setup IntersectionObserver to call setupChart when the element is in the viewport\n observeChartElement(element, chartType) {\n const elementId = element.data('element_id')\n if (gcfe_public_localize.view_port === 'off') {\n if (!this.observer[elementId]) {\n this.observer[elementId] = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n // Element is in viewport; initialize the chart\n this.setupChart(jQuery(entry.target), chartType);\n // Stop observing the element after initializing the chart\n this.observer[elementId].unobserve(entry.target);\n // this.observer[elementID].unobserve(entry.target);\n this.observer[elementId].disconnect();\n }\n });\n }, { threshold: 0.1 }); // Trigger when at least 10% of the element is visible\n }\n this.observer[elementId].observe(element[0]); // Start observing the chart element\n } else {\n this.setupChart(element, chartType);\n }\n }\n \n // Change Chart Type Handler\n handleChartTypeChange(event){\n const dropdown = jQuery(event.target);\n const newChartType = dropdown.val();\n const elementId = dropdown.data('element_id');\n const chartElement = jQuery(`.graphina-elementor-chart[data-element_id=\"${elementId}\"]`);\n\n if (chartElement.length > 0) {\n this.updateChartType(chartElement, newChartType);\n }\n }\n\n handleChartFilter(event){\n const currentElement = event.currentTarget\n const elementId = jQuery(currentElement).data('element_id');\n const chartElement = jQuery(`.graphina-elementor-chart[data-element_id=\"${elementId}\"]`);\n let chartType = jQuery(chartElement).data('chart_type');\n if(chartElement.length > 0){\n this.updateChartType(chartElement, chartType,true);\n }\n }\n\n // Setup handlers for various chart types (to be implemented by child classes)\n setUpChartsHandler() {\n throw new Error('setUpChartsHandler method must be implemented by subclasses');\n }\n\n // Handle Elementor widget initialization\n handleElementorWidgetInit() {\n elementorFrontend.hooks.addAction('frontend/element_ready/widget', ($scope) => {\n const chartElement = $scope.find('.graphina-elementor-chart');\n if (chartElement.length > 0) {\n this.initializeCharts(chartElement);\n }\n });\n }\n\n // Initialize charts for a given element\n initializeCharts(chartElement) {\n const chartType = chartElement.data('chart_type');\n if (this.chartHandlers[chartType]) {\n this.chartHandlers[chartType](chartElement);\n }\n }\n\n // Format large numbers with suffixes\n formatNumber(value, decimal) {\n const suffixes = [\"\", \"K\", \"M\", \"B\", \"T\"];\n let index = 0;\n while (value >= 1000 && index < suffixes.length - 1) {\n value /= 1000;\n index++;\n }\n return value.toFixed(decimal) + suffixes[index];\n }\n\n // Apply legend tooltip formatting\n applyLegendTooltip(chartOptions, extraData,chart_type) {\n if (extraData.legend_show_series_value) {\n chartOptions.legend.tooltipHoverFormatter = (seriesName, opts) => {\n let value = opts.w.globals.series[opts.seriesIndex][opts.dataPointIndex];\n if(['polar','column','line','scatter','pie','donut','radial'].includes(chart_type)){\n value = opts.w.globals.series[opts.seriesIndex];\n }\n return `
${seriesName}:${value}
`;\n };\n }\n }\n\n // Apply X-axis label formatting\n applyXAxisFormatter(chartOptions, extraData) {\n if (extraData.xaxis_label_prefix_show) {\n chartOptions.xaxis.labels.formatter = (val) =>\n `${extraData.xaxis_label_prefix}${val}${extraData.xaxis_label_postfix}`;\n }\n }\n\n // Apply Y-axis label formatting\n applyYAxisFormatter(chartOptions, extraData, axisIndex = false) {\n const formatAxisLabels = (val, prefix, postfix, decimal, axisIndex) => {\n if (extraData.chart_yaxis_label_pointer) {\n return prefix + this.formatNumber(val, decimal) + postfix;\n } else if (extraData.yaxis_label_format && (axisIndex === 0 || axisIndex === false)) {\n return prefix + new Intl.NumberFormat(window.gcfe_public_localize.locale_with_hyphen, {\n minimumFractionDigits: decimal,\n maximumFractionDigits: decimal,\n }).format(val) + postfix;\n } else if (extraData.chart_opposite_yaxis_format_number && axisIndex === 1) {\n return prefix + new Intl.NumberFormat(window.gcfe_public_localize.locale_with_hyphen, {\n minimumFractionDigits: decimal,\n maximumFractionDigits: decimal,\n }).format(val) + postfix;\n }\n return prefix + val + postfix;\n };\n\n const updateYAxisLabels = (yaxis, prefix, postfix, decimal, axisIndex) => {\n if (!yaxis.labels) {\n yaxis.labels = {}; // Initialize yaxis.labels if it doesn't exist\n }\n yaxis.labels.formatter = (val) => formatAxisLabels(val, prefix, postfix, decimal, axisIndex);\n };\n if (axisIndex === false) {\n updateYAxisLabels(chartOptions.yaxis, extraData.yaxis_label_prefix, extraData.yaxis_label_postfix, extraData.decimal_in_float,axisIndex);\n } else if (axisIndex === 0 || axisIndex === 1) {\n let yaxis = chartOptions.yaxis[axisIndex];\n let prefix = axisIndex === 0 ? extraData.yaxis_label_prefix : extraData.chart_opposite_yaxis_label_prefix;\n let postfix = axisIndex === 0 ? extraData.yaxis_label_postfix : extraData.chart_opposite_yaxis_label_postfix;\n let decimal = extraData.decimal_in_float;\n updateYAxisLabels(yaxis, prefix, postfix, decimal, axisIndex);\n }\n }\n\n applyDataLabelFormatter(chartOptions,extraData){\n let datalabelPreFix = extraData.chart_datalabel_prefix ?? '';\n let datalabelPostFix = extraData.chart_datalabel_postfix ?? '';\n if (!chartOptions.dataLabels) {\n chartOptions.dataLabels = {}; // Initialize dataLabels if it doesn't exist\n } \n chartOptions.dataLabels.formatter = function (val) {\n if(extraData.chart_number_format_commas){\n val = new Intl.NumberFormat(window.gcfe_public_localize.locale_with_hyphen, {\n minimumFractionDigits: extraData.chart_datalabel_decimals_in_float,\n maximumFractionDigits: extraData.chart_datalabel_decimals_in_float,\n }).format(val);\n }\n return datalabelPreFix + val + datalabelPostFix\n }\n }\n\n async updateChartType(chartElement, newChartType,filter=false) {\n const elementId = chartElement.data('element_id');\n const chartOptions = chartElement.data('chart_options');\n const extraData = chartElement.data('extra_data');\n const settings = chartElement.data('settings');\n if (!chartOptions || !elementId || !newChartType) {\n console.error('Missing required chart options or element ID.');\n return;\n }\n\n // remove tooltip.shared if selected is column chart.\n if(newChartType === 'bar' && chartOptions.chart.type !== 'bar'){\n chartOptions.tooltip.shared = false\n }\n\n // Update the chart type in the options\n chartOptions.chart.type = newChartType;\n \n if(filter){\n // Filter Value\n let filterValue = []\n const totalFilter = jQuery(`#graphina_chart_filter_${elementId}`).data('total_filter');\n for (let index = 0; index < totalFilter; index++) {\n filterValue[index] = jQuery(`#graphina-start-date_${index}${elementId}`).val() ?? jQuery(`#graphina-drop_down_filter_${index}${elementId}`).val()\n }\n const dynamicData = await this.getDynamicData(settings, extraData, newChartType, elementId,filterValue);\n if(dynamicData.extra !== undefined){\n chartOptions.series = dynamicData.extra.series\n chartOptions.xaxis.categories = dynamicData.extra.category\n }else{\n chartOptions.series = []\n chartOptions.xaxis.categories = []\n }\n }\n // Destroy existing chart (if any)\n ApexCharts.exec(elementId, 'destroy');\n if( newChartType === 'column'){\n chartOptions.chart.type = 'bar'\n }\n // Create and render the new chart\n const chart = new ApexCharts(chartElement[0], chartOptions);\n\n chart.render()\n .then(() => console.log(`Chart updated to ${newChartType}.`))\n .catch((error) => console.error('Error updating chart:', error));\n }\n\n setFieldForForminator(response, chartType, extraData) {\n const isAggregate = extraData.section_chart_forminator_aggregate;\n const manualChartList = ['mixed', 'brush', 'gantt_google'];\n const options = manualChartList.includes(chartType) \n ? response.forminator_columns \n : response.extra.forminator_columns;\n \n if (isAggregate) {\n this.populateDropdownField(\n `[data-setting=\"${extraData.graphina_prefix}${chartType}_section_chart_forminator_aggregate_column\"]`,\n options,\n extraData.section_chart_forminator_aggregate_column\n );\n } else {\n this.populateDropdownField(\n `[data-setting=\"${extraData.graphina_prefix}${chartType}_section_chart_forminator_x_axis_columns\"]`,\n options,\n extraData.section_chart_forminator_x_axis_columns\n );\n this.populateDropdownField(\n `[data-setting=\"${extraData.graphina_prefix}${chartType}_section_chart_forminator_y_axis_columns\"]`,\n options,\n extraData.section_chart_forminator_y_axis_columns\n );\n }\n }\n \n setFieldsForCSV(settings, response, chartType, extraData) {\n const isSQLBuilder = extraData.chart_dynamic_data_option === 'sql-builder';\n const options = isSQLBuilder ? response.extra.db_column : response.extra.column;\n \n this.populateDropdownField(\n `[data-setting=\"${extraData.graphina_prefix}${chartType}_${isSQLBuilder ? 'chart_sql_builder_x_columns' : 'chart_csv_x_columns'}\"]`,\n options,\n isSQLBuilder ? extraData.chart_csv_x_columns_sql : extraData.chart_csv_x_columns\n );\n \n this.populateDropdownField(\n `[data-setting=\"${extraData.graphina_prefix}${chartType}_${isSQLBuilder ? 'chart_sql_builder_y_columns' : 'chart_csv_y_columns'}\"]`,\n options,\n isSQLBuilder ? extraData.chart_csv_y_columns_sql : extraData.chart_csv_y_columns\n );\n }\n \n // Helper function to populate dropdown fields\n populateDropdownField(selector, options, selectedValues) {\n const element = parent.document.querySelector(selector);\n if (!element) return;\n \n element.innerHTML = ''; // Clear existing options\n \n try {\n options.forEach(option => {\n const isSelected = Array.isArray(selectedValues) \n ? selectedValues.includes(option) \n : selectedValues === option;\n element.append(new Option(option, option, isSelected, isSelected));\n });\n } catch (error) {\n console.log(error);\n }\n }\n \n setFieldsForCounter(settings,response, chartType,extraData){\n return true\n }\n\n getDynamicData(settings, extraData, chartType, elementId,filterValue) {\n\n let action = 'graphina_get_dynamic_data'\n let req_nonce = gcfe_public_localize.nonce\n if(chartType === 'counter'){\n action = 'get_jquery_datatable_data'\n req_nonce = gcfe_public_localize.table_nonce\n }\n let post_id = jQuery(`[data-element_id=\"${elementId}\"]`).closest('[data-elementor-id]').data('elementor-id');\n return new Promise((resolve, reject) => {\n jQuery.ajax({\n url: gcfe_public_localize.ajaxurl,\n type: 'POST',\n dataType: 'json',\n data: {\n action : action,\n nonce : req_nonce,\n chartType : chartType,\n post_id : post_id,\n element_id : elementId,\n series_count: extraData.chart_data_series_count_dynamic,\n settings : JSON.stringify(settings),\n selected_field: filterValue\n },\n success: (response) => {\n if (response.status) {\n if (jQuery('body').hasClass(\"elementor-editor-active\")) {\n if(chartType === 'counter'){\n this.setFieldsForCounter(settings,response, chartType,extraData);\n }\n if((extraData.chart_csv_column_wise_enable || extraData.chart_dynamic_data_option === 'sql-builder') && (extraData.chart_dynamic_data_option === 'csv' || extraData.chart_dynamic_data_option === 'remote-csv' || extraData.chart_dynamic_data_option === 'google-sheet' || extraData.chart_dynamic_data_option === 'sql-builder')){\n this.setFieldsForCSV(settings,response, chartType,extraData);\n }\n if(extraData.dynamic_type === 'forminator'){\n this.setFieldForForminator(response,chartType,extraData);\n }\n };\n }\n resolve(response);\n },\n error: (error) => {\n console.error('AJAX Error:', error);\n reject(new Error('AJAX request failed.'));\n },\n });\n });\n }\n \n getChartOptions(finalChartOptions,chartType,extraData,responsive_options,elementId){\n return finalChartOptions;\n }\n\n afterRenderChart(chart,elementId,extraData){\n return chart\n }\n\n processDynamicData(dynamicData,elementId,extraData){\n return true;\n }\n\n afterManualLoad(dynamicData,elementId,extraData){\n return true\n }\n afterDynamicLoad(dynamicData,elementId,extraData){\n return true\n }\n \n \n // Generic setup for any chart type\n async setupChart(element, chartType) {\n try {\n const elementId = element.data('element_id');\n const chartOptions = element.data('chart_options');\n const responsive_options = element.data('responsive_options');\n const extraData = element.data('extra_data');\n const settings = element.data('settings');\n const chart_type = element.data('chart_type')\n \n if('nested_column' === chart_type){\n chartType = chart_type\n }else if('brush' === chart_type){\n chartType = chart_type\n }else if('column' === chart_type){\n chartType = chart_type\n }\n if (!chartOptions || !elementId) {\n console.error(`Missing required data attributes for ${chartType} chart.`);\n return;\n }\n\n if(extraData.chart_data_option === true) {\n try {\n let filterValue = []\n const totalFilter = jQuery(`#graphina_chart_filter_${elementId}`).data('total_filter');\n for (let index = 0; index < totalFilter; index++) {\n filterValue[index] = jQuery(`#graphina-start-date_${index}${elementId}`).val() ?? jQuery(`#graphina-drop_down_filter_${index}${elementId}`).val()\n }\n const dynamicData = await this.getDynamicData(settings, extraData, chartType, elementId,filterValue);\n this.processDynamicData(dynamicData,elementId,extraData);\n if(dynamicData.extra !== undefined){\n if('nested_column' === chart_type){\n chartOptions.series = [{data:dynamicData.extra.series}]\n }else{\n chartOptions.series = dynamicData.extra.series\n chartOptions.xaxis.categories = dynamicData.extra.category\n }\n }else{\n chartOptions.series = []\n chartOptions.xaxis.categories = []\n }\n this.afterDynamicLoad(dynamicData,elementId,extraData);\n } catch (error) {\n console.error('Failed to get dynamic data:', error);\n }\n jQuery(document).find(`.graphina-${elementId}-loader`).hide()\n }else{\n this.afterManualLoad([],elementId,extraData);\n }\n\n // Apply formatting to chart options\n this.applyLegendTooltip(chartOptions, extraData,chart_type);\n this.applyXAxisFormatter(chartOptions, extraData);\n this.applyDataLabelFormatter(chartOptions, extraData);\n\n if (!extraData.chart_opposite_yaxis_title_enable) {\n this.applyYAxisFormatter(chartOptions, extraData, false);\n } else {\n this.applyYAxisFormatter(chartOptions, extraData, 0);\n this.applyYAxisFormatter(chartOptions, extraData, 1);\n }\n\n // Finalize and render the chart\n const finalChartOptions = this.getChartOptions(chartOptions, chartType,extraData,responsive_options,elementId);\n if(this.mainChart[elementId]){\n this.mainChart[elementId].destroy()\n }\n const chart = new ApexCharts(jQuery(element)[0], finalChartOptions);\n await chart.render();\n this.mainChart[elementId] = chart\n this.afterRenderChart(chart,elementId,extraData)\n if (extraData.can_chart_reload_ajax) {\n // Set up periodic data fetching using intervals\n setInterval(async () => {\n try {\n const dynamicDataLoad = await this.getDynamicData(settings, extraData, chartType, elementId);\n if (dynamicDataLoad?.extra) {\n chart.updateSeries(dynamicDataLoad.extra.series);\n chart.updateOptions(dynamicDataLoad.chart_option);\n } else {\n console.warn(`No data returned for ${chartType} chart with ID ${elementId}.`);\n }\n } catch (error) {\n console.warn(`Error fetching dynamic data for ${chartType} chart with ID ${elementId}:`);\n }\n }, extraData.interval_data_refresh * 1000);\n }\n\n } catch (error) {\n console.error(`Error initializing ${chartType} chart:`, error);\n }\n }\n \n}\n"],"names":["GraphinaApexChartBase","func","wait","timeout","args","context","element","chartType","elementId","entries","entry","event","dropdown","newChartType","chartElement","currentElement","$scope","value","decimal","suffixes","index","chartOptions","extraData","chart_type","seriesName","opts","val","axisIndex","formatAxisLabels","prefix","postfix","updateYAxisLabels","yaxis","datalabelPreFix","datalabelPostFix","filter","settings","filterValue","totalFilter","dynamicData","error","response","isAggregate","options","isSQLBuilder","selector","selectedValues","option","isSelected","action","req_nonce","post_id","resolve","reject","finalChartOptions","responsive_options","chart","dynamicDataLoad"],"mappings":"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"}