{"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 `