PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.1.3
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.1.3
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 +88 -499 3.10.13.1.3 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.
@@ -315,9 +216,9 @@
315 216
316 217 // Load all the assets for the different libraries we support.
317 218 $deps = array(
318 219 Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) ),
319 - Visualizer_Render_Sidebar_Type_DataTable_Tabular::enqueue_assets( array( 'media-editor' ) ),
220 + Visualizer_Render_Sidebar_Type_DataTable::enqueue_assets( array( 'media-editor' ) ),
320 221 );
321 222
322 223 wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', $deps, Visualizer_Plugin::VERSION, true );
323 224 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
@@ -366,9 +267,9 @@
366 267 'filters' => $chart_types,
367 268 'types' => array_keys( $chart_types ),
368 269 ),
369 270 'nonce' => wp_create_nonce(),
370 - 'buildurl' => esc_url( add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ) ),
271 + 'buildurl' => add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ),
371 272 );
372 273
373 274 return $strings;
374 275 }
@@ -390,91 +291,64 @@
390 291 'enabled' => true,
391 292 );
392 293 }
393 294
394 - $enabled = self::proFeaturesLocked();
395 -
396 295 $types = array_merge(
397 296 $additional,
398 297 array(
399 - 'tabular' => array(
400 - 'name' => esc_html__( 'Table', 'visualizer' ),
298 + 'dataTable' => array(
299 + 'name' => esc_html__( 'Table (New)', 'visualizer' ),
401 300 'enabled' => true,
402 - 'supports' => $enabled ? array( 'Google Charts', 'DataTable' ) : array( 'DataTable' ),
403 301 ),
404 302 'pie' => array(
405 - 'name' => esc_html__( 'Pie/Donut', 'visualizer' ),
303 + 'name' => esc_html__( 'Pie', 'visualizer' ),
406 304 'enabled' => true,
407 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
408 305 ),
409 306 'line' => array(
410 307 'name' => esc_html__( 'Line', 'visualizer' ),
411 308 'enabled' => true,
412 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
413 309 ),
414 - 'bar' => array(
415 - 'name' => esc_html__( 'Bar', 'visualizer' ),
416 - 'enabled' => true,
417 - 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
418 - ),
419 310 'area' => array(
420 311 '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' ),
312 + 'enabled' => true,
424 313 ),
425 314 'geo' => array(
426 315 'name' => esc_html__( 'Geo', 'visualizer' ),
427 - 'enabled' => $enabled,
428 - 'supports' => array( 'Google Charts' ),
316 + 'enabled' => true,
429 317 ),
318 + 'bar' => array(
319 + 'name' => esc_html__( 'Bar', 'visualizer' ),
320 + 'enabled' => true,
321 + ),
430 322 'column' => array(
431 323 'name' => esc_html__( 'Column', 'visualizer' ),
432 - 'enabled' => $enabled,
433 - 'supports' => array( 'Google Charts', 'ChartJS' ),
324 + 'enabled' => true,
434 325 ),
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' ),
440 - ),
441 326 'scatter' => array(
442 327 'name' => esc_html__( 'Scatter', 'visualizer' ),
443 - 'enabled' => $enabled,
444 - 'supports' => array( 'Google Charts' ),
328 + 'enabled' => true,
445 329 ),
446 330 'gauge' => array(
447 331 'name' => esc_html__( 'Gauge', 'visualizer' ),
448 - 'enabled' => $enabled,
449 - 'supports' => array( 'Google Charts' ),
332 + 'enabled' => true,
450 333 ),
451 334 'candlestick' => array(
452 335 'name' => esc_html__( 'Candlestick', 'visualizer' ),
453 - 'enabled' => $enabled,
454 - 'supports' => array( 'Google Charts' ),
336 + 'enabled' => true,
455 337 ),
456 338 // pro types
339 + 'table' => array(
340 + 'name' => esc_html__( 'Table (Deprecated)', 'visualizer' ),
341 + 'enabled' => false,
342 + ),
457 343 'timeline' => array(
458 344 'name' => esc_html__( 'Timeline', 'visualizer' ),
459 345 'enabled' => false,
460 - 'supports' => array( 'Google Charts', 'ChartJS' ),
461 346 ),
462 347 'combo' => array(
463 348 'name' => esc_html__( 'Combo', 'visualizer' ),
464 349 'enabled' => false,
465 - 'supports' => array( 'Google Charts' ),
466 350 ),
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 351 )
478 352 );
479 353 $types = apply_filters( 'visualizer_pro_chart_types', $types );
480 354 if ( $enabledOnly ) {
@@ -483,12 +357,8 @@
483 357 if ( ! is_array( $array ) ) {
484 358 // support for old pro
485 359 $array = array( 'enabled' => true, 'name' => $array );
486 360 }
487 - // backward compatibility for PRO before v1.9.0
488 - if ( ! array_key_exists( 'supports', $array ) ) {
489 - $array['supports'] = array( 'Google Charts' );
490 - }
491 361 if ( ! $array['enabled'] ) {
492 362 continue;
493 363 }
494 364 $filtered[ $type ] = $array;
@@ -501,12 +371,8 @@
501 371 if ( ! is_array( $array ) ) {
502 372 // support for old pro
503 373 $array = array( 'enabled' => true, 'name' => $array );
504 374 }
505 - // backward compatibility for PRO before v1.9.0
506 - if ( ! array_key_exists( 'supports', $array ) ) {
507 - $array['supports'] = array( 'Google Charts' );
508 - }
509 375 $doubleD[ $type ] = $array['name'];
510 376 }
511 377 $types = $doubleD;
512 378 }
@@ -520,13 +386,21 @@
520 386 private static function handleDeprecatedCharts( $types, $enabledOnly, $get2Darray, $where ) {
521 387 $deprecated = array();
522 388
523 389 switch ( $where ) {
524 - case 'types':
525 - // fall-through
526 390 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 +
527 401 // if a user has a Gauge/Candlestick chart, then let them keep using it.
528 - if ( ! Visualizer_Module::is_pro() ) {
402 + if ( ! VISUALIZER_PRO ) {
529 403 if ( ! self::hasChartType( 'gauge' ) ) {
530 404 if ( $get2Darray ) {
531 405 $deprecated[] = 'gauge';
532 406 } else {
@@ -542,10 +416,20 @@
542 416 }
543 417 }
544 418 break;
545 419 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 +
546 430 // if a user has a Gauge/Candlestick chart, then let them keep using it.
547 - if ( ! Visualizer_Module::is_pro() ) {
431 + if ( ! VISUALIZER_PRO ) {
548 432 if ( ! self::hasChartType( 'gauge' ) ) {
549 433 if ( $get2Darray ) {
550 434 $deprecated[] = 'gauge';
551 435 } else {
@@ -580,9 +464,9 @@
580 464 * @access public
581 465 */
582 466 public function renderTemplates() {
583 467 global $pagenow;
584 - if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
468 + if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
585 469 return;
586 470 }
587 471 $render = new Visualizer_Render_Templates();
588 472 $render->render();
@@ -600,9 +484,9 @@
600 484 *
601 485 * @param string $suffix The current page suffix.
602 486 */
603 487 public function enqueueLibraryScripts( $suffix ) {
604 - if ( $suffix === $this->_libraryPage ) {
488 + if ( $suffix == $this->_libraryPage ) {
605 489 wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
606 490 $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
607 491 wp_enqueue_media();
608 492 wp_enqueue_script(
@@ -610,9 +494,8 @@
610 494 VISUALIZER_ABSURL . 'js/library.js',
611 495 array(
612 496 'jquery',
613 497 'media-views',
614 - 'clipboard',
615 498 ),
616 499 Visualizer_Plugin::VERSION,
617 500 true
618 501 );
@@ -661,187 +544,14 @@
661 544 *
662 545 * @access public
663 546 */
664 547 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' ) );
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 );
706 551 }
707 552
708 553 /**
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 554 * Get the instance of WP_Query that fetches the charts as per the given criteria.
845 555 */
846 556 private function getQuery() {
847 557 static $q;
@@ -860,34 +570,29 @@
860 570 'default' => 1,
861 571 ),
862 572 )
863 573 );
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 574 // the initial query arguments to fetch charts
880 575 $query_args = array(
881 576 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
882 - 'posts_per_page' => $per_page,
577 + 'posts_per_page' => 6,
883 578 'paged' => $page,
884 579 );
885 -
886 - $this->getDisplayFilters( $query_args );
887 -
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 + }
888 593 // Added by Ash/Upwork
889 - $filterByMeta = ! empty( $_GET['s'] ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
594 + $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
890 595 if ( $filterByMeta ) {
891 596 $query = array(
892 597 'key' => Visualizer_Plugin::CF_SETTINGS,
893 598 'value' => $filterByMeta,
@@ -896,25 +601,13 @@
896 601 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
897 602 $meta[] = $query;
898 603 $query_args['meta_query'] = $meta;
899 604 }
900 - $q = new WP_Query( apply_filters( 'visualizer_query_args', $query_args ) );
605 + $q = new WP_Query( $query_args );
901 606 return $q;
902 607 }
903 608
904 609 /**
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 610 * Renders visualizer library page.
918 611 *
919 612 * @since 1.0.0
920 613 *
@@ -937,9 +630,9 @@
937 630 )
938 631 );
939 632 // add chart type filter to the query arguments
940 633 $filter = filter_input( INPUT_GET, 'type' );
941 - if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes(), true ) ) ) {
634 + if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) ) {
942 635 $filter = 'all';
943 636 }
944 637
945 638 $css = '';
@@ -960,27 +653,12 @@
960 653 if ( ! empty( $atts['settings'] ) ) {
961 654 $settings = apply_filters( $atts['settings'], $settings, $chart->ID, $type );
962 655 }
963 656
964 - if ( $settings ) {
965 - unset( $settings['height'], $settings['width'], $settings['chartArea'] );
966 - }
967 -
657 + unset( $settings['height'], $settings['width'] );
968 658 $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 );
659 + $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
970 660
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 661 $library = $this->load_chart_type( $chart->ID );
984 662
985 663 $id = 'visualizer-' . $chart->ID;
986 664 $arguments = $this->get_inline_custom_css( $id, $settings );
@@ -988,15 +666,8 @@
988 666 $css .= $arguments[0];
989 667 $settings = $arguments[1];
990 668 }
991 669
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 670 // add chart to the array
1000 671 $charts[ $id ] = array(
1001 672 'id' => $chart->ID,
1002 673 'type' => $type,
@@ -1015,38 +686,26 @@
1015 686 'language' => $this->get_language(),
1016 687 'map_api_key' => get_option( 'visualizer-map-api-key' ),
1017 688 'charts' => $charts,
1018 689 '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 - )
690 + 'base' => add_query_arg( 'vpage', false ),
691 + 'create' => add_query_arg(
692 + array(
693 + 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
694 + 'library' => 'yes',
695 + 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
696 + ),
697 + $ajaxurl
1031 698 ),
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 - )
699 + 'edit' => add_query_arg(
700 + array(
701 + 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
702 + 'library' => 'yes',
703 + ),
704 + $ajaxurl
1041 705 ),
1042 706 ),
1043 707 '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 708 )
1050 709 );
1051 710 // render library page
1052 711 $render = new Visualizer_Render_Library();
@@ -1055,9 +714,9 @@
1055 714 $render->types = self::_getChartTypesLocalized( false, false, false, true );
1056 715 $render->custom_css = $css;
1057 716 $render->pagination = paginate_links(
1058 717 array(
1059 - 'base' => add_query_arg( array( 'vpage' => '%#%', 'vaction' => false ) ),
718 + 'base' => add_query_arg( 'vpage', '%#%' ),
1060 719 'format' => '',
1061 720 'current' => $page,
1062 721 'total' => $query->max_num_pages,
1063 722 'type' => 'array',
@@ -1078,14 +737,14 @@
1078 737 *
1079 738 * @return array Updated array of action links.
1080 739 */
1081 740 public function getPluginActionLinks( $links, $file ) {
1082 - if ( $file === plugin_basename( VISUALIZER_BASEFILE ) ) {
741 + if ( $file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1083 742 array_unshift(
1084 743 $links,
1085 744 sprintf(
1086 745 '<a href="%s">%s</a>',
1087 - admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME ),
746 + admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ),
1088 747 esc_html__( 'Library', 'visualizer' )
1089 748 )
1090 749 );
1091 750 }
@@ -1105,17 +764,17 @@
1105 764 *
1106 765 * @return array Updated array of plugin meta links.
1107 766 */
1108 767 public function getPluginMetaLinks( $plugin_meta, $plugin_file ) {
1109 - if ( $plugin_file === plugin_basename( VISUALIZER_BASEFILE ) ) {
768 + if ( $plugin_file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1110 769 // knowledge base link
1111 770 $plugin_meta[] = sprintf(
1112 - '<a href="' . VISUALIZER_MAIN_DOC . '" target="_blank">%s</a>',
1113 - esc_html__( 'Docs', 'visualizer' )
771 + '<a href="https://github.com/codeinwp/visualizer/wiki" target="_blank">%s</a>',
772 + esc_html__( 'Knowledge Base', 'visualizer' )
1114 773 );
1115 774 // flattr link
1116 775 $plugin_meta[] = sprintf(
1117 - '<a style="color:red" href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'pluginrow' ) . '" target="_blank">%s</a>',
776 + '<a style="color:red" href="https://themeisle.com/plugins/visualizer-charts-and-graphs-pro-addon/" target="_blank">%s</a>',
1118 777 esc_html__( 'Pro Addon', 'visualizer' )
1119 778 );
1120 779 }
1121 780
@@ -1121,75 +780,5 @@
1121 780
1122 781 return $plugin_meta;
1123 782 }
1124 783
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 784 }