PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.1.0
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.1.0
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 +97 -524 3.10.13.1.0 View file →
@@ -53,109 +53,25 @@
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 - $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.
@@ -313,12 +214,10 @@
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 216
316 217 // 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 - );
218 + $deps = Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) );
219 + $deps += Visualizer_Render_Sidebar_Type_DataTable::enqueue_assets( array( 'media-editor' ) );
321 220
322 221 wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', $deps, Visualizer_Plugin::VERSION, true );
323 222 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
324 223 wp_enqueue_script( 'visualizer-media-controller', VISUALIZER_ABSURL . 'js/media/controller.js', array( 'visualizer-media-collection' ), Visualizer_Plugin::VERSION, true );
@@ -366,9 +265,9 @@
366 265 'filters' => $chart_types,
367 266 'types' => array_keys( $chart_types ),
368 267 ),
369 268 'nonce' => wp_create_nonce(),
370 - 'buildurl' => esc_url( add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ) ),
269 + 'buildurl' => add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ),
371 270 );
372 271
373 272 return $strings;
374 273 }
@@ -390,91 +289,64 @@
390 289 'enabled' => true,
391 290 );
392 291 }
393 292
394 - $enabled = self::proFeaturesLocked();
395 -
396 293 $types = array_merge(
397 294 $additional,
398 295 array(
399 - 'tabular' => array(
400 - 'name' => esc_html__( 'Table', 'visualizer' ),
296 + 'dataTable' => array(
297 + 'name' => esc_html__( 'Table (New)', 'visualizer' ),
401 298 'enabled' => true,
402 - 'supports' => $enabled ? array( 'Google Charts', 'DataTable' ) : array( 'DataTable' ),
403 299 ),
404 300 'pie' => array(
405 - 'name' => esc_html__( 'Pie/Donut', 'visualizer' ),
301 + 'name' => esc_html__( 'Pie', 'visualizer' ),
406 302 'enabled' => true,
407 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
408 303 ),
409 304 'line' => array(
410 305 'name' => esc_html__( 'Line', 'visualizer' ),
411 306 'enabled' => true,
412 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
413 307 ),
414 - 'bar' => array(
415 - 'name' => esc_html__( 'Bar', 'visualizer' ),
416 - 'enabled' => true,
417 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
418 - ),
419 308 'area' => array(
420 309 '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' ),
310 + 'enabled' => true,
424 311 ),
425 312 'geo' => array(
426 313 'name' => esc_html__( 'Geo', 'visualizer' ),
427 - 'enabled' => $enabled,
428 - 'supports' => array( 'Google Charts' ),
314 + 'enabled' => true,
429 315 ),
316 + 'bar' => array(
317 + 'name' => esc_html__( 'Bar', 'visualizer' ),
318 + 'enabled' => true,
319 + ),
430 320 'column' => array(
431 321 'name' => esc_html__( 'Column', 'visualizer' ),
432 - 'enabled' => $enabled,
433 - 'supports' => array( 'Google Charts', 'ChartJS' ),
322 + 'enabled' => true,
434 323 ),
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' ),
324 + 'gauge' => array(
325 + 'name' => esc_html__( 'Gauge', 'visualizer' ),
326 + 'enabled' => true,
440 327 ),
441 328 'scatter' => array(
442 329 'name' => esc_html__( 'Scatter', 'visualizer' ),
443 - 'enabled' => $enabled,
444 - 'supports' => array( 'Google Charts' ),
330 + 'enabled' => true,
445 331 ),
446 - 'gauge' => array(
447 - 'name' => esc_html__( 'Gauge', 'visualizer' ),
448 - 'enabled' => $enabled,
449 - 'supports' => array( 'Google Charts' ),
450 - ),
451 332 'candlestick' => array(
452 333 'name' => esc_html__( 'Candlestick', 'visualizer' ),
453 - 'enabled' => $enabled,
454 - 'supports' => array( 'Google Charts' ),
334 + 'enabled' => true,
455 335 ),
456 336 // pro types
337 + 'table' => array(
338 + 'name' => esc_html__( 'Table (Deprecated)', 'visualizer' ),
339 + 'enabled' => false,
340 + ),
457 341 'timeline' => array(
458 342 'name' => esc_html__( 'Timeline', 'visualizer' ),
459 343 'enabled' => false,
460 - 'supports' => array( 'Google Charts', 'ChartJS' ),
461 344 ),
462 345 'combo' => array(
463 346 'name' => esc_html__( 'Combo', 'visualizer' ),
464 347 'enabled' => false,
465 - 'supports' => array( 'Google Charts' ),
466 348 ),
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 349 )
478 350 );
479 351 $types = apply_filters( 'visualizer_pro_chart_types', $types );
480 352 if ( $enabledOnly ) {
@@ -483,12 +355,8 @@
483 355 if ( ! is_array( $array ) ) {
484 356 // support for old pro
485 357 $array = array( 'enabled' => true, 'name' => $array );
486 358 }
487 - // backward compatibility for PRO before v1.9.0
488 - if ( ! array_key_exists( 'supports', $array ) ) {
489 - $array['supports'] = array( 'Google Charts' );
490 - }
491 359 if ( ! $array['enabled'] ) {
492 360 continue;
493 361 }
494 362 $filtered[ $type ] = $array;
@@ -501,12 +369,8 @@
501 369 if ( ! is_array( $array ) ) {
502 370 // support for old pro
503 371 $array = array( 'enabled' => true, 'name' => $array );
504 372 }
505 - // backward compatibility for PRO before v1.9.0
506 - if ( ! array_key_exists( 'supports', $array ) ) {
507 - $array['supports'] = array( 'Google Charts' );
508 - }
509 373 $doubleD[ $type ] = $array['name'];
510 374 }
511 375 $types = $doubleD;
512 376 }
@@ -520,45 +384,49 @@
520 384 private static function handleDeprecatedCharts( $types, $enabledOnly, $get2Darray, $where ) {
521 385 $deprecated = array();
522 386
523 387 switch ( $where ) {
524 - case 'types':
525 - // fall-through
526 388 case 'library':
389 + // if the user has a Google Table chart, show it as deprecated otherwise remove the option from the library.
390 + if ( ! self::hasChartType( 'table' ) ) {
391 + $deprecated[] = 'table';
392 + if ( $get2Darray ) {
393 + $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
394 + } else {
395 + $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
396 + }
397 + }
398 +
527 399 // if a user has a Gauge/Candlestick chart, then let them keep using it.
528 - if ( ! Visualizer_Module::is_pro() ) {
400 + if ( ! VISUALIZER_PRO ) {
529 401 if ( ! self::hasChartType( 'gauge' ) ) {
530 - if ( $get2Darray ) {
531 - $deprecated[] = 'gauge';
532 - } else {
533 - $types['gauge']['enabled'] = false;
534 - }
402 + $deprecated[] = 'gauge';
535 403 }
536 404 if ( ! self::hasChartType( 'candlestick' ) ) {
537 - if ( $get2Darray ) {
538 - $deprecated[] = 'candlestick';
539 - } else {
540 - $types['candlestick']['enabled'] = false;
541 - }
405 + $deprecated[] = 'candlestick';
542 406 }
543 407 }
544 408 break;
545 409 default:
410 + // remove the option to create a Google Table chart.
411 + $deprecated[] = 'table';
412 +
413 + // rename the new table chart type.
414 + if ( self::hasChartType( 'table' ) ) {
415 + if ( $get2Darray ) {
416 + $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
417 + } else {
418 + $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
419 + }
420 + }
421 +
546 422 // if a user has a Gauge/Candlestick chart, then let them keep using it.
547 - if ( ! Visualizer_Module::is_pro() ) {
423 + if ( ! VISUALIZER_PRO ) {
548 424 if ( ! self::hasChartType( 'gauge' ) ) {
549 - if ( $get2Darray ) {
550 - $deprecated[] = 'gauge';
551 - } else {
552 - $types['gauge']['enabled'] = false;
553 - }
425 + $deprecated[] = 'gauge';
554 426 }
555 427 if ( ! self::hasChartType( 'candlestick' ) ) {
556 - if ( $get2Darray ) {
557 - $deprecated[] = 'candlestick';
558 - } else {
559 - $types['candlestick']['enabled'] = false;
560 - }
428 + $deprecated[] = 'candlestick';
561 429 }
562 430 }
563 431 }
564 432
@@ -580,9 +448,9 @@
580 448 * @access public
581 449 */
582 450 public function renderTemplates() {
583 451 global $pagenow;
584 - if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
452 + if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
585 453 return;
586 454 }
587 455 $render = new Visualizer_Render_Templates();
588 456 $render->render();
@@ -600,9 +468,9 @@
600 468 *
601 469 * @param string $suffix The current page suffix.
602 470 */
603 471 public function enqueueLibraryScripts( $suffix ) {
604 - if ( $suffix === $this->_libraryPage ) {
472 + if ( $suffix == $this->_libraryPage ) {
605 473 wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
606 474 $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
607 475 wp_enqueue_media();
608 476 wp_enqueue_script(
@@ -610,9 +478,8 @@
610 478 VISUALIZER_ABSURL . 'js/library.js',
611 479 array(
612 480 'jquery',
613 481 'media-views',
614 - 'clipboard',
615 482 ),
616 483 Visualizer_Plugin::VERSION,
617 484 true
618 485 );
@@ -661,187 +528,14 @@
661 528 *
662 529 * @access public
663 530 */
664 531 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 - 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 - remove_submenu_page( Visualizer_Plugin::NAME, Visualizer_Plugin::NAME );
704 -
705 - add_action( "load-{$this->_libraryPage}", array( $this, 'addScreenOptions' ) );
532 + $title = esc_html__( 'Visualizer Library', 'visualizer' );
533 + $callback = array( $this, 'renderLibraryPage' );
534 + $this->_libraryPage = add_submenu_page( 'upload.php', $title, $title, 'edit_posts', Visualizer_Plugin::NAME, $callback );
706 535 }
707 536
708 537 /**
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 - * Adds the screen options for pagination.
743 - */
744 - function addScreenOptions() {
745 - $screen = get_current_screen();
746 -
747 - // bail if it's some other page.
748 - if ( ! is_object( $screen ) || $screen->id !== $this->_libraryPage ) {
749 - return;
750 - }
751 -
752 - $args = array(
753 - 'label' => __( 'Number of charts per page:', 'visualizer' ),
754 - 'default' => 6,
755 - 'option' => 'visualizer_library_per_page',
756 - );
757 - add_screen_option( 'per_page', $args );
758 - }
759 -
760 - /**
761 - * Returns the screen option for pagination.
762 - */
763 - function setScreenOptions( $status, $option, $value ) {
764 - if ( 'visualizer_library_per_page' === $option ) {
765 - return $value;
766 - }
767 - }
768 -
769 - /**
770 - * Adds the display filters to be used in the meta_query while displaying the charts.
771 - */
772 - private function getDisplayFilters( &$query_args ) {
773 - $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 -
791 - // add chart type filter to the query arguments
792 - $type = filter_input( INPUT_GET, 'type' );
793 - if ( $type && in_array( $type, Visualizer_Plugin::getChartTypes(), true ) ) {
794 - $query[] = array(
795 - 'key' => Visualizer_Plugin::CF_CHART_TYPE,
796 - 'value' => $type,
797 - 'compare' => '=',
798 - );
799 - }
800 -
801 - // add chart library filter to the query arguments
802 - $library = filter_input( INPUT_GET, 'library' );
803 - if ( $library ) {
804 - $query[] = array(
805 - 'key' => Visualizer_Plugin::CF_CHART_LIBRARY,
806 - 'value' => $library,
807 - 'compare' => '=',
808 - );
809 - }
810 -
811 - // add date filter to the query arguments
812 - $date = filter_input( INPUT_GET, 'date' );
813 - $possible = array_keys( Visualizer_Plugin::getSupportedDateFilter() );
814 - if ( $date && in_array( $date, $possible, true ) ) {
815 - $query_args['date_query'] = array(
816 - 'after' => "$date -1 day",
817 - 'inclusive' => true,
818 - );
819 - }
820 -
821 - // add source filter to the query arguments
822 - $source = filter_input( INPUT_GET, 'source' );
823 - if ( $source ) {
824 - $source = ucwords( $source );
825 - $source = "Visualizer_Source_{$source}";
826 - $query[] = array(
827 - 'key' => Visualizer_Plugin::CF_SOURCE,
828 - 'value' => $source,
829 - 'compare' => '=',
830 - );
831 - }
832 -
833 - $query_args['meta_query'] = $query;
834 -
835 - $orderby = filter_input( INPUT_GET, 'orderby' );
836 - $order = filter_input( INPUT_GET, 'order' );
837 - if ( $orderby ) {
838 - $query_args['order_by'] = $orderby;
839 - }
840 - $query_args['order'] = empty( $order ) ? 'desc' : $order;
841 - }
842 -
843 - /**
844 538 * Get the instance of WP_Query that fetches the charts as per the given criteria.
845 539 */
846 540 private function getQuery() {
847 541 static $q;
@@ -860,34 +554,29 @@
860 554 'default' => 1,
861 555 ),
862 556 )
863 557 );
864 -
865 - $per_page = 6;
866 - $screen = get_current_screen();
867 - if ( $screen ) {
868 - // retrieve the per_page option
869 - $screen_option = $screen->get_option( 'per_page', 'option' );
870 - // retrieve the value stored for the current user
871 - $user = get_current_user_id();
872 - $per_page = get_user_meta( $user, $screen_option, true );
873 - if ( empty( $per_page ) || $per_page < 1 ) {
874 - // nothing set, get the default value
875 - $per_page = $screen->get_option( 'per_page', 'default' );
876 - }
877 - }
878 -
879 558 // the initial query arguments to fetch charts
880 559 $query_args = array(
881 560 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
882 - 'posts_per_page' => $per_page,
561 + 'posts_per_page' => 6,
883 562 'paged' => $page,
884 563 );
885 -
886 - $this->getDisplayFilters( $query_args );
887 -
564 + // add chart type filter to the query arguments
565 + $filter = filter_input( INPUT_GET, 'type' );
566 + if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
567 + $query_args['meta_query'] = array(
568 + array(
569 + 'key' => Visualizer_Plugin::CF_CHART_TYPE,
570 + 'value' => $filter,
571 + 'compare' => '=',
572 + ),
573 + );
574 + } else {
575 + $filter = 'all';
576 + }
888 577 // Added by Ash/Upwork
889 - $filterByMeta = ! empty( $_GET['s'] ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
578 + $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
890 579 if ( $filterByMeta ) {
891 580 $query = array(
892 581 'key' => Visualizer_Plugin::CF_SETTINGS,
893 582 'value' => $filterByMeta,
@@ -896,25 +585,13 @@
896 585 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
897 586 $meta[] = $query;
898 587 $query_args['meta_query'] = $meta;
899 588 }
900 - $q = new WP_Query( apply_filters( 'visualizer_query_args', $query_args ) );
589 + $q = new WP_Query( $query_args );
901 590 return $q;
902 591 }
903 592
904 593 /**
905 - * Renders support page.
906 - *
907 - * @since 3.3.0
908 - *
909 - * @access public
910 - */
911 - public function renderSupportPage() {
912 - wp_enqueue_style( 'visualizer-upsell', VISUALIZER_ABSURL . 'css/upsell.css', array(), Visualizer_Plugin::VERSION );
913 - include_once VISUALIZER_ABSPATH . '/templates/support.php';
914 - }
915 -
916 - /**
917 594 * Renders visualizer library page.
918 595 *
919 596 * @since 1.0.0
920 597 *
@@ -937,9 +614,9 @@
937 614 )
938 615 );
939 616 // add chart type filter to the query arguments
940 617 $filter = filter_input( INPUT_GET, 'type' );
941 - if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes(), true ) ) ) {
618 + if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) ) {
942 619 $filter = 'all';
943 620 }
944 621
945 622 $css = '';
@@ -960,27 +637,12 @@
960 637 if ( ! empty( $atts['settings'] ) ) {
961 638 $settings = apply_filters( $atts['settings'], $settings, $chart->ID, $type );
962 639 }
963 640
964 - if ( $settings ) {
965 - unset( $settings['height'], $settings['width'], $settings['chartArea'] );
966 - }
967 -
641 + unset( $settings['height'], $settings['width'] );
968 642 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
969 - $data = self::get_chart_data( $chart, $type );
643 + $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
970 644
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 645 $library = $this->load_chart_type( $chart->ID );
984 646
985 647 $id = 'visualizer-' . $chart->ID;
986 648 $arguments = $this->get_inline_custom_css( $id, $settings );
@@ -988,15 +650,8 @@
988 650 $css .= $arguments[0];
989 651 $settings = $arguments[1];
990 652 }
991 653
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 654 // add chart to the array
1000 655 $charts[ $id ] = array(
1001 656 'id' => $chart->ID,
1002 657 'type' => $type,
@@ -1015,38 +670,26 @@
1015 670 'language' => $this->get_language(),
1016 671 'map_api_key' => get_option( 'visualizer-map-api-key' ),
1017 672 'charts' => $charts,
1018 673 '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 - )
674 + 'base' => add_query_arg( 'vpage', false ),
675 + 'create' => add_query_arg(
676 + array(
677 + 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
678 + 'library' => 'yes',
679 + 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
680 + ),
681 + $ajaxurl
1031 682 ),
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 - )
683 + 'edit' => add_query_arg(
684 + array(
685 + 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
686 + 'library' => 'yes',
687 + ),
688 + $ajaxurl
1041 689 ),
1042 690 ),
1043 691 'page_type' => 'library',
1044 - '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' ),
1047 - '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 - ),
1049 692 )
1050 693 );
1051 694 // render library page
1052 695 $render = new Visualizer_Render_Library();
@@ -1055,9 +698,9 @@
1055 698 $render->types = self::_getChartTypesLocalized( false, false, false, true );
1056 699 $render->custom_css = $css;
1057 700 $render->pagination = paginate_links(
1058 701 array(
1059 - 'base' => add_query_arg( array( 'vpage' => '%#%', 'vaction' => false ) ),
702 + 'base' => add_query_arg( 'vpage', '%#%' ),
1060 703 'format' => '',
1061 704 'current' => $page,
1062 705 'total' => $query->max_num_pages,
1063 706 'type' => 'array',
@@ -1078,14 +721,14 @@
1078 721 *
1079 722 * @return array Updated array of action links.
1080 723 */
1081 724 public function getPluginActionLinks( $links, $file ) {
1082 - if ( $file === plugin_basename( VISUALIZER_BASEFILE ) ) {
725 + if ( $file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1083 726 array_unshift(
1084 727 $links,
1085 728 sprintf(
1086 729 '<a href="%s">%s</a>',
1087 - admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME ),
730 + admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ),
1088 731 esc_html__( 'Library', 'visualizer' )
1089 732 )
1090 733 );
1091 734 }
@@ -1105,17 +748,17 @@
1105 748 *
1106 749 * @return array Updated array of plugin meta links.
1107 750 */
1108 751 public function getPluginMetaLinks( $plugin_meta, $plugin_file ) {
1109 - if ( $plugin_file === plugin_basename( VISUALIZER_BASEFILE ) ) {
752 + if ( $plugin_file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1110 753 // knowledge base link
1111 754 $plugin_meta[] = sprintf(
1112 - '<a href="' . VISUALIZER_MAIN_DOC . '" target="_blank">%s</a>',
1113 - esc_html__( 'Docs', 'visualizer' )
755 + '<a href="https://github.com/codeinwp/visualizer/wiki" target="_blank">%s</a>',
756 + esc_html__( 'Knowledge Base', 'visualizer' )
1114 757 );
1115 758 // flattr link
1116 759 $plugin_meta[] = sprintf(
1117 - '<a style="color:red" href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'pluginrow' ) . '" target="_blank">%s</a>',
760 + '<a style="color:red" href="https://themeisle.com/plugins/visualizer-charts-and-graphs-pro-addon/" target="_blank">%s</a>',
1118 761 esc_html__( 'Pro Addon', 'visualizer' )
1119 762 );
1120 763 }
1121 764
@@ -1121,75 +764,5 @@
1121 764
1122 765 return $plugin_meta;
1123 766 }
1124 767
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 768 }