PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.4.4
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.4.4
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 +66 -201 3.10.03.4.4 View file →
@@ -53,9 +53,9 @@
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 );
@@ -73,10 +73,8 @@
73 73 $this->_addAction( 'visualizer_chart_schedules_spl', 'addSplChartSchedules', null, 10, 3 );
74 74
75 75 $this->_addAction( 'admin_init', 'init' );
76 76
77 - $this->_addAction( 'visualizer_chart_languages', 'addMultilingualSupport' );
78 -
79 77 if ( defined( 'TI_CYPRESS_TESTING' ) ) {
80 78 $this->load_cypress_hooks();
81 79 }
82 80
@@ -315,9 +313,9 @@
315 313
316 314 // Load all the assets for the different libraries we support.
317 315 $deps = array(
318 316 Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) ),
319 - Visualizer_Render_Sidebar_Type_DataTable_Tabular::enqueue_assets( array( 'media-editor' ) ),
317 + Visualizer_Render_Sidebar_Type_DataTable_DataTable::enqueue_assets( array( 'media-editor' ) ),
320 318 );
321 319
322 320 wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', $deps, Visualizer_Plugin::VERSION, true );
323 321 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
@@ -366,9 +364,9 @@
366 364 'filters' => $chart_types,
367 365 'types' => array_keys( $chart_types ),
368 366 ),
369 367 'nonce' => wp_create_nonce(),
370 - 'buildurl' => esc_url( add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ) ),
368 + 'buildurl' => add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ),
371 369 );
372 370
373 371 return $strings;
374 372 }
@@ -390,71 +388,74 @@
390 388 'enabled' => true,
391 389 );
392 390 }
393 391
394 - $enabled = self::proFeaturesLocked();
395 -
396 392 $types = array_merge(
397 393 $additional,
398 394 array(
399 - 'tabular' => array(
395 + 'dataTable' => array(
400 396 'name' => esc_html__( 'Table', 'visualizer' ),
401 397 'enabled' => true,
402 - 'supports' => $enabled ? array( 'Google Charts', 'DataTable' ) : array( 'DataTable' ),
398 + 'supports' => array( 'DataTable' ),
403 399 ),
404 400 'pie' => array(
405 401 'name' => esc_html__( 'Pie/Donut', 'visualizer' ),
406 402 'enabled' => true,
407 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
403 + 'supports' => array( 'Google Charts', 'ChartJS' ),
408 404 ),
409 405 'line' => array(
410 406 'name' => esc_html__( 'Line', 'visualizer' ),
411 407 'enabled' => true,
412 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
408 + 'supports' => array( 'Google Charts', 'ChartJS' ),
413 409 ),
414 - 'bar' => array(
415 - 'name' => esc_html__( 'Bar', 'visualizer' ),
416 - 'enabled' => true,
417 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
418 - ),
419 410 'area' => array(
420 411 'name' => esc_html__( 'Area', 'visualizer' ),
421 - 'enabled' => $enabled,
412 + 'enabled' => true,
422 413 // in ChartJS, the fill option is used to make Line chart an area: https://www.chartjs.org/docs/latest/charts/area.html
423 414 'supports' => array( 'Google Charts' ),
424 415 ),
425 416 'geo' => array(
426 417 'name' => esc_html__( 'Geo', 'visualizer' ),
427 - 'enabled' => $enabled,
418 + 'enabled' => true,
428 419 'supports' => array( 'Google Charts' ),
429 420 ),
421 + 'bar' => array(
422 + 'name' => esc_html__( 'Bar', 'visualizer' ),
423 + 'enabled' => true,
424 + 'supports' => array( 'Google Charts', 'ChartJS' ),
425 + ),
430 426 'column' => array(
431 427 'name' => esc_html__( 'Column', 'visualizer' ),
432 - 'enabled' => $enabled,
428 + 'enabled' => true,
433 429 'supports' => array( 'Google Charts', 'ChartJS' ),
434 430 ),
435 431 'bubble' => array(
436 432 'name' => esc_html__( 'Bubble', 'visualizer' ),
437 - 'enabled' => $enabled,
433 + 'enabled' => true,
438 434 // 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 435 'supports' => array( 'Google Charts' ),
440 436 ),
441 437 'scatter' => array(
442 438 'name' => esc_html__( 'Scatter', 'visualizer' ),
443 - 'enabled' => $enabled,
439 + 'enabled' => true,
444 440 'supports' => array( 'Google Charts' ),
445 441 ),
446 442 'gauge' => array(
447 443 'name' => esc_html__( 'Gauge', 'visualizer' ),
448 - 'enabled' => $enabled,
444 + 'enabled' => true,
449 445 'supports' => array( 'Google Charts' ),
450 446 ),
451 447 'candlestick' => array(
452 448 'name' => esc_html__( 'Candlestick', 'visualizer' ),
453 - 'enabled' => $enabled,
449 + 'enabled' => true,
454 450 'supports' => array( 'Google Charts' ),
455 451 ),
456 452 // pro types
453 + 'table' => array(
454 + 'name' => esc_html__( 'Table (Deprecated)', 'visualizer' ),
455 + 'enabled' => false,
456 + 'supports' => array( 'Google Charts' ),
457 + ),
457 458 'timeline' => array(
458 459 'name' => esc_html__( 'Timeline', 'visualizer' ),
459 460 'enabled' => false,
460 461 'supports' => array( 'Google Charts', 'ChartJS' ),
@@ -523,8 +524,18 @@
523 524 switch ( $where ) {
524 525 case 'types':
525 526 // fall-through
526 527 case 'library':
528 + // if the user has a Google Table chart, show it as deprecated otherwise remove the option from the library.
529 + if ( ! self::hasChartType( 'table' ) ) {
530 + $deprecated[] = 'table';
531 + if ( $get2Darray ) {
532 + $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
533 + } else {
534 + $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
535 + }
536 + }
537 +
527 538 // if a user has a Gauge/Candlestick chart, then let them keep using it.
528 539 if ( ! Visualizer_Module::is_pro() ) {
529 540 if ( ! self::hasChartType( 'gauge' ) ) {
530 541 if ( $get2Darray ) {
@@ -542,8 +553,18 @@
542 553 }
543 554 }
544 555 break;
545 556 default:
557 + // remove the option to create a Google Table chart.
558 + $deprecated[] = 'table';
559 +
560 + // rename the new table chart type.
561 + if ( $get2Darray ) {
562 + $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
563 + } else {
564 + $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
565 + }
566 +
546 567 // if a user has a Gauge/Candlestick chart, then let them keep using it.
547 568 if ( ! Visualizer_Module::is_pro() ) {
548 569 if ( ! self::hasChartType( 'gauge' ) ) {
549 570 if ( $get2Darray ) {
@@ -610,9 +631,8 @@
610 631 VISUALIZER_ABSURL . 'js/library.js',
611 632 array(
612 633 'jquery',
613 634 'media-views',
614 - 'clipboard',
615 635 ),
616 636 Visualizer_Plugin::VERSION,
617 637 true
618 638 );
@@ -687,20 +707,8 @@
687 707 'edit_posts',
688 708 'viz-support',
689 709 array( $this, 'renderSupportPage' )
690 710 );
691 -
692 - if ( ! Visualizer_Module::is_pro() ) {
693 - add_submenu_page(
694 - Visualizer_Plugin::NAME,
695 - __( 'Get Visualizer Pro', 'visualizer' ),
696 - __( 'Get Visualizer Pro', 'visualizer' ),
697 - 'edit_posts',
698 - 'viz-get-pro',
699 - '__return_null'
700 - );
701 - add_action( 'admin_footer', array( $this, 'handleGetProSubMenu' ) );
702 - }
703 711 remove_submenu_page( Visualizer_Plugin::NAME, Visualizer_Plugin::NAME );
704 712
705 713 add_action( "load-{$this->_libraryPage}", array( $this, 'addScreenOptions' ) );
706 714 }
@@ -705,41 +713,8 @@
705 713 add_action( "load-{$this->_libraryPage}", array( $this, 'addScreenOptions' ) );
706 714 }
707 715
708 716 /**
709 - * Handle get pro plugin submenu.
710 - */
711 - public function handleGetProSubMenu() {
712 - ?>
713 - <style type="text/css">
714 - #toplevel_page_visualizer ul.wp-submenu li.wp-first-item + li + li + li {
715 - background: #FF7E65;
716 - font-size: 14px;
717 - font-weight: 600;
718 - color: #fff;
719 - }
720 - #toplevel_page_visualizer ul.wp-submenu li.wp-first-item + li + li + li > a {
721 - color: #fff !important;
722 - }
723 - #toplevel_page_visualizer ul.wp-submenu li.wp-first-item + li + li + li > a:hover {
724 - box-shadow: inherit;
725 - }
726 - #toplevel_page_visualizer ul.wp-submenu li.wp-first-item + li + li + li + li {
727 - display: none;
728 - }
729 - </style>
730 - <script type="text/javascript">
731 - jQuery( document ).ready( function() {
732 - jQuery( '#toplevel_page_visualizer' ).on( 'click', 'li:not(.wp-submenu-head, .wp-first-item):eq(2)', function( e ) {
733 - e.preventDefault();
734 - window.open( '<?php echo tsdk_utmify( 'https://themeisle.com/plugins/visualizer-charts-and-graphs/upgrade/', 'toplevel' ); ?>', '_blank' );
735 - } );
736 - } );
737 - </script>
738 - <?php
739 - }
740 -
741 - /**
742 717 * Adds the screen options for pagination.
743 718 */
744 719 function addScreenOptions() {
745 720 $screen = get_current_screen();
@@ -751,9 +726,9 @@
751 726
752 727 $args = array(
753 728 'label' => __( 'Number of charts per page:', 'visualizer' ),
754 729 'default' => 6,
755 - 'option' => 'visualizer_library_per_page',
730 + 'option' => 'visualizer_per_page_library',
756 731 );
757 732 add_screen_option( 'per_page', $args );
758 733 }
759 734
@@ -760,9 +735,9 @@
760 735 /**
761 736 * Returns the screen option for pagination.
762 737 */
763 738 function setScreenOptions( $status, $option, $value ) {
764 - if ( 'visualizer_library_per_page' === $option ) {
739 + if ( 'visualizer_per_page_library' === $option ) {
765 740 return $value;
766 741 }
767 742 }
768 743
@@ -770,24 +745,8 @@
770 745 * Adds the display filters to be used in the meta_query while displaying the charts.
771 746 */
772 747 private function getDisplayFilters( &$query_args ) {
773 748 $query = array();
774 - global $sitepress;
775 - if ( Visualizer_Module::is_pro() && ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) ) {
776 - $current_lang = icl_get_current_language();
777 - if ( in_array( $current_lang, array( 'all', icl_get_default_language() ), true ) ) {
778 - $query[] = array(
779 - 'key' => 'chart_lang',
780 - 'compare' => 'NOT EXISTS',
781 - );
782 - } else {
783 - $query[] = array(
784 - 'key' => 'chart_lang',
785 - 'value' => $current_lang,
786 - 'compare' => '=',
787 - );
788 - }
789 - }
790 749
791 750 // add chart type filter to the query arguments
792 751 $type = filter_input( INPUT_GET, 'type' );
793 752 if ( $type && in_array( $type, Visualizer_Plugin::getChartTypes(), true ) ) {
@@ -885,9 +844,9 @@
885 844
886 845 $this->getDisplayFilters( $query_args );
887 846
888 847 // Added by Ash/Upwork
889 - $filterByMeta = ! empty( $_GET['s'] ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
848 + $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
890 849 if ( $filterByMeta ) {
891 850 $query = array(
892 851 'key' => Visualizer_Plugin::CF_SETTINGS,
893 852 'value' => $filterByMeta,
@@ -967,20 +926,8 @@
967 926
968 927 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
969 928 $data = self::get_chart_data( $chart, $type );
970 929
971 - // Set default setting series when add manual chart data - Only during first creation.
972 - if ( isset( $settings['series'] ) && ! empty( $series ) ) {
973 - $count_series = count( $series ) - count( $settings['series'] );
974 - if ( $count_series > 1 ) {
975 - $clone_last_series = end( $settings['series'] );
976 - $clone_last_series = array_fill_keys( array_keys( $clone_last_series ), '' );
977 - foreach ( range( 1, $count_series ) as $item ) {
978 - $settings['series'][] = $clone_last_series;
979 - }
980 - }
981 - }
982 -
983 930 $library = $this->load_chart_type( $chart->ID );
984 931
985 932 $id = 'visualizer-' . $chart->ID;
986 933 $arguments = $this->get_inline_custom_css( $id, $settings );
@@ -988,15 +935,8 @@
988 935 $css .= $arguments[0];
989 936 $settings = $arguments[1];
990 937 }
991 938
992 - if ( isset( $settings['controls']['ui']['labelStacking'] ) ) {
993 - unset( $settings['controls']['ui']['labelStacking'] );
994 - }
995 - if ( isset( $settings['controls']['ui']['orientation'] ) ) {
996 - unset( $settings['controls']['ui']['orientation'] );
997 - }
998 -
999 939 // add chart to the array
1000 940 $charts[ $id ] = array(
1001 941 'id' => $chart->ID,
1002 942 'type' => $type,
@@ -1015,36 +955,31 @@
1015 955 'language' => $this->get_language(),
1016 956 'map_api_key' => get_option( 'visualizer-map-api-key' ),
1017 957 'charts' => $charts,
1018 958 'urls' => array(
1019 - 'base' => esc_url( add_query_arg( array( 'vpage' => false, 'vaction' => false ) ) ),
1020 - 'create' => esc_url(
1021 - add_query_arg(
1022 - array(
1023 - 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
1024 - 'library' => 'yes',
1025 - 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
1026 - 'chart-library' => isset( $_GET['chart-library'] ) ? $_GET['chart-library'] : '',
1027 - 'vaction' => false,
1028 - ),
1029 - $ajaxurl
1030 - )
959 + 'base' => add_query_arg( array( 'vpage' => false, 'vaction' => false ) ),
960 + 'create' => add_query_arg(
961 + array(
962 + 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
963 + 'library' => 'yes',
964 + 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
965 + 'chart-library' => isset( $_GET['chart-library'] ) ? $_GET['chart-library'] : '',
966 + 'vaction' => false,
967 + ),
968 + $ajaxurl
1031 969 ),
1032 - 'edit' => esc_url(
1033 - add_query_arg(
1034 - array(
1035 - 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
1036 - 'library' => 'yes',
1037 - 'vaction' => false,
1038 - ),
1039 - $ajaxurl
1040 - )
970 + 'edit' => add_query_arg(
971 + array(
972 + 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
973 + 'library' => 'yes',
974 + 'vaction' => false,
975 + ),
976 + $ajaxurl
1041 977 ),
1042 978 ),
1043 979 'page_type' => 'library',
1044 980 'is_front' => false,
1045 - 'i10n' => array(
1046 - 'copied' => __( 'The shortcode has been copied to your clipboard. Hit Ctrl-V/Cmd-V to paste it.', 'visualizer' ),
981 + 'i10n' => array(
1047 982 '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' ),
1048 983 ),
1049 984 )
1050 985 );
@@ -1113,9 +1048,9 @@
1113 1048 esc_html__( 'Docs', 'visualizer' )
1114 1049 );
1115 1050 // flattr link
1116 1051 $plugin_meta[] = sprintf(
1117 - '<a style="color:red" href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'pluginrow' ) . '" target="_blank">%s</a>',
1052 + '<a style="color:red" href="' . Visualizer_Plugin::PRO_TEASER_URL . '" target="_blank">%s</a>',
1118 1053 esc_html__( 'Pro Addon', 'visualizer' )
1119 1054 );
1120 1055 }
1121 1056
@@ -1121,75 +1056,5 @@
1121 1056
1122 1057 return $plugin_meta;
1123 1058 }
1124 1059
1125 - /**
1126 - * If check is existing user.
1127 - *
1128 - * @return bool Default false
1129 - */
1130 - public static function proFeaturesLocked() {
1131 - if ( Visualizer_Module::is_pro() ) {
1132 - return true;
1133 - }
1134 - return 'yes' === get_option( 'visualizer-new-user', 'yes' ) ? false : true;
1135 - }
1136 -
1137 - /**
1138 - * Multilingual Support.
1139 - *
1140 - * @param int $chart_id Chart ID.
1141 - * @return bool Default false
1142 - */
1143 - public function addMultilingualSupport( $chart_id ) {
1144 - global $sitepress;
1145 - if ( Visualizer_Module::is_pro() ) {
1146 - return;
1147 - }
1148 - if ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) {
1149 - $language = icl_get_languages();
1150 - $current_lang = icl_get_current_language();
1151 - $default_lang = icl_get_default_language();
1152 - $post_info = wpml_get_language_information( null, $chart_id );
1153 - $translations = array();
1154 - if ( ! empty( $post_info ) && ( $default_lang === $post_info['language_code'] ) ) {
1155 - $trid = $sitepress->get_element_trid( $chart_id, 'post_' . Visualizer_Plugin::CPT_VISUALIZER );
1156 - $translations = $sitepress->get_element_translations( $trid );
1157 - }
1158 - if ( empty( $translations ) ) {
1159 - return;
1160 - }
1161 - ?>
1162 - <hr><div class="visualizer-languages-list only-pro">
1163 - <?php
1164 - foreach ( $language as $lang ) {
1165 - $lang_code = $lang['code'];
1166 - if ( $current_lang !== $lang_code ) {
1167 - ?>
1168 - <a href="javascript:;">
1169 - <img src="<?php echo esc_url( $lang['country_flag_url'] ); ?>" alt="<?php echo esc_attr( $lang['translated_name'] ); ?>">
1170 - </a>
1171 - <?php
1172 - }
1173 - }
1174 - ?>
1175 - <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>
1176 - </div>
1177 - <?php
1178 - }
1179 - }
1180 -
1181 - /**
1182 - * Check chart is enabled or not.
1183 - *
1184 - * @param string $type Chart ID.
1185 - *
1186 - * @return bool Default false
1187 - */
1188 - public static function checkChartStatus( $type ) {
1189 - $types = self::_getChartTypesLocalized( false, false, false, true );
1190 - if ( isset( $types[ $type ] ) ) {
1191 - return ! empty( $types[ $type ]['enabled'] );
1192 - }
1193 - return false;
1194 - }
1195 1060 }