{"version":3,"file":"GraphinaApexChartBase-_qBnvcoG.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                            delete this.observer[elementId];\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            ApexCharts.exec(elementId, 'destroy');\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            \n        // Destroy existing chart (if any)\n            ApexCharts.exec(elementId, 'destroy');\n            console.log(jQuery(document).find(`.graphina-${elementId}-loader`));\n\n            jQuery(document).find(`.graphina-${elementId}-loader`).show()\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 new Intl.NumberFormat(window.gcfe_public_localize.locale_with_hyphen, {\n            minimumFractionDigits: decimal,\n            maximumFractionDigits: decimal,\n        }).format(value) + 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                seriesName = decodeURIComponent(seriesName);\n                if(['polar','column','line','scatter','pie','donut','radial'].includes(chart_type)){\n                    value = opts.w.globals.series[opts.seriesIndex];\n                }\n                return `<div class=\"legend-info\"><span>${seriesName}</span>:<strong>${value}</strong></div>`;\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        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        jQuery(document).find(`.graphina-${elementId}-loader`).hide()\n\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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"}