PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.10
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.10
4.0.8 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 All 149 releases
← All changes | classes/Visualizer/Module/Admin.php +93 -655 3.10.23.0.10 View file →
@@ -52,110 +52,26 @@
52 52 public function __construct( Visualizer_Plugin $plugin ) {
53 53 parent::__construct( $plugin );
54 54 $this->_addAction( 'load-post.php', 'enqueueMediaScripts' );
55 55 $this->_addAction( 'load-post-new.php', 'enqueueMediaScripts' );
56 - $this->_addAction( 'admin_footer', 'renderTemplates' );
57 - $this->_addAction( 'admin_enqueue_scripts', 'enqueueLibraryScripts', null, 0 );
56 + $this->_addAction( 'admin_footer', 'renderTempaltes' );
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 - $this->_addFilter( 'plugin_row_meta', 'getPluginMetaLinks', 10, 2 );
62 61 $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
62 + $this->_addFilter( 'visualizer_get_chart_counts', 'getChartCountsByTypeAndMeta' );
63 63 $this->_addFilter( 'visualizer_feedback_review_trigger', 'feedbackReviewTrigger' );
64 64
65 - // screen pagination
66 - $this->_addFilter( 'set-screen-option', 'setScreenOptions', 10, 3 );
67 -
68 65 // revision support.
69 66 $this->_addFilter( 'wp_revisions_to_keep', 'limitRevisions', null, 10, 2 );
70 67 $this->_addAction( '_wp_put_post_revision', 'addRevision', null, 10, 1 );
71 68 $this->_addAction( 'wp_restore_post_revision', 'restoreRevision', null, 10, 2 );
72 69
73 - $this->_addAction( 'visualizer_chart_schedules_spl', 'addSplChartSchedules', null, 10, 3 );
74 -
75 70 $this->_addAction( 'admin_init', 'init' );
76 -
77 - $this->_addAction( 'visualizer_chart_languages', 'addMultilingualSupport' );
78 -
79 - if ( defined( 'TI_CYPRESS_TESTING' ) ) {
80 - $this->load_cypress_hooks();
81 - }
82 -
83 71 }
84 72
85 73 /**
86 - * Define the hooks that are needed for cypress.
87 - *
88 - * @since 3.4.0
89 - * @access private
90 - */
91 - private function load_cypress_hooks() {
92 - // all charts should load on the same page without pagination.
93 - add_filter(
94 - 'visualizer_query_args', function( $args ) {
95 - $args['posts_per_page'] = 20;
96 - return $args;
97 - }, 10, 1
98 - );
99 - }
100 -
101 - /**
102 - * Add disabled `optgroup` schedules to the drop downs.
103 - *
104 - * @since ?
105 - *
106 - * @access public
107 - *
108 - * @param string $feature The feature for which to add schedules.
109 - * @param int $chart_id The chart ID.
110 - * @param int $plan The plan number.
111 - */
112 - public function addSplChartSchedules( $feature, $chart_id, $plan ) {
113 - if ( apply_filters( 'visualizer_is_business', false ) ) {
114 - return;
115 - }
116 -
117 - $license = __( 'PRO', 'visualizer' );
118 - if ( Visualizer_Module::is_pro() ) {
119 - switch ( $plan ) {
120 - case 1:
121 - $license = __( 'Developer', 'visualizer' );
122 - break;
123 - }
124 - }
125 -
126 - $hours = array(
127 - '0' => __( 'Live', 'visualizer' ),
128 - '1' => __( 'Each hour', 'visualizer' ),
129 - '12' => __( 'Each 12 hours', 'visualizer' ),
130 - '24' => __( 'Each day', 'visualizer' ),
131 - '72' => __( 'Each 3 days', 'visualizer' ),
132 - );
133 -
134 - switch ( $feature ) {
135 - case 'json':
136 - case 'csv':
137 - // no more schedules if pro is already active.
138 - if ( Visualizer_Module::is_pro() ) {
139 - return;
140 - }
141 - break;
142 - case 'wp':
143 - // fall-through.
144 - case 'db':
145 - break;
146 - default:
147 - return;
148 - }
149 -
150 - echo '<optgroup disabled label="' . sprintf( __( 'More in the %s version', 'visualizer' ), $license ) . '">';
151 - foreach ( $hours as $hour => $desc ) {
152 - echo '<option disabled>' . $desc . '</option>';
153 - }
154 - echo '</optgroup>';
155 - }
156 -
157 - /**
158 74 * No limits on revisions.
159 75 */
160 76 public function limitRevisions( $num, $post ) {
161 77 if ( Visualizer_Plugin::CPT_VISUALIZER === $post->post_type ) {
@@ -216,31 +132,16 @@
216 132 *
217 133 * @access public
218 134 */
219 135 public function init() {
220 - // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
221 136 if ( current_user_can( 'edit_posts' ) && current_user_can( 'edit_pages' ) && 'true' == get_user_option( 'rich_editing' ) ) {
222 137 $this->_addFilter( 'mce_external_languages', 'add_tinymce_lang', 10, 1 );
223 138 $this->_addFilter( 'mce_external_plugins', 'tinymce_plugin', 10, 1 );
224 139 $this->_addFilter( 'mce_buttons', 'register_mce_button', 10, 1 );
225 - $this->_addFilter( 'tiny_mce_before_init', 'get_strings_for_block', 10, 1 );
226 140 }
227 141 }
228 142
229 143 /**
230 - * Add the strings required for the TinyMCE buttons for the classic block (not the classic editor).
231 - *
232 - * @since ?
233 - * @access friendly
234 - */
235 - function get_strings_for_block( $settings ) {
236 - $class = new Visualizer_Module_Language();
237 - $strings = $class->get_strings();
238 - $array = array( 'visualizer_tinymce_plugin' => json_encode( $strings ) );
239 - return array_merge( $settings, $array );
240 - }
241 -
242 - /**
243 144 * Load plugin translation for - TinyMCE API
244 145 *
245 146 * @access public
246 147 * @param array $arr The tinymce_lang array.
@@ -311,23 +212,16 @@
311 212 public function enqueueMediaScripts() {
312 213 global $typenow;
313 214 if ( post_type_supports( $typenow, 'editor' ) ) {
314 215 wp_enqueue_style( 'visualizer-media', VISUALIZER_ABSURL . 'css/media.css', array( 'media-views' ), Visualizer_Plugin::VERSION );
315 -
316 - // Load all the assets for the different libraries we support.
317 - $deps = array(
318 - Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) ),
319 - Visualizer_Render_Sidebar_Type_DataTable_Tabular::enqueue_assets( array( 'media-editor' ) ),
320 - );
321 -
322 - wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', $deps, Visualizer_Plugin::VERSION, true );
216 + wp_enqueue_script( 'visualizer-google-jsapi-new', '//www.gstatic.com/charts/loader.js', array( 'media-editor' ), null, true );
217 + wp_enqueue_script( 'visualizer-google-jsapi-old', '//www.google.com/jsapi', array( 'visualizer-google-jsapi-new' ), null, true );
218 + wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', array( 'visualizer-google-jsapi-old' ), Visualizer_Plugin::VERSION, true );
323 219 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
324 220 wp_enqueue_script( 'visualizer-media-controller', VISUALIZER_ABSURL . 'js/media/controller.js', array( 'visualizer-media-collection' ), Visualizer_Plugin::VERSION, true );
325 221 wp_enqueue_script( 'visualizer-media-view', VISUALIZER_ABSURL . 'js/media/view.js', array( 'visualizer-media-controller' ), Visualizer_Plugin::VERSION, true );
326 222 wp_localize_script(
327 - 'visualizer-media-view',
328 - 'visualizer',
329 - array(
223 + 'visualizer-media-view', 'visualizer', array(
330 224 'i10n' => array(
331 225 'insert' => __( 'Insert', 'visualizer' ),
332 226 ),
333 227 )
@@ -366,9 +260,9 @@
366 260 'filters' => $chart_types,
367 261 'types' => array_keys( $chart_types ),
368 262 ),
369 263 'nonce' => wp_create_nonce(),
370 - 'buildurl' => esc_url( add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ) ),
264 + 'buildurl' => add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ),
371 265 );
372 266
373 267 return $strings;
374 268 }
@@ -381,9 +275,9 @@
381 275 * @static
382 276 * @access private
383 277 * @return array The associated array of chart types with localized names.
384 278 */
385 - public static function _getChartTypesLocalized( $enabledOnly = false, $get2Darray = false, $add_select = false, $where = null ) {
279 + public static function _getChartTypesLocalized( $enabledOnly = false, $get2Darray = false, $add_select = false ) {
386 280 $additional = array();
387 281 if ( $add_select ) {
388 282 $additional['select'] = array(
389 283 'name' => esc_html__( 'All', 'visualizer' ),
@@ -390,91 +284,59 @@
390 284 'enabled' => true,
391 285 );
392 286 }
393 287
394 - $enabled = self::proFeaturesLocked();
395 -
396 288 $types = array_merge(
397 - $additional,
398 - array(
399 - 'tabular' => array(
400 - 'name' => esc_html__( 'Table', 'visualizer' ),
401 - 'enabled' => true,
402 - 'supports' => $enabled ? array( 'Google Charts', 'DataTable' ) : array( 'DataTable' ),
403 - ),
289 + $additional, array(
404 290 'pie' => array(
405 - 'name' => esc_html__( 'Pie/Donut', 'visualizer' ),
291 + 'name' => esc_html__( 'Pie', 'visualizer' ),
406 292 'enabled' => true,
407 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
408 293 ),
409 294 'line' => array(
410 295 'name' => esc_html__( 'Line', 'visualizer' ),
411 296 'enabled' => true,
412 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
413 297 ),
414 - 'bar' => array(
415 - 'name' => esc_html__( 'Bar', 'visualizer' ),
416 - 'enabled' => true,
417 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
418 - ),
419 298 'area' => array(
420 299 'name' => esc_html__( 'Area', 'visualizer' ),
421 - 'enabled' => $enabled,
422 - // in ChartJS, the fill option is used to make Line chart an area: https://www.chartjs.org/docs/latest/charts/area.html
423 - 'supports' => array( 'Google Charts' ),
300 + 'enabled' => true,
424 301 ),
425 302 'geo' => array(
426 303 'name' => esc_html__( 'Geo', 'visualizer' ),
427 - 'enabled' => $enabled,
428 - 'supports' => array( 'Google Charts' ),
304 + 'enabled' => true,
429 305 ),
306 + 'bar' => array(
307 + 'name' => esc_html__( 'Bar', 'visualizer' ),
308 + 'enabled' => true,
309 + ),
430 310 'column' => array(
431 311 'name' => esc_html__( 'Column', 'visualizer' ),
432 - 'enabled' => $enabled,
433 - 'supports' => array( 'Google Charts', 'ChartJS' ),
312 + 'enabled' => true,
434 313 ),
435 - 'bubble' => array(
436 - 'name' => esc_html__( 'Bubble', 'visualizer' ),
437 - 'enabled' => $enabled,
438 - // 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 - 'supports' => array( 'Google Charts' ),
314 + 'gauge' => array(
315 + 'name' => esc_html__( 'Gauge', 'visualizer' ),
316 + 'enabled' => true,
440 317 ),
441 318 'scatter' => array(
442 319 'name' => esc_html__( 'Scatter', 'visualizer' ),
443 - 'enabled' => $enabled,
444 - 'supports' => array( 'Google Charts' ),
320 + 'enabled' => true,
445 321 ),
446 - 'gauge' => array(
447 - 'name' => esc_html__( 'Gauge', 'visualizer' ),
448 - 'enabled' => $enabled,
449 - 'supports' => array( 'Google Charts' ),
450 - ),
451 322 'candlestick' => array(
452 323 'name' => esc_html__( 'Candlestick', 'visualizer' ),
453 - 'enabled' => $enabled,
454 - 'supports' => array( 'Google Charts' ),
324 + 'enabled' => true,
455 325 ),
456 326 // pro types
327 + 'table' => array(
328 + 'name' => esc_html__( 'Table', 'visualizer' ),
329 + 'enabled' => false,
330 + ),
457 331 'timeline' => array(
458 332 'name' => esc_html__( 'Timeline', 'visualizer' ),
459 333 'enabled' => false,
460 - 'supports' => array( 'Google Charts', 'ChartJS' ),
461 334 ),
462 335 'combo' => array(
463 336 'name' => esc_html__( 'Combo', 'visualizer' ),
464 337 'enabled' => false,
465 - 'supports' => array( 'Google Charts' ),
466 338 ),
467 - 'polarArea' => array(
468 - 'name' => esc_html__( 'Polar Area', 'visualizer' ),
469 - 'enabled' => false,
470 - 'supports' => array( 'ChartJS' ),
471 - ),
472 - 'radar' => array(
473 - 'name' => esc_html__( 'Radar/Spider', 'visualizer' ),
474 - 'enabled' => false,
475 - 'supports' => array( 'ChartJS' ),
476 - ),
477 339 )
478 340 );
479 341 $types = apply_filters( 'visualizer_pro_chart_types', $types );
480 342 if ( $enabledOnly ) {
@@ -483,12 +345,8 @@
483 345 if ( ! is_array( $array ) ) {
484 346 // support for old pro
485 347 $array = array( 'enabled' => true, 'name' => $array );
486 348 }
487 - // backward compatibility for PRO before v1.9.0
488 - if ( ! array_key_exists( 'supports', $array ) ) {
489 - $array['supports'] = array( 'Google Charts' );
490 - }
491 349 if ( ! $array['enabled'] ) {
492 350 continue;
493 351 }
494 352 $filtered[ $type ] = $array;
@@ -501,74 +359,13 @@
501 359 if ( ! is_array( $array ) ) {
502 360 // support for old pro
503 361 $array = array( 'enabled' => true, 'name' => $array );
504 362 }
505 - // backward compatibility for PRO before v1.9.0
506 - if ( ! array_key_exists( 'supports', $array ) ) {
507 - $array['supports'] = array( 'Google Charts' );
508 - }
509 363 $doubleD[ $type ] = $array['name'];
510 364 }
511 365 $types = $doubleD;
512 366 }
513 367
514 - return self::handleDeprecatedCharts( $types, $enabledOnly, $get2Darray, $where );
515 - }
516 -
517 - /**
518 - * Handle (soon-to-be) deprecated charts.
519 - */
520 - private static function handleDeprecatedCharts( $types, $enabledOnly, $get2Darray, $where ) {
521 - $deprecated = array();
522 -
523 - switch ( $where ) {
524 - case 'types':
525 - // fall-through
526 - case 'library':
527 - // if a user has a Gauge/Candlestick chart, then let them keep using it.
528 - if ( ! Visualizer_Module::is_pro() ) {
529 - if ( ! self::hasChartType( 'gauge' ) ) {
530 - if ( $get2Darray ) {
531 - $deprecated[] = 'gauge';
532 - } else {
533 - $types['gauge']['enabled'] = false;
534 - }
535 - }
536 - if ( ! self::hasChartType( 'candlestick' ) ) {
537 - if ( $get2Darray ) {
538 - $deprecated[] = 'candlestick';
539 - } else {
540 - $types['candlestick']['enabled'] = false;
541 - }
542 - }
543 - }
544 - break;
545 - default:
546 - // if a user has a Gauge/Candlestick chart, then let them keep using it.
547 - if ( ! Visualizer_Module::is_pro() ) {
548 - if ( ! self::hasChartType( 'gauge' ) ) {
549 - if ( $get2Darray ) {
550 - $deprecated[] = 'gauge';
551 - } else {
552 - $types['gauge']['enabled'] = false;
553 - }
554 - }
555 - if ( ! self::hasChartType( 'candlestick' ) ) {
556 - if ( $get2Darray ) {
557 - $deprecated[] = 'candlestick';
558 - } else {
559 - $types['candlestick']['enabled'] = false;
560 - }
561 - }
562 - }
563 - }
564 -
565 - if ( $deprecated ) {
566 - foreach ( $deprecated as $type ) {
567 - unset( $types[ $type ] );
568 - }
569 - }
570 -
571 368 return $types;
572 369 }
573 370
574 371 /**
@@ -578,11 +375,11 @@
578 375 * @global string $pagenow The name of the current page.
579 376 *
580 377 * @access public
581 378 */
582 - public function renderTemplates() {
379 + public function renderTempaltes() {
583 380 global $pagenow;
584 - if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
381 + if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
585 382 return;
586 383 }
587 384 $render = new Visualizer_Render_Templates();
588 385 $render->render();
@@ -600,41 +397,26 @@
600 397 *
601 398 * @param string $suffix The current page suffix.
602 399 */
603 400 public function enqueueLibraryScripts( $suffix ) {
604 - if ( $suffix === $this->_libraryPage ) {
401 + if ( $suffix == $this->_libraryPage ) {
605 402 wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
606 403 $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
607 404 wp_enqueue_media();
608 405 wp_enqueue_script(
609 - 'visualizer-library',
610 - VISUALIZER_ABSURL . 'js/library.js',
611 - array(
406 + 'visualizer-library', VISUALIZER_ABSURL . 'js/library.js', array(
612 407 'jquery',
613 408 'media-views',
614 - 'clipboard',
615 - ),
616 - Visualizer_Plugin::VERSION,
617 - true
409 + ), Visualizer_Plugin::VERSION, true
618 410 );
619 -
620 - wp_enqueue_script( 'visualizer-customization', $this->get_user_customization_js(), array(), null, true );
621 -
622 - $query = $this->getQuery();
623 - while ( $query->have_posts() ) {
624 - $chart = $query->next_post();
625 - $library = $this->load_chart_type( $chart->ID );
626 - if ( is_null( $library ) ) {
627 - continue;
628 - }
629 - wp_enqueue_script(
630 - "visualizer-render-$library",
631 - VISUALIZER_ABSURL . 'js/render-facade.js',
632 - apply_filters( 'visualizer_assets_render', array( 'visualizer-library', 'visualizer-customization' ), true ),
633 - Visualizer_Plugin::VERSION,
634 - true
635 - );
636 - }
411 + wp_enqueue_script( 'google-jsapi-new', '//www.gstatic.com/charts/loader.js', array(), null, true );
412 + wp_enqueue_script( 'google-jsapi-old', '//www.google.com/jsapi', array( 'google-jsapi-new' ), null, true );
413 + wp_enqueue_script(
414 + 'visualizer-render', VISUALIZER_ABSURL . 'js/render.js', array(
415 + 'google-jsapi-old',
416 + 'visualizer-library',
417 + ), Visualizer_Plugin::VERSION, true
418 + );
637 419 }
638 420 }
639 421
640 422 /**
@@ -661,191 +443,24 @@
661 443 *
662 444 * @access public
663 445 */
664 446 public function registerAdminMenu() {
665 - $svg_base64_icon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNzdweCIgaGVpZ2h0PSI3N3B4IiB2aWV3Qm94PSIwIDAgNzcgNzciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjYgKDY3NDkxKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5Db21iaW5lZCBTaGFwZTwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQcm9kdWN0LVBhZ2UiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJXb3JkUHJlc3MtcGx1Z2lucyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE5MC4wMDAwMDAsIC00MzUuMDAwMDAwKSIgZmlsbD0iIzM5QzNEMiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMjguNSw1MTIgQzIwNy4yMzcwMzcsNTEyIDE5MCw0OTQuNzYyOTYzIDE5MCw0NzMuNSBDMTkwLDQ1Mi4yMzcwMzcgMjA3LjIzNzAzNyw0MzUgMjI4LjUsNDM1IEMyNDkuNzYyOTYzLDQzNSAyNjcsNDUyLjIzNzAzNyAyNjcsNDczLjUgQzI2Nyw0OTQuNzYyOTYzIDI0OS43NjI5NjMsNTEyIDIyOC41LDUxMiBaIE0yNDYuODQzNzUsNDgzLjU5MjA1OSBMMjE1LjYyNSw0ODMuNTkyMDU5IEwyMTUuNjI1LDQ2MC44MjY1NDQgQzIxNS42MjUsNDYwLjE2NDU0NyAyMTUuMTA3NTc4LDQ1OS42MjgzNTkgMjE0LjQ2ODc1LDQ1OS42MjgzNTkgTDIxMi4xNTYyNSw0NTkuNjI4MzU5IEMyMTEuNTE3NDIyLDQ1OS42MjgzNTkgMjExLDQ2MC4xNjQ1NDcgMjExLDQ2MC44MjY1NDQgTDIxMSw0ODUuOTg4NDI5IEMyMTEsNDg3LjMxMTY3NCAyMTIuMDM1NTY2LDQ4OC4zODQ3OTggMjEzLjMxMjUsNDg4LjM4NDc5OCBMMjQ2Ljg0Mzc1LDQ4OC4zODQ3OTggQzI0Ny40ODI1NzgsNDg4LjM4NDc5OCAyNDgsNDg3Ljg0ODYxMSAyNDgsNDg3LjE4NjYxMyBMMjQ4LDQ4NC43OTAyNDQgQzI0OCw0ODQuMTI4MjQ2IDI0Ny40ODI1NzgsNDgzLjU5MjA1OSAyNDYuODQzNzUsNDgzLjU5MjA1OSBaIE0yNDQuNTMxMjUsNDYyLjAyNDcyOSBMMjM1Ljk5OTU3LDQ2Mi4wMjQ3MjkgQzIzNC40NTQ1MzEsNDYyLjAyNDcyOSAyMzMuNjgwNTY2LDQ2My45NjA1NDcgMjM0Ljc3MzIyMyw0NjUuMDkyODMyIEwyMzcuMTE0NjI5LDQ2Ny41MTkxNTYgTDIzMS44MTI1LDQ3My4wMTQzMzIgTDIyNi41MTAzNzEsNDY3LjUxOTkwNSBDMjI1LjYwNzA1MSw0NjYuNTgzODIzIDIyNC4xNDI5NDksNDY2LjU4MzgyMyAyMjMuMjQwMzUyLDQ2Ny41MTk5MDUgTDIxOC4yNzY0MjYsNDcyLjY2Mzg2MyBDMjE3LjgyNDc2Niw0NzMuMTMxOTA0IDIxNy44MjQ3NjYsNDczLjg5MDUwNSAyMTguMjc2NDI2LDQ3NC4zNTg1NDYgTDIxOS45MTEwNzQsNDc2LjA1MjQ4IEMyMjAuMzYyNzM0LDQ3Ni41MjA1MjEgMjIxLjA5NDc4NSw0NzYuNTIwNTIxIDIyMS41NDY0NDUsNDc2LjA1MjQ4IEwyMjQuODc1LDQ3Mi42MDI0NTYgTDIzMC4xNzcxMjksNDc4LjA5Njg4MyBDMjMxLjA4MDQ0OSw0NzkuMDMyOTY1IDIzMi41NDQ1NTEsNDc5LjAzMjk2NSAyMzMuNDQ3MTQ4LDQ3OC4wOTY4ODMgTDI0MC4zODQ2NDgsNDcwLjkwNzc3MyBMMjQyLjcyNjA1NSw0NzMuMzM0MDk4IEMyNDMuODE4NzExLDQ3NC40NjYzODIgMjQ1LjY4Njc3Nyw0NzMuNjY0MzQ3IDI0NS42ODY3NzcsNDcyLjA2MzI3MyBMMjQ1LjY4Njc3Nyw0NjMuMjIyOTE0IEMyNDUuNjg3NSw0NjIuNTYwOTE3IDI0NS4xNzAwNzgsNDYyLjAyNDcyOSAyNDQuNTMxMjUsNDYyLjAyNDcyOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==';
666 -
667 - $this->_libraryPage = add_menu_page( __( 'Visualizer', 'visualizer' ), __( 'Visualizer', 'visualizer' ), 'edit_posts', Visualizer_Plugin::NAME, array( $this, 'renderLibraryPage' ), $svg_base64_icon, 99.7666 );
668 -
669 - add_submenu_page(
670 - Visualizer_Plugin::NAME,
671 - __( 'Chart Library', 'visualizer' ),
672 - __( 'Chart Library', 'visualizer' ),
673 - 'edit_posts',
674 - admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME )
675 - );
676 - add_submenu_page(
677 - Visualizer_Plugin::NAME,
678 - __( 'Add New Chart', 'visualizer' ),
679 - __( 'Add New Chart', 'visualizer' ),
680 - 'edit_posts',
681 - admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME . '&vaction=addnew' )
682 - );
683 - add_submenu_page(
684 - Visualizer_Plugin::NAME,
685 - __( 'Support', 'visualizer' ),
686 - __( 'Support', 'visualizer' ) . '<span class="dashicons dashicons-editor-help more-features-icon" style="width: 17px; height: 17px; margin-left: 4px; color: #ffca54; font-size: 17px; vertical-align: -3px;"></span>',
687 - 'edit_posts',
688 - 'viz-support',
689 - array( $this, 'renderSupportPage' )
690 - );
691 -
692 - 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' ) );
447 + $title = esc_html__( 'Visualizer Library', 'visualizer' );
448 + $callback = array( $this, 'renderLibraryPage' );
449 + $this->_libraryPage = add_submenu_page( 'upload.php', $title, $title, 'edit_posts', Visualizer_Plugin::NAME, $callback );
696 450 }
697 451
698 452 /**
699 - * Handle get pro plugin submenu.
453 + * Renders visualizer library page.
454 + *
455 + * @since 1.0.0
456 + *
457 + * @access public
700 458 */
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 - * Get the instance of WP_Query that fetches the charts as per the given criteria.
835 - */
836 - private function getQuery() {
837 - static $q;
838 - if ( ! is_null( $q ) ) {
839 - return $q;
840 - }
841 -
459 + public function renderLibraryPage() {
842 460 // get current page
843 461 $page = filter_input(
844 - INPUT_GET,
845 - 'vpage',
846 - FILTER_VALIDATE_INT,
847 - array(
462 + INPUT_GET, 'vpage', FILTER_VALIDATE_INT, array(
848 463 'options' => array(
849 464 'min_range' => 1,
850 465 'default' => 1,
851 466 ),
@@ -850,34 +465,29 @@
850 465 'default' => 1,
851 466 ),
852 467 )
853 468 );
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 469 // the initial query arguments to fetch charts
870 470 $query_args = array(
871 471 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
872 - 'posts_per_page' => $per_page,
472 + 'posts_per_page' => 6,
873 473 'paged' => $page,
874 474 );
875 -
876 - $this->getDisplayFilters( $query_args );
877 -
475 + // add chart type filter to the query arguments
476 + $filter = filter_input( INPUT_GET, 'type' );
477 + if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
478 + $query_args['meta_query'] = array(
479 + array(
480 + 'key' => Visualizer_Plugin::CF_CHART_TYPE,
481 + 'value' => $filter,
482 + 'compare' => '=',
483 + ),
484 + );
485 + } else {
486 + $filter = 'all';
487 + }
878 488 // Added by Ash/Upwork
879 - $filterByMeta = ! empty( $_GET['s'] ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
489 + $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
880 490 if ( $filterByMeta ) {
881 491 $query = array(
882 492 'key' => Visualizer_Plugin::CF_SETTINGS,
883 493 'value' => $filterByMeta,
@@ -886,157 +496,56 @@
886 496 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
887 497 $meta[] = $query;
888 498 $query_args['meta_query'] = $meta;
889 499 }
890 - $q = new WP_Query( apply_filters( 'visualizer_query_args', $query_args ) );
891 - return $q;
892 - }
893 -
894 - /**
895 - * Renders support page.
896 - *
897 - * @since 3.3.0
898 - *
899 - * @access public
900 - */
901 - public function renderSupportPage() {
902 - wp_enqueue_style( 'visualizer-upsell', VISUALIZER_ABSURL . 'css/upsell.css', array(), Visualizer_Plugin::VERSION );
903 - include_once VISUALIZER_ABSPATH . '/templates/support.php';
904 - }
905 -
906 - /**
907 - * Renders visualizer library page.
908 - *
909 - * @since 1.0.0
910 - *
911 - * @access public
912 - */
913 - public function renderLibraryPage() {
500 + // Added by Ash/Upwork
501 + // fetch charts
914 502 $charts = array();
915 - $query = $this->getQuery();
916 -
917 - // get current page
918 - $page = filter_input(
919 - INPUT_GET,
920 - 'vpage',
921 - FILTER_VALIDATE_INT,
922 - array(
923 - 'options' => array(
924 - 'min_range' => 1,
925 - 'default' => 1,
926 - ),
927 - )
928 - );
929 - // add chart type filter to the query arguments
930 - $filter = filter_input( INPUT_GET, 'type' );
931 - if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes(), true ) ) ) {
932 - $filter = 'all';
933 - }
934 -
935 - $css = '';
503 + $query = new WP_Query( $query_args );
936 504 while ( $query->have_posts() ) {
937 505 $chart = $query->next_post();
938 506
939 507 // if the user has updated a chart and instead of saving it, has closed the modal. If the user refreshes, they should get the original chart.
940 508 $chart = $this->handleExistingRevisions( $chart->ID, $chart );
941 - // refresh a "live" db query chart.
942 - $chart = apply_filters( 'visualizer_schedule_refresh_chart', $chart, $chart->ID, false );
943 509
944 - $type = get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
945 -
946 510 // fetch and update settings
947 511 $settings = get_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, true );
948 -
949 - $settings = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SETTINGS, $settings, $chart->ID, $type );
950 - if ( ! empty( $atts['settings'] ) ) {
951 - $settings = apply_filters( $atts['settings'], $settings, $chart->ID, $type );
952 - }
953 -
954 - if ( $settings ) {
955 - unset( $settings['height'], $settings['width'], $settings['chartArea'] );
956 - }
957 -
512 + unset( $settings['height'], $settings['width'] );
513 + $type = get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
958 514 $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 );
960 -
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 - $library = $this->load_chart_type( $chart->ID );
974 -
975 - $id = 'visualizer-' . $chart->ID;
976 - $arguments = $this->get_inline_custom_css( $id, $settings );
977 - if ( ! empty( $arguments ) ) {
978 - $css .= $arguments[0];
979 - $settings = $arguments[1];
980 - }
981 -
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 -
515 + $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
989 516 // add chart to the array
990 - $charts[ $id ] = array(
517 + $charts[ 'visualizer-' . $chart->ID ] = array(
991 518 'id' => $chart->ID,
992 519 'type' => $type,
993 520 'series' => $series,
994 521 'settings' => $settings,
995 522 'data' => $data,
996 - 'library' => $library,
997 523 );
998 524 }
999 525 // enqueue charts array
1000 526 $ajaxurl = admin_url( 'admin-ajax.php' );
1001 527 wp_localize_script(
1002 - 'visualizer-library',
1003 - 'visualizer',
1004 - array(
528 + 'visualizer-library', 'visualizer', array(
1005 529 'language' => $this->get_language(),
1006 530 'map_api_key' => get_option( 'visualizer-map-api-key' ),
1007 531 'charts' => $charts,
1008 532 '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 - )
533 + 'base' => add_query_arg( 'vpage', false ),
534 + 'create' => add_query_arg(
535 + array(
536 + 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
537 + 'library' => 'yes',
538 + 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
539 + ), $ajaxurl
1021 540 ),
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 - )
541 + 'edit' => add_query_arg(
542 + array(
543 + 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
544 + 'library' => 'yes',
545 + ), $ajaxurl
1031 546 ),
1032 547 ),
1033 - 'page_type' => 'library',
1034 - '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 548 )
1040 549 );
1041 550 // render library page
1042 551 $render = new Visualizer_Render_Library();
@@ -1041,13 +550,12 @@
1041 550 // render library page
1042 551 $render = new Visualizer_Render_Library();
1043 552 $render->charts = $charts;
1044 553 $render->type = $filter;
1045 - $render->types = self::_getChartTypesLocalized( false, false, false, true );
1046 - $render->custom_css = $css;
554 + $render->types = self::_getChartTypesLocalized();
1047 555 $render->pagination = paginate_links(
1048 556 array(
1049 - 'base' => add_query_arg( array( 'vpage' => '%#%', 'vaction' => false ) ),
557 + 'base' => add_query_arg( 'vpage', '%#%' ),
1050 558 'format' => '',
1051 559 'current' => $page,
1052 560 'total' => $query->max_num_pages,
1053 561 'type' => 'array',
@@ -1068,14 +576,14 @@
1068 576 *
1069 577 * @return array Updated array of action links.
1070 578 */
1071 579 public function getPluginActionLinks( $links, $file ) {
1072 - if ( $file === plugin_basename( VISUALIZER_BASEFILE ) ) {
580 + if ( $file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1073 581 array_unshift(
1074 582 $links,
1075 583 sprintf(
1076 584 '<a href="%s">%s</a>',
1077 - admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME ),
585 + admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ),
1078 586 esc_html__( 'Library', 'visualizer' )
1079 587 )
1080 588 );
1081 589 }
@@ -1095,17 +603,17 @@
1095 603 *
1096 604 * @return array Updated array of plugin meta links.
1097 605 */
1098 606 public function getPluginMetaLinks( $plugin_meta, $plugin_file ) {
1099 - if ( $plugin_file === plugin_basename( VISUALIZER_BASEFILE ) ) {
607 + if ( $plugin_file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1100 608 // knowledge base link
1101 609 $plugin_meta[] = sprintf(
1102 - '<a href="' . VISUALIZER_MAIN_DOC . '" target="_blank">%s</a>',
1103 - esc_html__( 'Docs', 'visualizer' )
610 + '<a href="https://github.com/codeinwp/visualizer/wiki" target="_blank">%s</a>',
611 + esc_html__( 'Knowledge Base', 'visualizer' )
1104 612 );
1105 613 // flattr link
1106 614 $plugin_meta[] = sprintf(
1107 - '<a style="color:red" href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'pluginrow' ) . '" target="_blank">%s</a>',
615 + '<a style="color:red" href="https://themeisle.com/plugins/visualizer-charts-and-graphs-pro-addon/" target="_blank">%s</a>',
1108 616 esc_html__( 'Pro Addon', 'visualizer' )
1109 617 );
1110 618 }
1111 619
@@ -1111,75 +619,5 @@
1111 619
1112 620 return $plugin_meta;
1113 621 }
1114 622
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 623 }