PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.4.2
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.4.2
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 3.10.4 All 148 releases
← All changes | classes/Visualizer/Module/Admin.php +79 -302 3.10.23.4.2 View file →
@@ -53,19 +53,17 @@
53 53 parent::__construct( $plugin );
54 54 $this->_addAction( 'load-post.php', 'enqueueMediaScripts' );
55 55 $this->_addAction( 'load-post-new.php', 'enqueueMediaScripts' );
56 56 $this->_addAction( 'admin_footer', 'renderTemplates' );
57 - $this->_addAction( 'admin_enqueue_scripts', 'enqueueLibraryScripts', null, 0 );
57 + $this->_addAction( 'admin_enqueue_scripts', 'enqueueLibraryScripts', null, 8 );
58 58 $this->_addAction( 'admin_menu', 'registerAdminMenu' );
59 59 $this->_addFilter( 'media_view_strings', 'setupMediaViewStrings' );
60 60 $this->_addFilter( 'plugin_action_links', 'getPluginActionLinks', 10, 2 );
61 61 $this->_addFilter( 'plugin_row_meta', 'getPluginMetaLinks', 10, 2 );
62 62 $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
63 + $this->_addFilter( 'visualizer_get_chart_counts', 'getChartCountsByTypeAndMeta' );
63 64 $this->_addFilter( 'visualizer_feedback_review_trigger', 'feedbackReviewTrigger' );
64 65
65 - // screen pagination
66 - $this->_addFilter( 'set-screen-option', 'setScreenOptions', 10, 3 );
67 -
68 66 // revision support.
69 67 $this->_addFilter( 'wp_revisions_to_keep', 'limitRevisions', null, 10, 2 );
70 68 $this->_addAction( '_wp_put_post_revision', 'addRevision', null, 10, 1 );
71 69 $this->_addAction( 'wp_restore_post_revision', 'restoreRevision', null, 10, 2 );
@@ -73,10 +71,8 @@
73 71 $this->_addAction( 'visualizer_chart_schedules_spl', 'addSplChartSchedules', null, 10, 3 );
74 72
75 73 $this->_addAction( 'admin_init', 'init' );
76 74
77 - $this->_addAction( 'visualizer_chart_languages', 'addMultilingualSupport' );
78 -
79 75 if ( defined( 'TI_CYPRESS_TESTING' ) ) {
80 76 $this->load_cypress_hooks();
81 77 }
82 78
@@ -315,9 +311,9 @@
315 311
316 312 // Load all the assets for the different libraries we support.
317 313 $deps = array(
318 314 Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) ),
319 - Visualizer_Render_Sidebar_Type_DataTable_Tabular::enqueue_assets( array( 'media-editor' ) ),
315 + Visualizer_Render_Sidebar_Type_DataTable_DataTable::enqueue_assets( array( 'media-editor' ) ),
320 316 );
321 317
322 318 wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', $deps, Visualizer_Plugin::VERSION, true );
323 319 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
@@ -366,9 +362,9 @@
366 362 'filters' => $chart_types,
367 363 'types' => array_keys( $chart_types ),
368 364 ),
369 365 'nonce' => wp_create_nonce(),
370 - 'buildurl' => esc_url( add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ) ),
366 + 'buildurl' => add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ),
371 367 );
372 368
373 369 return $strings;
374 370 }
@@ -390,71 +386,74 @@
390 386 'enabled' => true,
391 387 );
392 388 }
393 389
394 - $enabled = self::proFeaturesLocked();
395 -
396 390 $types = array_merge(
397 391 $additional,
398 392 array(
399 - 'tabular' => array(
393 + 'dataTable' => array(
400 394 'name' => esc_html__( 'Table', 'visualizer' ),
401 395 'enabled' => true,
402 - 'supports' => $enabled ? array( 'Google Charts', 'DataTable' ) : array( 'DataTable' ),
396 + 'supports' => array( 'DataTable' ),
403 397 ),
404 398 'pie' => array(
405 399 'name' => esc_html__( 'Pie/Donut', 'visualizer' ),
406 400 'enabled' => true,
407 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
401 + 'supports' => array( 'Google Charts', 'ChartJS' ),
408 402 ),
409 403 'line' => array(
410 404 'name' => esc_html__( 'Line', 'visualizer' ),
411 405 'enabled' => true,
412 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
406 + 'supports' => array( 'Google Charts', 'ChartJS' ),
413 407 ),
414 - 'bar' => array(
415 - 'name' => esc_html__( 'Bar', 'visualizer' ),
416 - 'enabled' => true,
417 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
418 - ),
419 408 'area' => array(
420 409 'name' => esc_html__( 'Area', 'visualizer' ),
421 - 'enabled' => $enabled,
410 + 'enabled' => true,
422 411 // in ChartJS, the fill option is used to make Line chart an area: https://www.chartjs.org/docs/latest/charts/area.html
423 412 'supports' => array( 'Google Charts' ),
424 413 ),
425 414 'geo' => array(
426 415 'name' => esc_html__( 'Geo', 'visualizer' ),
427 - 'enabled' => $enabled,
416 + 'enabled' => true,
428 417 'supports' => array( 'Google Charts' ),
429 418 ),
419 + 'bar' => array(
420 + 'name' => esc_html__( 'Bar', 'visualizer' ),
421 + 'enabled' => true,
422 + 'supports' => array( 'Google Charts', 'ChartJS' ),
423 + ),
430 424 'column' => array(
431 425 'name' => esc_html__( 'Column', 'visualizer' ),
432 - 'enabled' => $enabled,
426 + 'enabled' => true,
433 427 'supports' => array( 'Google Charts', 'ChartJS' ),
434 428 ),
435 429 'bubble' => array(
436 430 'name' => esc_html__( 'Bubble', 'visualizer' ),
437 - 'enabled' => $enabled,
431 + 'enabled' => true,
438 432 // chartjs' bubble is ugly looking (and it won't work off the default bubble.csv) so it is being excluded for the time being.
439 433 'supports' => array( 'Google Charts' ),
440 434 ),
441 435 'scatter' => array(
442 436 'name' => esc_html__( 'Scatter', 'visualizer' ),
443 - 'enabled' => $enabled,
437 + 'enabled' => true,
444 438 'supports' => array( 'Google Charts' ),
445 439 ),
446 440 'gauge' => array(
447 441 'name' => esc_html__( 'Gauge', 'visualizer' ),
448 - 'enabled' => $enabled,
442 + 'enabled' => true,
449 443 'supports' => array( 'Google Charts' ),
450 444 ),
451 445 'candlestick' => array(
452 446 'name' => esc_html__( 'Candlestick', 'visualizer' ),
453 - 'enabled' => $enabled,
447 + 'enabled' => true,
454 448 'supports' => array( 'Google Charts' ),
455 449 ),
456 450 // pro types
451 + 'table' => array(
452 + 'name' => esc_html__( 'Table (Deprecated)', 'visualizer' ),
453 + 'enabled' => false,
454 + 'supports' => array( 'Google Charts' ),
455 + ),
457 456 'timeline' => array(
458 457 'name' => esc_html__( 'Timeline', 'visualizer' ),
459 458 'enabled' => false,
460 459 'supports' => array( 'Google Charts', 'ChartJS' ),
@@ -523,8 +522,18 @@
523 522 switch ( $where ) {
524 523 case 'types':
525 524 // fall-through
526 525 case 'library':
526 + // if the user has a Google Table chart, show it as deprecated otherwise remove the option from the library.
527 + if ( ! self::hasChartType( 'table' ) ) {
528 + $deprecated[] = 'table';
529 + if ( $get2Darray ) {
530 + $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
531 + } else {
532 + $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
533 + }
534 + }
535 +
527 536 // if a user has a Gauge/Candlestick chart, then let them keep using it.
528 537 if ( ! Visualizer_Module::is_pro() ) {
529 538 if ( ! self::hasChartType( 'gauge' ) ) {
530 539 if ( $get2Darray ) {
@@ -542,8 +551,18 @@
542 551 }
543 552 }
544 553 break;
545 554 default:
555 + // remove the option to create a Google Table chart.
556 + $deprecated[] = 'table';
557 +
558 + // rename the new table chart type.
559 + if ( $get2Darray ) {
560 + $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
561 + } else {
562 + $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
563 + }
564 +
546 565 // if a user has a Gauge/Candlestick chart, then let them keep using it.
547 566 if ( ! Visualizer_Module::is_pro() ) {
548 567 if ( ! self::hasChartType( 'gauge' ) ) {
549 568 if ( $get2Darray ) {
@@ -610,9 +629,8 @@
610 629 VISUALIZER_ABSURL . 'js/library.js',
611 630 array(
612 631 'jquery',
613 632 'media-views',
614 - 'clipboard',
615 633 ),
616 634 Visualizer_Plugin::VERSION,
617 635 true
618 636 );
@@ -687,151 +705,12 @@
687 705 'edit_posts',
688 706 'viz-support',
689 707 array( $this, 'renderSupportPage' )
690 708 );
691 -
692 709 remove_submenu_page( Visualizer_Plugin::NAME, Visualizer_Plugin::NAME );
693 -
694 - add_action( "load-{$this->_libraryPage}", array( $this, 'addScreenOptions' ) );
695 - add_action( 'admin_footer', array( $this, 'handleGetProSubMenu' ) );
696 710 }
697 711
698 712 /**
699 - * Handle get pro plugin submenu.
700 - */
701 - public function handleGetProSubMenu() {
702 - if ( ! Visualizer_Module::is_pro() ) {
703 - ?>
704 - <style type="text/css">
705 - #toplevel_page_visualizer ul.wp-submenu li:last-child {
706 - background: #FF7E65;
707 - font-size: 14px;
708 - font-weight: 600;
709 - color: #fff;
710 - }
711 - #toplevel_page_visualizer ul.wp-submenu li:last-child > a {
712 - color: #fff !important;
713 - }
714 - #toplevel_page_visualizer ul.wp-submenu li:last-child > a:hover {
715 - box-shadow: inherit;
716 - }
717 - </style>
718 - <?php
719 - if ( get_option( 'visualizer_fresh_install', false ) ) {
720 - ?>
721 - <style type="text/css">
722 - #toplevel_page_visualizer ul.wp-submenu li.wp-first-item + li + li + li {
723 - display: none;
724 - }
725 - </style>
726 - <?php
727 - }
728 - }
729 - }
730 -
731 - /**
732 - * Adds the screen options for pagination.
733 - */
734 - function addScreenOptions() {
735 - $screen = get_current_screen();
736 -
737 - // bail if it's some other page.
738 - if ( ! is_object( $screen ) || $screen->id !== $this->_libraryPage ) {
739 - return;
740 - }
741 -
742 - $args = array(
743 - 'label' => __( 'Number of charts per page:', 'visualizer' ),
744 - 'default' => 6,
745 - 'option' => 'visualizer_library_per_page',
746 - );
747 - add_screen_option( 'per_page', $args );
748 - }
749 -
750 - /**
751 - * Returns the screen option for pagination.
752 - */
753 - function setScreenOptions( $status, $option, $value ) {
754 - if ( 'visualizer_library_per_page' === $option ) {
755 - return $value;
756 - }
757 - }
758 -
759 - /**
760 - * Adds the display filters to be used in the meta_query while displaying the charts.
761 - */
762 - private function getDisplayFilters( &$query_args ) {
763 - $query = array();
764 - global $sitepress;
765 - if ( Visualizer_Module::is_pro() && ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) ) {
766 - $current_lang = icl_get_current_language();
767 - if ( in_array( $current_lang, array( 'all', icl_get_default_language() ), true ) ) {
768 - $query[] = array(
769 - 'key' => 'chart_lang',
770 - 'compare' => 'NOT EXISTS',
771 - );
772 - } else {
773 - $query[] = array(
774 - 'key' => 'chart_lang',
775 - 'value' => $current_lang,
776 - 'compare' => '=',
777 - );
778 - }
779 - }
780 -
781 - // add chart type filter to the query arguments
782 - $type = filter_input( INPUT_GET, 'type' );
783 - if ( $type && in_array( $type, Visualizer_Plugin::getChartTypes(), true ) ) {
784 - $query[] = array(
785 - 'key' => Visualizer_Plugin::CF_CHART_TYPE,
786 - 'value' => $type,
787 - 'compare' => '=',
788 - );
789 - }
790 -
791 - // add chart library filter to the query arguments
792 - $library = filter_input( INPUT_GET, 'library' );
793 - if ( $library ) {
794 - $query[] = array(
795 - 'key' => Visualizer_Plugin::CF_CHART_LIBRARY,
796 - 'value' => $library,
797 - 'compare' => '=',
798 - );
799 - }
800 -
801 - // add date filter to the query arguments
802 - $date = filter_input( INPUT_GET, 'date' );
803 - $possible = array_keys( Visualizer_Plugin::getSupportedDateFilter() );
804 - if ( $date && in_array( $date, $possible, true ) ) {
805 - $query_args['date_query'] = array(
806 - 'after' => "$date -1 day",
807 - 'inclusive' => true,
808 - );
809 - }
810 -
811 - // add source filter to the query arguments
812 - $source = filter_input( INPUT_GET, 'source' );
813 - if ( $source ) {
814 - $source = ucwords( $source );
815 - $source = "Visualizer_Source_{$source}";
816 - $query[] = array(
817 - 'key' => Visualizer_Plugin::CF_SOURCE,
818 - 'value' => $source,
819 - 'compare' => '=',
820 - );
821 - }
822 -
823 - $query_args['meta_query'] = $query;
824 -
825 - $orderby = filter_input( INPUT_GET, 'orderby' );
826 - $order = filter_input( INPUT_GET, 'order' );
827 - if ( $orderby ) {
828 - $query_args['order_by'] = $orderby;
829 - }
830 - $query_args['order'] = empty( $order ) ? 'desc' : $order;
831 - }
832 -
833 - /**
834 713 * Get the instance of WP_Query that fetches the charts as per the given criteria.
835 714 */
836 715 private function getQuery() {
837 716 static $q;
@@ -850,34 +729,29 @@
850 729 'default' => 1,
851 730 ),
852 731 )
853 732 );
854 -
855 - $per_page = 6;
856 - $screen = get_current_screen();
857 - if ( $screen ) {
858 - // retrieve the per_page option
859 - $screen_option = $screen->get_option( 'per_page', 'option' );
860 - // retrieve the value stored for the current user
861 - $user = get_current_user_id();
862 - $per_page = get_user_meta( $user, $screen_option, true );
863 - if ( empty( $per_page ) || $per_page < 1 ) {
864 - // nothing set, get the default value
865 - $per_page = $screen->get_option( 'per_page', 'default' );
866 - }
867 - }
868 -
869 733 // the initial query arguments to fetch charts
870 734 $query_args = array(
871 735 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
872 - 'posts_per_page' => $per_page,
736 + 'posts_per_page' => 6,
873 737 'paged' => $page,
874 738 );
875 -
876 - $this->getDisplayFilters( $query_args );
877 -
739 + // add chart type filter to the query arguments
740 + $filter = filter_input( INPUT_GET, 'type' );
741 + if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes(), true ) ) {
742 + $query_args['meta_query'] = array(
743 + array(
744 + 'key' => Visualizer_Plugin::CF_CHART_TYPE,
745 + 'value' => $filter,
746 + 'compare' => '=',
747 + ),
748 + );
749 + } else {
750 + $filter = 'all';
751 + }
878 752 // Added by Ash/Upwork
879 - $filterByMeta = ! empty( $_GET['s'] ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
753 + $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
880 754 if ( $filterByMeta ) {
881 755 $query = array(
882 756 'key' => Visualizer_Plugin::CF_SETTINGS,
883 757 'value' => $filterByMeta,
@@ -955,22 +829,10 @@
955 829 unset( $settings['height'], $settings['width'], $settings['chartArea'] );
956 830 }
957 831
958 832 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
959 - $data = self::get_chart_data( $chart, $type );
833 + $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
960 834
961 - // Set default setting series when add manual chart data - Only during first creation.
962 - if ( isset( $settings['series'] ) && ! empty( $series ) ) {
963 - $count_series = count( $series ) - count( $settings['series'] );
964 - if ( $count_series > 1 ) {
965 - $clone_last_series = end( $settings['series'] );
966 - $clone_last_series = array_fill_keys( array_keys( $clone_last_series ), '' );
967 - foreach ( range( 1, $count_series ) as $item ) {
968 - $settings['series'][] = $clone_last_series;
969 - }
970 - }
971 - }
972 -
973 835 $library = $this->load_chart_type( $chart->ID );
974 836
975 837 $id = 'visualizer-' . $chart->ID;
976 838 $arguments = $this->get_inline_custom_css( $id, $settings );
@@ -978,15 +840,8 @@
978 840 $css .= $arguments[0];
979 841 $settings = $arguments[1];
980 842 }
981 843
982 - if ( isset( $settings['controls']['ui']['labelStacking'] ) ) {
983 - unset( $settings['controls']['ui']['labelStacking'] );
984 - }
985 - if ( isset( $settings['controls']['ui']['orientation'] ) ) {
986 - unset( $settings['controls']['ui']['orientation'] );
987 - }
988 -
989 844 // add chart to the array
990 845 $charts[ $id ] = array(
991 846 'id' => $chart->ID,
992 847 'type' => $type,
@@ -1005,38 +860,30 @@
1005 860 'language' => $this->get_language(),
1006 861 'map_api_key' => get_option( 'visualizer-map-api-key' ),
1007 862 'charts' => $charts,
1008 863 'urls' => array(
1009 - 'base' => esc_url( add_query_arg( array( 'vpage' => false, 'vaction' => false ) ) ),
1010 - 'create' => esc_url(
1011 - add_query_arg(
1012 - array(
1013 - 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
1014 - 'library' => 'yes',
1015 - 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
1016 - 'chart-library' => isset( $_GET['chart-library'] ) ? $_GET['chart-library'] : '',
1017 - 'vaction' => false,
1018 - ),
1019 - $ajaxurl
1020 - )
864 + 'base' => add_query_arg( array( 'vpage' => false, 'vaction' => false ) ),
865 + 'create' => add_query_arg(
866 + array(
867 + 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
868 + 'library' => 'yes',
869 + 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
870 + 'chart-library' => isset( $_GET['chart-library'] ) ? $_GET['chart-library'] : '',
871 + 'vaction' => false,
872 + ),
873 + $ajaxurl
1021 874 ),
1022 - 'edit' => esc_url(
1023 - add_query_arg(
1024 - array(
1025 - 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
1026 - 'library' => 'yes',
1027 - 'vaction' => false,
1028 - ),
1029 - $ajaxurl
1030 - )
875 + 'edit' => add_query_arg(
876 + array(
877 + 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
878 + 'library' => 'yes',
879 + 'vaction' => false,
880 + ),
881 + $ajaxurl
1031 882 ),
1032 883 ),
1033 884 'page_type' => 'library',
1034 885 'is_front' => false,
1035 - 'i10n' => array(
1036 - 'copied' => __( 'The shortcode has been copied to your clipboard. Hit Ctrl-V/Cmd-V to paste it.', 'visualizer' ),
1037 - 'conflict' => __( 'We have detected a potential conflict with another component that prevents Visualizer from functioning properly. Please disable any of the following components if they are activated on your instance: Modern Events Calendar plugin, Acronix plugin. In case the aforementioned components are not activated or you continue to see this error message, please disable all other plugins and enable them one by one to find out the component that is causing the conflict.', 'visualizer' ),
1038 - ),
1039 886 )
1040 887 );
1041 888 // render library page
1042 889 $render = new Visualizer_Render_Library();
@@ -1103,9 +950,9 @@
1103 950 esc_html__( 'Docs', 'visualizer' )
1104 951 );
1105 952 // flattr link
1106 953 $plugin_meta[] = sprintf(
1107 - '<a style="color:red" href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'pluginrow' ) . '" target="_blank">%s</a>',
954 + '<a style="color:red" href="' . Visualizer_Plugin::PRO_TEASER_URL . '" target="_blank">%s</a>',
1108 955 esc_html__( 'Pro Addon', 'visualizer' )
1109 956 );
1110 957 }
1111 958
@@ -1111,75 +958,5 @@
1111 958
1112 959 return $plugin_meta;
1113 960 }
1114 961
1115 - /**
1116 - * If check is existing user.
1117 - *
1118 - * @return bool Default false
1119 - */
1120 - public static function proFeaturesLocked() {
1121 - if ( Visualizer_Module::is_pro() ) {
1122 - return true;
1123 - }
1124 - return 'yes' === get_option( 'visualizer-new-user', 'yes' ) ? false : true;
1125 - }
1126 -
1127 - /**
1128 - * Multilingual Support.
1129 - *
1130 - * @param int $chart_id Chart ID.
1131 - * @return bool Default false
1132 - */
1133 - public function addMultilingualSupport( $chart_id ) {
1134 - global $sitepress;
1135 - if ( Visualizer_Module::is_pro() ) {
1136 - return;
1137 - }
1138 - if ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) {
1139 - $language = icl_get_languages();
1140 - $current_lang = icl_get_current_language();
1141 - $default_lang = icl_get_default_language();
1142 - $post_info = wpml_get_language_information( null, $chart_id );
1143 - $translations = array();
1144 - if ( ! empty( $post_info ) && ( $default_lang === $post_info['language_code'] ) ) {
1145 - $trid = $sitepress->get_element_trid( $chart_id, 'post_' . Visualizer_Plugin::CPT_VISUALIZER );
1146 - $translations = $sitepress->get_element_translations( $trid );
1147 - }
1148 - if ( empty( $translations ) ) {
1149 - return;
1150 - }
1151 - ?>
1152 - <hr><div class="visualizer-languages-list only-pro">
1153 - <?php
1154 - foreach ( $language as $lang ) {
1155 - $lang_code = $lang['code'];
1156 - if ( $current_lang !== $lang_code ) {
1157 - ?>
1158 - <a href="javascript:;">
1159 - <img src="<?php echo esc_url( $lang['country_flag_url'] ); ?>" alt="<?php echo esc_attr( $lang['translated_name'] ); ?>">
1160 - </a>
1161 - <?php
1162 - }
1163 - }
1164 - ?>
1165 - <a href="<?php echo tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'wpml-support', 'visualizer_render_char' ); ?>"target="_blank"><?php esc_html_e( 'Upgrade to PRO to active this translation for charts', 'visualizer' ); ?></a>
1166 - </div>
1167 - <?php
1168 - }
1169 - }
1170 -
1171 - /**
1172 - * Check chart is enabled or not.
1173 - *
1174 - * @param string $type Chart ID.
1175 - *
1176 - * @return bool Default false
1177 - */
1178 - public static function checkChartStatus( $type ) {
1179 - $types = self::_getChartTypesLocalized( false, false, false, true );
1180 - if ( isset( $types[ $type ] ) ) {
1181 - return ! empty( $types[ $type ]['enabled'] );
1182 - }
1183 - return false;
1184 - }
1185 962 }