PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.4.8
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.4.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 3.10.4 All 148 releases
← All changes | classes/Visualizer/Module/Admin.php +315 -62 3.1.33.4.8 View file →
@@ -57,21 +57,103 @@
57 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 );
61 62 $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 +
65 68 // revision support.
66 69 $this->_addFilter( 'wp_revisions_to_keep', 'limitRevisions', null, 10, 2 );
67 70 $this->_addAction( '_wp_put_post_revision', 'addRevision', null, 10, 1 );
68 71 $this->_addAction( 'wp_restore_post_revision', 'restoreRevision', null, 10, 2 );
69 72
73 + $this->_addAction( 'visualizer_chart_schedules_spl', 'addSplChartSchedules', null, 10, 3 );
74 +
70 75 $this->_addAction( 'admin_init', 'init' );
76 +
77 + if ( defined( 'TI_CYPRESS_TESTING' ) ) {
78 + $this->load_cypress_hooks();
79 + }
80 +
71 81 }
72 82
73 83 /**
84 + * Define the hooks that are needed for cypress.
85 + *
86 + * @since 3.4.0
87 + * @access private
88 + */
89 + private function load_cypress_hooks() {
90 + // all charts should load on the same page without pagination.
91 + add_filter(
92 + 'visualizer_query_args', function( $args ) {
93 + $args['posts_per_page'] = 20;
94 + return $args;
95 + }, 10, 1
96 + );
97 + }
98 +
99 + /**
100 + * Add disabled `optgroup` schedules to the drop downs.
101 + *
102 + * @since ?
103 + *
104 + * @access public
105 + *
106 + * @param string $feature The feature for which to add schedules.
107 + * @param int $chart_id The chart ID.
108 + * @param int $plan The plan number.
109 + */
110 + public function addSplChartSchedules( $feature, $chart_id, $plan ) {
111 + if ( apply_filters( 'visualizer_is_business', false ) ) {
112 + return;
113 + }
114 +
115 + $license = __( 'PRO', 'visualizer' );
116 + if ( Visualizer_Module::is_pro() ) {
117 + switch ( $plan ) {
118 + case 1:
119 + $license = __( 'Developer', 'visualizer' );
120 + break;
121 + }
122 + }
123 +
124 + $hours = array(
125 + '0' => __( 'Live', 'visualizer' ),
126 + '1' => __( 'Each hour', 'visualizer' ),
127 + '12' => __( 'Each 12 hours', 'visualizer' ),
128 + '24' => __( 'Each day', 'visualizer' ),
129 + '72' => __( 'Each 3 days', 'visualizer' ),
130 + );
131 +
132 + switch ( $feature ) {
133 + case 'json':
134 + case 'csv':
135 + // no more schedules if pro is already active.
136 + if ( Visualizer_Module::is_pro() ) {
137 + return;
138 + }
139 + break;
140 + case 'wp':
141 + // fall-through.
142 + case 'db':
143 + break;
144 + default:
145 + return;
146 + }
147 +
148 + echo '<optgroup disabled label="' . sprintf( __( 'More in the %s version', 'visualizer' ), $license ) . '">';
149 + foreach ( $hours as $hour => $desc ) {
150 + echo '<option disabled>' . $desc . '</option>';
151 + }
152 + echo '</optgroup>';
153 + }
154 +
155 + /**
74 156 * No limits on revisions.
75 157 */
76 158 public function limitRevisions( $num, $post ) {
77 159 if ( Visualizer_Plugin::CPT_VISUALIZER === $post->post_type ) {
@@ -132,16 +214,31 @@
132 214 *
133 215 * @access public
134 216 */
135 217 public function init() {
218 + // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
136 219 if ( current_user_can( 'edit_posts' ) && current_user_can( 'edit_pages' ) && 'true' == get_user_option( 'rich_editing' ) ) {
137 220 $this->_addFilter( 'mce_external_languages', 'add_tinymce_lang', 10, 1 );
138 221 $this->_addFilter( 'mce_external_plugins', 'tinymce_plugin', 10, 1 );
139 222 $this->_addFilter( 'mce_buttons', 'register_mce_button', 10, 1 );
223 + $this->_addFilter( 'tiny_mce_before_init', 'get_strings_for_block', 10, 1 );
140 224 }
141 225 }
142 226
143 227 /**
228 + * Add the strings required for the TinyMCE buttons for the classic block (not the classic editor).
229 + *
230 + * @since ?
231 + * @access friendly
232 + */
233 + function get_strings_for_block( $settings ) {
234 + $class = new Visualizer_Module_Language();
235 + $strings = $class->get_strings();
236 + $array = array( 'visualizer_tinymce_plugin' => json_encode( $strings ) );
237 + return array_merge( $settings, $array );
238 + }
239 +
240 + /**
144 241 * Load plugin translation for - TinyMCE API
145 242 *
146 243 * @access public
147 244 * @param array $arr The tinymce_lang array.
@@ -216,9 +313,9 @@
216 313
217 314 // Load all the assets for the different libraries we support.
218 315 $deps = array(
219 316 Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) ),
220 - Visualizer_Render_Sidebar_Type_DataTable::enqueue_assets( array( 'media-editor' ) ),
317 + Visualizer_Render_Sidebar_Type_DataTable_Tabular::enqueue_assets( array( 'media-editor' ) ),
221 318 );
222 319
223 320 wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', $deps, Visualizer_Plugin::VERSION, true );
224 321 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
@@ -294,61 +391,86 @@
294 391
295 392 $types = array_merge(
296 393 $additional,
297 394 array(
298 - 'dataTable' => array(
299 - 'name' => esc_html__( 'Table (New)', 'visualizer' ),
395 + 'tabular' => array(
396 + 'name' => esc_html__( 'Table', 'visualizer' ),
300 397 'enabled' => true,
398 + 'supports' => array( 'Google Charts', 'DataTable' ),
301 399 ),
302 400 'pie' => array(
303 - 'name' => esc_html__( 'Pie', 'visualizer' ),
401 + 'name' => esc_html__( 'Pie/Donut', 'visualizer' ),
304 402 'enabled' => true,
403 + 'supports' => array( 'Google Charts', 'ChartJS' ),
305 404 ),
306 405 'line' => array(
307 406 'name' => esc_html__( 'Line', 'visualizer' ),
308 407 'enabled' => true,
408 + 'supports' => array( 'Google Charts', 'ChartJS' ),
309 409 ),
310 410 'area' => array(
311 411 'name' => esc_html__( 'Area', 'visualizer' ),
312 412 'enabled' => true,
413 + // in ChartJS, the fill option is used to make Line chart an area: https://www.chartjs.org/docs/latest/charts/area.html
414 + 'supports' => array( 'Google Charts' ),
313 415 ),
314 416 'geo' => array(
315 417 'name' => esc_html__( 'Geo', 'visualizer' ),
316 418 'enabled' => true,
419 + 'supports' => array( 'Google Charts' ),
317 420 ),
318 421 'bar' => array(
319 422 'name' => esc_html__( 'Bar', 'visualizer' ),
320 423 'enabled' => true,
424 + 'supports' => array( 'Google Charts', 'ChartJS' ),
321 425 ),
322 426 'column' => array(
323 427 'name' => esc_html__( 'Column', 'visualizer' ),
324 428 'enabled' => true,
429 + 'supports' => array( 'Google Charts', 'ChartJS' ),
325 430 ),
431 + 'bubble' => array(
432 + 'name' => esc_html__( 'Bubble', 'visualizer' ),
433 + 'enabled' => true,
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.
435 + 'supports' => array( 'Google Charts' ),
436 + ),
326 437 'scatter' => array(
327 438 'name' => esc_html__( 'Scatter', 'visualizer' ),
328 439 'enabled' => true,
440 + 'supports' => array( 'Google Charts' ),
329 441 ),
330 442 'gauge' => array(
331 443 'name' => esc_html__( 'Gauge', 'visualizer' ),
332 444 'enabled' => true,
445 + 'supports' => array( 'Google Charts' ),
333 446 ),
334 447 'candlestick' => array(
335 448 'name' => esc_html__( 'Candlestick', 'visualizer' ),
336 449 'enabled' => true,
450 + 'supports' => array( 'Google Charts' ),
337 451 ),
338 452 // pro types
339 - 'table' => array(
340 - 'name' => esc_html__( 'Table (Deprecated)', 'visualizer' ),
341 - 'enabled' => false,
342 - ),
343 453 'timeline' => array(
344 454 'name' => esc_html__( 'Timeline', 'visualizer' ),
345 455 'enabled' => false,
456 + 'supports' => array( 'Google Charts', 'ChartJS' ),
346 457 ),
347 458 'combo' => array(
348 459 'name' => esc_html__( 'Combo', 'visualizer' ),
349 460 'enabled' => false,
461 + 'supports' => array( 'Google Charts' ),
350 462 ),
463 + 'polarArea' => array(
464 + 'name' => esc_html__( 'Polar Area', 'visualizer' ),
465 + 'enabled' => false,
466 + 'supports' => array( 'ChartJS' ),
467 + ),
468 + 'radar' => array(
469 + 'name' => esc_html__( 'Radar/Spider', 'visualizer' ),
470 + 'enabled' => false,
471 + 'supports' => array( 'ChartJS' ),
472 + ),
351 473 )
352 474 );
353 475 $types = apply_filters( 'visualizer_pro_chart_types', $types );
354 476 if ( $enabledOnly ) {
@@ -357,8 +479,12 @@
357 479 if ( ! is_array( $array ) ) {
358 480 // support for old pro
359 481 $array = array( 'enabled' => true, 'name' => $array );
360 482 }
483 + // backward compatibility for PRO before v1.9.0
484 + if ( ! array_key_exists( 'supports', $array ) ) {
485 + $array['supports'] = array( 'Google Charts' );
486 + }
361 487 if ( ! $array['enabled'] ) {
362 488 continue;
363 489 }
364 490 $filtered[ $type ] = $array;
@@ -371,8 +497,12 @@
371 497 if ( ! is_array( $array ) ) {
372 498 // support for old pro
373 499 $array = array( 'enabled' => true, 'name' => $array );
374 500 }
501 + // backward compatibility for PRO before v1.9.0
502 + if ( ! array_key_exists( 'supports', $array ) ) {
503 + $array['supports'] = array( 'Google Charts' );
504 + }
375 505 $doubleD[ $type ] = $array['name'];
376 506 }
377 507 $types = $doubleD;
378 508 }
@@ -386,21 +516,13 @@
386 516 private static function handleDeprecatedCharts( $types, $enabledOnly, $get2Darray, $where ) {
387 517 $deprecated = array();
388 518
389 519 switch ( $where ) {
520 + case 'types':
521 + // fall-through
390 522 case 'library':
391 - // if the user has a Google Table chart, show it as deprecated otherwise remove the option from the library.
392 - if ( ! self::hasChartType( 'table' ) ) {
393 - $deprecated[] = 'table';
394 - if ( $get2Darray ) {
395 - $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
396 - } else {
397 - $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
398 - }
399 - }
400 -
401 523 // if a user has a Gauge/Candlestick chart, then let them keep using it.
402 - if ( ! VISUALIZER_PRO ) {
524 + if ( ! Visualizer_Module::is_pro() ) {
403 525 if ( ! self::hasChartType( 'gauge' ) ) {
404 526 if ( $get2Darray ) {
405 527 $deprecated[] = 'gauge';
406 528 } else {
@@ -416,20 +538,10 @@
416 538 }
417 539 }
418 540 break;
419 541 default:
420 - // remove the option to create a Google Table chart.
421 - $deprecated[] = 'table';
422 -
423 - // rename the new table chart type.
424 - if ( $get2Darray ) {
425 - $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
426 - } else {
427 - $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
428 - }
429 -
430 542 // if a user has a Gauge/Candlestick chart, then let them keep using it.
431 - if ( ! VISUALIZER_PRO ) {
543 + if ( ! Visualizer_Module::is_pro() ) {
432 544 if ( ! self::hasChartType( 'gauge' ) ) {
433 545 if ( $get2Darray ) {
434 546 $deprecated[] = 'gauge';
435 547 } else {
@@ -464,9 +576,9 @@
464 576 * @access public
465 577 */
466 578 public function renderTemplates() {
467 579 global $pagenow;
468 - if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
580 + if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
469 581 return;
470 582 }
471 583 $render = new Visualizer_Render_Templates();
472 584 $render->render();
@@ -484,9 +596,9 @@
484 596 *
485 597 * @param string $suffix The current page suffix.
486 598 */
487 599 public function enqueueLibraryScripts( $suffix ) {
488 - if ( $suffix == $this->_libraryPage ) {
600 + if ( $suffix === $this->_libraryPage ) {
489 601 wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
490 602 $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
491 603 wp_enqueue_media();
492 604 wp_enqueue_script(
@@ -494,8 +606,9 @@
494 606 VISUALIZER_ABSURL . 'js/library.js',
495 607 array(
496 608 'jquery',
497 609 'media-views',
610 + 'clipboard',
498 611 ),
499 612 Visualizer_Plugin::VERSION,
500 613 true
501 614 );
@@ -544,14 +657,126 @@
544 657 *
545 658 * @access public
546 659 */
547 660 public function registerAdminMenu() {
548 - $title = esc_html__( 'Visualizer Library', 'visualizer' );
549 - $callback = array( $this, 'renderLibraryPage' );
550 - $this->_libraryPage = add_submenu_page( 'upload.php', $title, $title, 'edit_posts', Visualizer_Plugin::NAME, $callback );
661 + $svg_base64_icon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNzdweCIgaGVpZ2h0PSI3N3B4IiB2aWV3Qm94PSIwIDAgNzcgNzciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjYgKDY3NDkxKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5Db21iaW5lZCBTaGFwZTwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQcm9kdWN0LVBhZ2UiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJXb3JkUHJlc3MtcGx1Z2lucyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE5MC4wMDAwMDAsIC00MzUuMDAwMDAwKSIgZmlsbD0iIzM5QzNEMiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMjguNSw1MTIgQzIwNy4yMzcwMzcsNTEyIDE5MCw0OTQuNzYyOTYzIDE5MCw0NzMuNSBDMTkwLDQ1Mi4yMzcwMzcgMjA3LjIzNzAzNyw0MzUgMjI4LjUsNDM1IEMyNDkuNzYyOTYzLDQzNSAyNjcsNDUyLjIzNzAzNyAyNjcsNDczLjUgQzI2Nyw0OTQuNzYyOTYzIDI0OS43NjI5NjMsNTEyIDIyOC41LDUxMiBaIE0yNDYuODQzNzUsNDgzLjU5MjA1OSBMMjE1LjYyNSw0ODMuNTkyMDU5IEwyMTUuNjI1LDQ2MC44MjY1NDQgQzIxNS42MjUsNDYwLjE2NDU0NyAyMTUuMTA3NTc4LDQ1OS42MjgzNTkgMjE0LjQ2ODc1LDQ1OS42MjgzNTkgTDIxMi4xNTYyNSw0NTkuNjI4MzU5IEMyMTEuNTE3NDIyLDQ1OS42MjgzNTkgMjExLDQ2MC4xNjQ1NDcgMjExLDQ2MC44MjY1NDQgTDIxMSw0ODUuOTg4NDI5IEMyMTEsNDg3LjMxMTY3NCAyMTIuMDM1NTY2LDQ4OC4zODQ3OTggMjEzLjMxMjUsNDg4LjM4NDc5OCBMMjQ2Ljg0Mzc1LDQ4OC4zODQ3OTggQzI0Ny40ODI1NzgsNDg4LjM4NDc5OCAyNDgsNDg3Ljg0ODYxMSAyNDgsNDg3LjE4NjYxMyBMMjQ4LDQ4NC43OTAyNDQgQzI0OCw0ODQuMTI4MjQ2IDI0Ny40ODI1NzgsNDgzLjU5MjA1OSAyNDYuODQzNzUsNDgzLjU5MjA1OSBaIE0yNDQuNTMxMjUsNDYyLjAyNDcyOSBMMjM1Ljk5OTU3LDQ2Mi4wMjQ3MjkgQzIzNC40NTQ1MzEsNDYyLjAyNDcyOSAyMzMuNjgwNTY2LDQ2My45NjA1NDcgMjM0Ljc3MzIyMyw0NjUuMDkyODMyIEwyMzcuMTE0NjI5LDQ2Ny41MTkxNTYgTDIzMS44MTI1LDQ3My4wMTQzMzIgTDIyNi41MTAzNzEsNDY3LjUxOTkwNSBDMjI1LjYwNzA1MSw0NjYuNTgzODIzIDIyNC4xNDI5NDksNDY2LjU4MzgyMyAyMjMuMjQwMzUyLDQ2Ny41MTk5MDUgTDIxOC4yNzY0MjYsNDcyLjY2Mzg2MyBDMjE3LjgyNDc2Niw0NzMuMTMxOTA0IDIxNy44MjQ3NjYsNDczLjg5MDUwNSAyMTguMjc2NDI2LDQ3NC4zNTg1NDYgTDIxOS45MTEwNzQsNDc2LjA1MjQ4IEMyMjAuMzYyNzM0LDQ3Ni41MjA1MjEgMjIxLjA5NDc4NSw0NzYuNTIwNTIxIDIyMS41NDY0NDUsNDc2LjA1MjQ4IEwyMjQuODc1LDQ3Mi42MDI0NTYgTDIzMC4xNzcxMjksNDc4LjA5Njg4MyBDMjMxLjA4MDQ0OSw0NzkuMDMyOTY1IDIzMi41NDQ1NTEsNDc5LjAzMjk2NSAyMzMuNDQ3MTQ4LDQ3OC4wOTY4ODMgTDI0MC4zODQ2NDgsNDcwLjkwNzc3MyBMMjQyLjcyNjA1NSw0NzMuMzM0MDk4IEMyNDMuODE4NzExLDQ3NC40NjYzODIgMjQ1LjY4Njc3Nyw0NzMuNjY0MzQ3IDI0NS42ODY3NzcsNDcyLjA2MzI3MyBMMjQ1LjY4Njc3Nyw0NjMuMjIyOTE0IEMyNDUuNjg3NSw0NjIuNTYwOTE3IDI0NS4xNzAwNzgsNDYyLjAyNDcyOSAyNDQuNTMxMjUsNDYyLjAyNDcyOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==';
662 +
663 + $this->_libraryPage = add_menu_page( __( 'Visualizer', 'visualizer' ), __( 'Visualizer', 'visualizer' ), 'edit_posts', Visualizer_Plugin::NAME, array( $this, 'renderLibraryPage' ), $svg_base64_icon, 99.7666 );
664 +
665 + add_submenu_page(
666 + Visualizer_Plugin::NAME,
667 + __( 'Chart Library', 'visualizer' ),
668 + __( 'Chart Library', 'visualizer' ),
669 + 'edit_posts',
670 + admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME )
671 + );
672 + add_submenu_page(
673 + Visualizer_Plugin::NAME,
674 + __( 'Add New Chart', 'visualizer' ),
675 + __( 'Add New Chart', 'visualizer' ),
676 + 'edit_posts',
677 + admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME . '&vaction=addnew' )
678 + );
679 + add_submenu_page(
680 + Visualizer_Plugin::NAME,
681 + __( 'Support', 'visualizer' ),
682 + __( '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>',
683 + 'edit_posts',
684 + 'viz-support',
685 + array( $this, 'renderSupportPage' )
686 + );
687 + remove_submenu_page( Visualizer_Plugin::NAME, Visualizer_Plugin::NAME );
688 +
689 + add_action( "load-{$this->_libraryPage}", array( $this, 'addScreenOptions' ) );
551 690 }
552 691
553 692 /**
693 + * Adds the screen options for pagination.
694 + */
695 + function addScreenOptions() {
696 + $screen = get_current_screen();
697 +
698 + // bail if it's some other page.
699 + if ( ! is_object( $screen ) || $screen->id !== $this->_libraryPage ) {
700 + return;
701 + }
702 +
703 + $args = array(
704 + 'label' => __( 'Number of charts per page:', 'visualizer' ),
705 + 'default' => 6,
706 + 'option' => 'visualizer_per_page_library',
707 + );
708 + add_screen_option( 'per_page', $args );
709 + }
710 +
711 + /**
712 + * Returns the screen option for pagination.
713 + */
714 + function setScreenOptions( $status, $option, $value ) {
715 + if ( 'visualizer_per_page_library' === $option ) {
716 + return $value;
717 + }
718 + }
719 +
720 + /**
721 + * Adds the display filters to be used in the meta_query while displaying the charts.
722 + */
723 + private function getDisplayFilters( &$query_args ) {
724 + $query = array();
725 +
726 + // add chart type filter to the query arguments
727 + $type = filter_input( INPUT_GET, 'type' );
728 + if ( $type && in_array( $type, Visualizer_Plugin::getChartTypes(), true ) ) {
729 + $query[] = array(
730 + 'key' => Visualizer_Plugin::CF_CHART_TYPE,
731 + 'value' => $type,
732 + 'compare' => '=',
733 + );
734 + }
735 +
736 + // add chart library filter to the query arguments
737 + $library = filter_input( INPUT_GET, 'library' );
738 + if ( $library ) {
739 + $query[] = array(
740 + 'key' => Visualizer_Plugin::CF_CHART_LIBRARY,
741 + 'value' => $library,
742 + 'compare' => '=',
743 + );
744 + }
745 +
746 + // add date filter to the query arguments
747 + $date = filter_input( INPUT_GET, 'date' );
748 + $possible = array_keys( Visualizer_Plugin::getSupportedDateFilter() );
749 + if ( $date && in_array( $date, $possible, true ) ) {
750 + $query_args['date_query'] = array(
751 + 'after' => "$date -1 day",
752 + 'inclusive' => true,
753 + );
754 + }
755 +
756 + // add source filter to the query arguments
757 + $source = filter_input( INPUT_GET, 'source' );
758 + if ( $source ) {
759 + $source = ucwords( $source );
760 + $source = "Visualizer_Source_{$source}";
761 + $query[] = array(
762 + 'key' => Visualizer_Plugin::CF_SOURCE,
763 + 'value' => $source,
764 + 'compare' => '=',
765 + );
766 + }
767 +
768 + $query_args['meta_query'] = $query;
769 +
770 + $orderby = filter_input( INPUT_GET, 'orderby' );
771 + $order = filter_input( INPUT_GET, 'order' );
772 + if ( $orderby ) {
773 + $query_args['order_by'] = $orderby;
774 + }
775 + $query_args['order'] = empty( $order ) ? 'desc' : $order;
776 + }
777 +
778 + /**
554 779 * Get the instance of WP_Query that fetches the charts as per the given criteria.
555 780 */
556 781 private function getQuery() {
557 782 static $q;
@@ -570,27 +795,32 @@
570 795 'default' => 1,
571 796 ),
572 797 )
573 798 );
799 +
800 + $per_page = 6;
801 + $screen = get_current_screen();
802 + if ( $screen ) {
803 + // retrieve the per_page option
804 + $screen_option = $screen->get_option( 'per_page', 'option' );
805 + // retrieve the value stored for the current user
806 + $user = get_current_user_id();
807 + $per_page = get_user_meta( $user, $screen_option, true );
808 + if ( empty( $per_page ) || $per_page < 1 ) {
809 + // nothing set, get the default value
810 + $per_page = $screen->get_option( 'per_page', 'default' );
811 + }
812 + }
813 +
574 814 // the initial query arguments to fetch charts
575 815 $query_args = array(
576 816 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
577 - 'posts_per_page' => 6,
817 + 'posts_per_page' => $per_page,
578 818 'paged' => $page,
579 819 );
580 - // add chart type filter to the query arguments
581 - $filter = filter_input( INPUT_GET, 'type' );
582 - if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
583 - $query_args['meta_query'] = array(
584 - array(
585 - 'key' => Visualizer_Plugin::CF_CHART_TYPE,
586 - 'value' => $filter,
587 - 'compare' => '=',
588 - ),
589 - );
590 - } else {
591 - $filter = 'all';
592 - }
820 +
821 + $this->getDisplayFilters( $query_args );
822 +
593 823 // Added by Ash/Upwork
594 824 $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
595 825 if ( $filterByMeta ) {
596 826 $query = array(
@@ -601,13 +831,25 @@
601 831 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
602 832 $meta[] = $query;
603 833 $query_args['meta_query'] = $meta;
604 834 }
605 - $q = new WP_Query( $query_args );
835 + $q = new WP_Query( apply_filters( 'visualizer_query_args', $query_args ) );
606 836 return $q;
607 837 }
608 838
609 839 /**
840 + * Renders support page.
841 + *
842 + * @since 3.3.0
843 + *
844 + * @access public
845 + */
846 + public function renderSupportPage() {
847 + wp_enqueue_style( 'visualizer-upsell', VISUALIZER_ABSURL . 'css/upsell.css', array(), Visualizer_Plugin::VERSION );
848 + include_once VISUALIZER_ABSPATH . '/templates/support.php';
849 + }
850 +
851 + /**
610 852 * Renders visualizer library page.
611 853 *
612 854 * @since 1.0.0
613 855 *
@@ -630,9 +872,9 @@
630 872 )
631 873 );
632 874 // add chart type filter to the query arguments
633 875 $filter = filter_input( INPUT_GET, 'type' );
634 - if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) ) {
876 + if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes(), true ) ) ) {
635 877 $filter = 'all';
636 878 }
637 879
638 880 $css = '';
@@ -653,11 +895,14 @@
653 895 if ( ! empty( $atts['settings'] ) ) {
654 896 $settings = apply_filters( $atts['settings'], $settings, $chart->ID, $type );
655 897 }
656 898
657 - unset( $settings['height'], $settings['width'] );
899 + if ( $settings ) {
900 + unset( $settings['height'], $settings['width'], $settings['chartArea'] );
901 + }
902 +
658 903 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
659 - $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
904 + $data = self::get_chart_data( $chart, $type );
660 905
661 906 $library = $this->load_chart_type( $chart->ID );
662 907
663 908 $id = 'visualizer-' . $chart->ID;
@@ -686,14 +931,16 @@
686 931 'language' => $this->get_language(),
687 932 'map_api_key' => get_option( 'visualizer-map-api-key' ),
688 933 'charts' => $charts,
689 934 'urls' => array(
690 - 'base' => add_query_arg( 'vpage', false ),
935 + 'base' => add_query_arg( array( 'vpage' => false, 'vaction' => false ) ),
691 936 'create' => add_query_arg(
692 937 array(
693 938 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
694 939 'library' => 'yes',
695 940 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
941 + 'chart-library' => isset( $_GET['chart-library'] ) ? $_GET['chart-library'] : '',
942 + 'vaction' => false,
696 943 ),
697 944 $ajaxurl
698 945 ),
699 946 'edit' => add_query_arg(
@@ -699,13 +946,19 @@
699 946 'edit' => add_query_arg(
700 947 array(
701 948 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
702 949 'library' => 'yes',
950 + 'vaction' => false,
703 951 ),
704 952 $ajaxurl
705 953 ),
706 954 ),
707 955 'page_type' => 'library',
956 + 'is_front' => false,
957 + 'i10n' => array(
958 + 'copied' => __( 'The shortcode has been copied to your clipboard. Hit Ctrl-V/Cmd-V to paste it.', 'visualizer' ),
959 + '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' ),
960 + ),
708 961 )
709 962 );
710 963 // render library page
711 964 $render = new Visualizer_Render_Library();
@@ -714,9 +967,9 @@
714 967 $render->types = self::_getChartTypesLocalized( false, false, false, true );
715 968 $render->custom_css = $css;
716 969 $render->pagination = paginate_links(
717 970 array(
718 - 'base' => add_query_arg( 'vpage', '%#%' ),
971 + 'base' => add_query_arg( array( 'vpage' => '%#%', 'vaction' => false ) ),
719 972 'format' => '',
720 973 'current' => $page,
721 974 'total' => $query->max_num_pages,
722 975 'type' => 'array',
@@ -737,14 +990,14 @@
737 990 *
738 991 * @return array Updated array of action links.
739 992 */
740 993 public function getPluginActionLinks( $links, $file ) {
741 - if ( $file == plugin_basename( VISUALIZER_BASEFILE ) ) {
994 + if ( $file === plugin_basename( VISUALIZER_BASEFILE ) ) {
742 995 array_unshift(
743 996 $links,
744 997 sprintf(
745 998 '<a href="%s">%s</a>',
746 - admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ),
999 + admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME ),
747 1000 esc_html__( 'Library', 'visualizer' )
748 1001 )
749 1002 );
750 1003 }
@@ -764,17 +1017,17 @@
764 1017 *
765 1018 * @return array Updated array of plugin meta links.
766 1019 */
767 1020 public function getPluginMetaLinks( $plugin_meta, $plugin_file ) {
768 - if ( $plugin_file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1021 + if ( $plugin_file === plugin_basename( VISUALIZER_BASEFILE ) ) {
769 1022 // knowledge base link
770 1023 $plugin_meta[] = sprintf(
771 - '<a href="https://github.com/codeinwp/visualizer/wiki" target="_blank">%s</a>',
772 - esc_html__( 'Knowledge Base', 'visualizer' )
1024 + '<a href="' . VISUALIZER_MAIN_DOC . '" target="_blank">%s</a>',
1025 + esc_html__( 'Docs', 'visualizer' )
773 1026 );
774 1027 // flattr link
775 1028 $plugin_meta[] = sprintf(
776 - '<a style="color:red" href="https://themeisle.com/plugins/visualizer-charts-and-graphs-pro-addon/" target="_blank">%s</a>',
1029 + '<a style="color:red" href="' . Visualizer_Plugin::PRO_TEASER_URL . '" target="_blank">%s</a>',
777 1030 esc_html__( 'Pro Addon', 'visualizer' )
778 1031 );
779 1032 }
780 1033