PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.11.4
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.11.4
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 +615 -98 3.1.03.11.4 View file →
@@ -52,26 +52,131 @@
52 52 public function __construct( Visualizer_Plugin $plugin ) {
53 53 parent::__construct( $plugin );
54 54 $this->_addAction( 'load-post.php', 'enqueueMediaScripts' );
55 55 $this->_addAction( 'load-post-new.php', 'enqueueMediaScripts' );
56 + $this->_addAction( 'enqueue_block_editor_assets', 'enqueueMediaScripts' );
56 57 $this->_addAction( 'admin_footer', 'renderTemplates' );
57 - $this->_addAction( 'admin_enqueue_scripts', 'enqueueLibraryScripts', null, 8 );
58 + $this->_addAction( 'admin_enqueue_scripts', 'enqueueLibraryScripts', null, 0 );
58 59 $this->_addAction( 'admin_menu', 'registerAdminMenu' );
59 60 $this->_addFilter( 'media_view_strings', 'setupMediaViewStrings' );
60 61 $this->_addFilter( 'plugin_action_links', 'getPluginActionLinks', 10, 2 );
62 + $this->_addFilter( 'plugin_row_meta', 'getPluginMetaLinks', 10, 2 );
61 63 $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
62 - $this->_addFilter( 'visualizer_get_chart_counts', 'getChartCountsByTypeAndMeta' );
63 64 $this->_addFilter( 'visualizer_feedback_review_trigger', 'feedbackReviewTrigger' );
64 65
66 + // screen pagination
67 + $this->_addFilter( 'set-screen-option', 'setScreenOptions', 10, 3 );
68 +
65 69 // revision support.
66 70 $this->_addFilter( 'wp_revisions_to_keep', 'limitRevisions', null, 10, 2 );
67 71 $this->_addAction( '_wp_put_post_revision', 'addRevision', null, 10, 1 );
68 72 $this->_addAction( 'wp_restore_post_revision', 'restoreRevision', null, 10, 2 );
69 73
74 + $this->_addAction( 'visualizer_chart_schedules_spl', 'addSplChartSchedules', null, 10, 3 );
75 +
70 76 $this->_addAction( 'admin_init', 'init' );
77 +
78 + $this->_addAction( 'visualizer_chart_languages', 'addMultilingualSupport' );
79 +
80 + $this->_addFilter( 'admin_footer_text', 'render_review_notice' );
81 +
82 + if ( defined( 'TI_CYPRESS_TESTING' ) ) {
83 + $this->load_cypress_hooks();
84 + }
85 +
71 86 }
87 + /**
88 + * Display review notice.
89 + */
90 + public function render_review_notice( $footer_text ) {
91 + $current_screen = get_current_screen();
72 92
93 + $visualizer_page_ids = ['toplevel_page_visualizer', 'visualizer_page_viz-support', 'visualizer_page_ti-about-visualizer' ];
94 +
95 + if ( ! empty( $current_screen ) && isset( $current_screen->id ) ) {
96 + foreach ( $visualizer_page_ids as $page_to_check ) {
97 + if ( strpos( $current_screen->id, $page_to_check ) !== false ) {
98 + $footer_text = sprintf(
99 + __( 'Enjoying %1$s? %2$s %3$s rating. Thank you for being so supportive!', 'visualizer' ),
100 + '<b>Visualizer</b>',
101 + esc_html__( 'You can help us by leaving a', 'visualizer' ),
102 + '<a href="https://wordpress.org/support/plugin/visualizer/reviews/" target="_blank">&#9733;&#9733;&#9733;&#9733;&#9733;</a>'
103 + );
104 + break;
105 + }
106 + }
107 + }
108 +
109 + return $footer_text;
110 + }
111 +
112 +
73 113 /**
114 + * Define the hooks that are needed for cypress.
115 + *
116 + * @since 3.4.0
117 + * @access private
118 + */
119 + private function load_cypress_hooks() {
120 + // all charts should load on the same page without pagination.
121 + add_filter(
122 + 'visualizer_query_args', function( $args ) {
123 + $args['posts_per_page'] = 20;
124 + return $args;
125 + }, 10, 1
126 + );
127 + }
128 +
129 + /**
130 + * Add disabled `optgroup` schedules to the drop downs.
131 + *
132 + * @since ?
133 + *
134 + * @access public
135 + *
136 + * @param string $feature The feature for which to add schedules.
137 + * @param int $chart_id The chart ID.
138 + * @param int $plan The plan number.
139 + */
140 + public function addSplChartSchedules( $feature, $chart_id, $plan ) {
141 + if ( apply_filters( 'visualizer_is_business', false ) ) {
142 + return;
143 + }
144 +
145 + $is_new_personal = apply_filters( 'visualizer_is_new_personal', false );
146 +
147 + $hours = array(
148 + '0.16' => __( '10 minutes', 'visualizer' ),
149 + '1' => __( 'Each hour', 'visualizer' ),
150 + '12' => __( 'Each 12 hours', 'visualizer' ),
151 + '24' => __( 'Each day', 'visualizer' ),
152 + '72' => __( 'Each 3 days', 'visualizer' ),
153 + );
154 +
155 + switch ( $feature ) {
156 + case 'json':
157 + case 'csv':
158 + // no more schedules if pro is already active.
159 + if ( Visualizer_Module::is_pro() && ! $is_new_personal ) {
160 + return;
161 + }
162 + break;
163 + case 'wp':
164 + // fall-through.
165 + case 'db':
166 + break;
167 + default:
168 + return;
169 + }
170 +
171 + echo '<optgroup disabled label="' . __( 'Upgrade required', 'visualizer' ) . '">';
172 + foreach ( $hours as $hour => $desc ) {
173 + echo '<option disabled>' . $desc . '</option>';
174 + }
175 + echo '</optgroup>';
176 + }
177 +
178 + /**
74 179 * No limits on revisions.
75 180 */
76 181 public function limitRevisions( $num, $post ) {
77 182 if ( Visualizer_Plugin::CPT_VISUALIZER === $post->post_type ) {
@@ -132,16 +237,31 @@
132 237 *
133 238 * @access public
134 239 */
135 240 public function init() {
241 + // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
136 242 if ( current_user_can( 'edit_posts' ) && current_user_can( 'edit_pages' ) && 'true' == get_user_option( 'rich_editing' ) ) {
137 243 $this->_addFilter( 'mce_external_languages', 'add_tinymce_lang', 10, 1 );
138 244 $this->_addFilter( 'mce_external_plugins', 'tinymce_plugin', 10, 1 );
139 245 $this->_addFilter( 'mce_buttons', 'register_mce_button', 10, 1 );
246 + $this->_addFilter( 'tiny_mce_before_init', 'get_strings_for_block', 10, 1 );
140 247 }
141 248 }
142 249
143 250 /**
251 + * Add the strings required for the TinyMCE buttons for the classic block (not the classic editor).
252 + *
253 + * @since ?
254 + * @access friendly
255 + */
256 + function get_strings_for_block( $settings ) {
257 + $class = new Visualizer_Module_Language();
258 + $strings = $class->get_strings();
259 + $array = array( 'visualizer_tinymce_plugin' => json_encode( $strings ) );
260 + return array_merge( $settings, $array );
261 + }
262 +
263 + /**
144 264 * Load plugin translation for - TinyMCE API
145 265 *
146 266 * @access public
147 267 * @param array $arr The tinymce_lang array.
@@ -210,14 +330,18 @@
210 330 * @access public
211 331 */
212 332 public function enqueueMediaScripts() {
213 333 global $typenow;
214 - if ( post_type_supports( $typenow, 'editor' ) ) {
334 + global $current_screen;
335 +
336 + if ( post_type_supports( $typenow, 'editor' ) || $current_screen->id === 'widgets' || $current_screen->id === 'customize' ) {
215 337 wp_enqueue_style( 'visualizer-media', VISUALIZER_ABSURL . 'css/media.css', array( 'media-views' ), Visualizer_Plugin::VERSION );
216 338
217 339 // Load all the assets for the different libraries we support.
218 - $deps = Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) );
219 - $deps += Visualizer_Render_Sidebar_Type_DataTable::enqueue_assets( array( 'media-editor' ) );
340 + $deps = array(
341 + Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) ),
342 + Visualizer_Render_Sidebar_Type_DataTable_Tabular::enqueue_assets( array( 'media-editor' ) ),
343 + );
220 344
221 345 wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', $deps, Visualizer_Plugin::VERSION, true );
222 346 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
223 347 wp_enqueue_script( 'visualizer-media-controller', VISUALIZER_ABSURL . 'js/media/controller.js', array( 'visualizer-media-collection' ), Visualizer_Plugin::VERSION, true );
@@ -265,9 +389,9 @@
265 389 'filters' => $chart_types,
266 390 'types' => array_keys( $chart_types ),
267 391 ),
268 392 'nonce' => wp_create_nonce(),
269 - 'buildurl' => add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ),
393 + 'buildurl' => esc_url( add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ) ),
270 394 );
271 395
272 396 return $strings;
273 397 }
@@ -289,64 +413,91 @@
289 413 'enabled' => true,
290 414 );
291 415 }
292 416
417 + $enabled = self::proFeaturesLocked();
418 +
293 419 $types = array_merge(
294 420 $additional,
295 421 array(
296 - 'dataTable' => array(
297 - 'name' => esc_html__( 'Table (New)', 'visualizer' ),
422 + 'tabular' => array(
423 + 'name' => esc_html__( 'Table', 'visualizer' ),
298 424 'enabled' => true,
425 + 'supports' => $enabled ? array( 'Google Charts', 'DataTable' ) : array( 'DataTable' ),
299 426 ),
300 427 'pie' => array(
301 - 'name' => esc_html__( 'Pie', 'visualizer' ),
428 + 'name' => esc_html__( 'Pie/Donut', 'visualizer' ),
302 429 'enabled' => true,
430 + 'supports' => array( 'Google Charts', 'ChartJS' ),
303 431 ),
304 432 'line' => array(
305 433 'name' => esc_html__( 'Line', 'visualizer' ),
306 434 'enabled' => true,
435 + 'supports' => array( 'Google Charts', 'ChartJS' ),
307 436 ),
437 + 'bar' => array(
438 + 'name' => esc_html__( 'Bar', 'visualizer' ),
439 + 'enabled' => true,
440 + 'supports' => $enabled ? array( 'Google Charts', 'ChartJS' ) : array( 'Google Charts' ),
441 + ),
308 442 'area' => array(
309 443 'name' => esc_html__( 'Area', 'visualizer' ),
310 - 'enabled' => true,
444 + 'enabled' => $enabled,
445 + // in ChartJS, the fill option is used to make Line chart an area: https://www.chartjs.org/docs/latest/charts/area.html
446 + 'supports' => array( 'Google Charts' ),
311 447 ),
312 448 'geo' => array(
313 449 'name' => esc_html__( 'Geo', 'visualizer' ),
314 - 'enabled' => true,
450 + 'enabled' => $enabled,
451 + 'supports' => array( 'Google Charts' ),
315 452 ),
316 - 'bar' => array(
317 - 'name' => esc_html__( 'Bar', 'visualizer' ),
318 - 'enabled' => true,
319 - ),
320 453 'column' => array(
321 454 'name' => esc_html__( 'Column', 'visualizer' ),
322 - 'enabled' => true,
455 + 'enabled' => $enabled,
456 + 'supports' => array( 'Google Charts', 'ChartJS' ),
323 457 ),
324 - 'gauge' => array(
325 - 'name' => esc_html__( 'Gauge', 'visualizer' ),
326 - 'enabled' => true,
458 + 'bubble' => array(
459 + 'name' => esc_html__( 'Bubble', 'visualizer' ),
460 + 'enabled' => $enabled,
461 + // chartjs' bubble is ugly looking (and it won't work off the default bubble.csv) so it is being excluded for the time being.
462 + 'supports' => array( 'Google Charts' ),
327 463 ),
328 464 'scatter' => array(
329 465 'name' => esc_html__( 'Scatter', 'visualizer' ),
330 - 'enabled' => true,
466 + 'enabled' => $enabled,
467 + 'supports' => array( 'Google Charts' ),
331 468 ),
469 + 'gauge' => array(
470 + 'name' => esc_html__( 'Gauge', 'visualizer' ),
471 + 'enabled' => $enabled,
472 + 'supports' => array( 'Google Charts' ),
473 + ),
332 474 'candlestick' => array(
333 475 'name' => esc_html__( 'Candlestick', 'visualizer' ),
334 - 'enabled' => true,
476 + 'enabled' => $enabled,
477 + 'supports' => array( 'Google Charts' ),
335 478 ),
336 479 // pro types
337 - 'table' => array(
338 - 'name' => esc_html__( 'Table (Deprecated)', 'visualizer' ),
339 - 'enabled' => false,
340 - ),
341 480 'timeline' => array(
342 481 'name' => esc_html__( 'Timeline', 'visualizer' ),
343 482 'enabled' => false,
483 + 'supports' => array( 'Google Charts', 'ChartJS' ),
344 484 ),
345 485 'combo' => array(
346 486 'name' => esc_html__( 'Combo', 'visualizer' ),
347 487 'enabled' => false,
488 + 'supports' => array( 'Google Charts' ),
348 489 ),
490 + 'polarArea' => array(
491 + 'name' => esc_html__( 'Polar Area', 'visualizer' ),
492 + 'enabled' => false,
493 + 'supports' => array( 'ChartJS' ),
494 + ),
495 + 'radar' => array(
496 + 'name' => esc_html__( 'Radar/Spider', 'visualizer' ),
497 + 'enabled' => false,
498 + 'supports' => array( 'ChartJS' ),
499 + ),
349 500 )
350 501 );
351 502 $types = apply_filters( 'visualizer_pro_chart_types', $types );
352 503 if ( $enabledOnly ) {
@@ -355,8 +506,12 @@
355 506 if ( ! is_array( $array ) ) {
356 507 // support for old pro
357 508 $array = array( 'enabled' => true, 'name' => $array );
358 509 }
510 + // backward compatibility for PRO before v1.9.0
511 + if ( ! array_key_exists( 'supports', $array ) ) {
512 + $array['supports'] = array( 'Google Charts' );
513 + }
359 514 if ( ! $array['enabled'] ) {
360 515 continue;
361 516 }
362 517 $filtered[ $type ] = $array;
@@ -369,8 +524,12 @@
369 524 if ( ! is_array( $array ) ) {
370 525 // support for old pro
371 526 $array = array( 'enabled' => true, 'name' => $array );
372 527 }
528 + // backward compatibility for PRO before v1.9.0
529 + if ( ! array_key_exists( 'supports', $array ) ) {
530 + $array['supports'] = array( 'Google Charts' );
531 + }
373 532 $doubleD[ $type ] = $array['name'];
374 533 }
375 534 $types = $doubleD;
376 535 }
@@ -384,49 +543,45 @@
384 543 private static function handleDeprecatedCharts( $types, $enabledOnly, $get2Darray, $where ) {
385 544 $deprecated = array();
386 545
387 546 switch ( $where ) {
547 + case 'types':
548 + // fall-through
388 549 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 -
399 550 // if a user has a Gauge/Candlestick chart, then let them keep using it.
400 - if ( ! VISUALIZER_PRO ) {
551 + if ( ! Visualizer_Module::is_pro() ) {
401 552 if ( ! self::hasChartType( 'gauge' ) ) {
402 - $deprecated[] = 'gauge';
553 + if ( $get2Darray ) {
554 + $deprecated[] = 'gauge';
555 + } else {
556 + $types['gauge']['enabled'] = false;
557 + }
403 558 }
404 559 if ( ! self::hasChartType( 'candlestick' ) ) {
405 - $deprecated[] = 'candlestick';
560 + if ( $get2Darray ) {
561 + $deprecated[] = 'candlestick';
562 + } else {
563 + $types['candlestick']['enabled'] = false;
564 + }
406 565 }
407 566 }
408 567 break;
409 568 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 -
422 569 // if a user has a Gauge/Candlestick chart, then let them keep using it.
423 - if ( ! VISUALIZER_PRO ) {
570 + if ( ! Visualizer_Module::is_pro() ) {
424 571 if ( ! self::hasChartType( 'gauge' ) ) {
425 - $deprecated[] = 'gauge';
572 + if ( $get2Darray ) {
573 + $deprecated[] = 'gauge';
574 + } else {
575 + $types['gauge']['enabled'] = false;
576 + }
426 577 }
427 578 if ( ! self::hasChartType( 'candlestick' ) ) {
428 - $deprecated[] = 'candlestick';
579 + if ( $get2Darray ) {
580 + $deprecated[] = 'candlestick';
581 + } else {
582 + $types['candlestick']['enabled'] = false;
583 + }
429 584 }
430 585 }
431 586 }
432 587
@@ -448,9 +603,9 @@
448 603 * @access public
449 604 */
450 605 public function renderTemplates() {
451 606 global $pagenow;
452 - if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
607 + if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
453 608 return;
454 609 }
455 610 $render = new Visualizer_Render_Templates();
456 611 $render->render();
@@ -468,9 +623,9 @@
468 623 *
469 624 * @param string $suffix The current page suffix.
470 625 */
471 626 public function enqueueLibraryScripts( $suffix ) {
472 - if ( $suffix == $this->_libraryPage ) {
627 + if ( $suffix === $this->_libraryPage ) {
473 628 wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
474 629 $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
475 630 wp_enqueue_media();
476 631 wp_enqueue_script(
@@ -478,8 +633,9 @@
478 633 VISUALIZER_ABSURL . 'js/library.js',
479 634 array(
480 635 'jquery',
481 636 'media-views',
637 + 'clipboard',
482 638 ),
483 639 Visualizer_Plugin::VERSION,
484 640 true
485 641 );
@@ -528,14 +684,177 @@
528 684 *
529 685 * @access public
530 686 */
531 687 public function registerAdminMenu() {
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 );
688 + $svg_base64_icon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNzdweCIgaGVpZ2h0PSI3N3B4IiB2aWV3Qm94PSIwIDAgNzcgNzciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjYgKDY3NDkxKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5Db21iaW5lZCBTaGFwZTwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJQcm9kdWN0LVBhZ2UiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJXb3JkUHJlc3MtcGx1Z2lucyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE5MC4wMDAwMDAsIC00MzUuMDAwMDAwKSIgZmlsbD0iIzM5QzNEMiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMjguNSw1MTIgQzIwNy4yMzcwMzcsNTEyIDE5MCw0OTQuNzYyOTYzIDE5MCw0NzMuNSBDMTkwLDQ1Mi4yMzcwMzcgMjA3LjIzNzAzNyw0MzUgMjI4LjUsNDM1IEMyNDkuNzYyOTYzLDQzNSAyNjcsNDUyLjIzNzAzNyAyNjcsNDczLjUgQzI2Nyw0OTQuNzYyOTYzIDI0OS43NjI5NjMsNTEyIDIyOC41LDUxMiBaIE0yNDYuODQzNzUsNDgzLjU5MjA1OSBMMjE1LjYyNSw0ODMuNTkyMDU5IEwyMTUuNjI1LDQ2MC44MjY1NDQgQzIxNS42MjUsNDYwLjE2NDU0NyAyMTUuMTA3NTc4LDQ1OS42MjgzNTkgMjE0LjQ2ODc1LDQ1OS42MjgzNTkgTDIxMi4xNTYyNSw0NTkuNjI4MzU5IEMyMTEuNTE3NDIyLDQ1OS42MjgzNTkgMjExLDQ2MC4xNjQ1NDcgMjExLDQ2MC44MjY1NDQgTDIxMSw0ODUuOTg4NDI5IEMyMTEsNDg3LjMxMTY3NCAyMTIuMDM1NTY2LDQ4OC4zODQ3OTggMjEzLjMxMjUsNDg4LjM4NDc5OCBMMjQ2Ljg0Mzc1LDQ4OC4zODQ3OTggQzI0Ny40ODI1NzgsNDg4LjM4NDc5OCAyNDgsNDg3Ljg0ODYxMSAyNDgsNDg3LjE4NjYxMyBMMjQ4LDQ4NC43OTAyNDQgQzI0OCw0ODQuMTI4MjQ2IDI0Ny40ODI1NzgsNDgzLjU5MjA1OSAyNDYuODQzNzUsNDgzLjU5MjA1OSBaIE0yNDQuNTMxMjUsNDYyLjAyNDcyOSBMMjM1Ljk5OTU3LDQ2Mi4wMjQ3MjkgQzIzNC40NTQ1MzEsNDYyLjAyNDcyOSAyMzMuNjgwNTY2LDQ2My45NjA1NDcgMjM0Ljc3MzIyMyw0NjUuMDkyODMyIEwyMzcuMTE0NjI5LDQ2Ny41MTkxNTYgTDIzMS44MTI1LDQ3My4wMTQzMzIgTDIyNi41MTAzNzEsNDY3LjUxOTkwNSBDMjI1LjYwNzA1MSw0NjYuNTgzODIzIDIyNC4xNDI5NDksNDY2LjU4MzgyMyAyMjMuMjQwMzUyLDQ2Ny41MTk5MDUgTDIxOC4yNzY0MjYsNDcyLjY2Mzg2MyBDMjE3LjgyNDc2Niw0NzMuMTMxOTA0IDIxNy44MjQ3NjYsNDczLjg5MDUwNSAyMTguMjc2NDI2LDQ3NC4zNTg1NDYgTDIxOS45MTEwNzQsNDc2LjA1MjQ4IEMyMjAuMzYyNzM0LDQ3Ni41MjA1MjEgMjIxLjA5NDc4NSw0NzYuNTIwNTIxIDIyMS41NDY0NDUsNDc2LjA1MjQ4IEwyMjQuODc1LDQ3Mi42MDI0NTYgTDIzMC4xNzcxMjksNDc4LjA5Njg4MyBDMjMxLjA4MDQ0OSw0NzkuMDMyOTY1IDIzMi41NDQ1NTEsNDc5LjAzMjk2NSAyMzMuNDQ3MTQ4LDQ3OC4wOTY4ODMgTDI0MC4zODQ2NDgsNDcwLjkwNzc3MyBMMjQyLjcyNjA1NSw0NzMuMzM0MDk4IEMyNDMuODE4NzExLDQ3NC40NjYzODIgMjQ1LjY4Njc3Nyw0NzMuNjY0MzQ3IDI0NS42ODY3NzcsNDcyLjA2MzI3MyBMMjQ1LjY4Njc3Nyw0NjMuMjIyOTE0IEMyNDUuNjg3NSw0NjIuNTYwOTE3IDI0NS4xNzAwNzgsNDYyLjAyNDcyOSAyNDQuNTMxMjUsNDYyLjAyNDcyOSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==';
689 +
690 + $this->_libraryPage = add_menu_page( __( 'Visualizer', 'visualizer' ), __( 'Visualizer', 'visualizer' ), 'edit_posts', Visualizer_Plugin::NAME, array( $this, 'renderLibraryPage' ), $svg_base64_icon, 99.7666 );
691 +
692 + add_submenu_page(
693 + Visualizer_Plugin::NAME,
694 + __( 'Chart Library', 'visualizer' ),
695 + __( 'Chart Library', 'visualizer' ),
696 + 'edit_posts',
697 + 'admin.php?page=' . Visualizer_Plugin::NAME
698 + );
699 + add_submenu_page(
700 + Visualizer_Plugin::NAME,
701 + __( 'Add New Chart', 'visualizer' ),
702 + __( 'Add New Chart', 'visualizer' ),
703 + 'edit_posts',
704 + 'admin.php?page=' . Visualizer_Plugin::NAME . '&vaction=addnew'
705 + );
706 + add_submenu_page(
707 + Visualizer_Plugin::NAME,
708 + __( 'Support', 'visualizer' ),
709 + __( '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>',
710 + 'edit_posts',
711 + 'viz-support',
712 + array( $this, 'renderSupportPage' )
713 + );
714 +
715 + remove_submenu_page( Visualizer_Plugin::NAME, Visualizer_Plugin::NAME );
716 +
717 + add_action( "load-{$this->_libraryPage}", array( $this, 'addScreenOptions' ) );
718 + add_action( 'admin_footer', array( $this, 'handleGetProSubMenu' ) );
535 719 }
536 720
537 721 /**
722 + * Handle get pro plugin submenu.
723 + */
724 + public function handleGetProSubMenu() {
725 + if ( ! Visualizer_Module::is_pro() ) {
726 + ?>
727 + <style type="text/css">
728 + #toplevel_page_visualizer ul.wp-submenu li:last-child {
729 + background: #FF7E65;
730 + font-size: 14px;
731 + font-weight: 600;
732 + color: #fff;
733 + }
734 + #toplevel_page_visualizer ul.wp-submenu li:last-child > a {
735 + color: #fff !important;
736 + }
737 + #toplevel_page_visualizer ul.wp-submenu li:last-child > a:hover {
738 + box-shadow: inherit;
739 + }
740 + </style>
741 + <?php
742 + if ( get_option( 'visualizer_fresh_install', false ) ) {
743 + ?>
744 + <style type="text/css">
745 + #toplevel_page_visualizer ul.wp-submenu li.wp-first-item + li + li + li {
746 + display: none;
747 + }
748 + </style>
749 + <?php
750 + }
751 + }
752 + }
753 +
754 + /**
755 + * Adds the screen options for pagination.
756 + */
757 + function addScreenOptions() {
758 + $screen = get_current_screen();
759 +
760 + // bail if it's some other page.
761 + if ( ! is_object( $screen ) || $screen->id !== $this->_libraryPage ) {
762 + return;
763 + }
764 +
765 + $args = array(
766 + 'label' => __( 'Number of charts per page:', 'visualizer' ),
767 + 'default' => 6,
768 + 'option' => 'visualizer_library_per_page',
769 + );
770 + add_screen_option( 'per_page', $args );
771 + }
772 +
773 + /**
774 + * Returns the screen option for pagination.
775 + */
776 + function setScreenOptions( $status, $option, $value ) {
777 + if ( 'visualizer_library_per_page' === $option ) {
778 + return $value;
779 + }
780 + }
781 +
782 + /**
783 + * Adds the display filters to be used in the meta_query while displaying the charts.
784 + */
785 + private function getDisplayFilters( &$query_args ) {
786 + $query = array();
787 + global $sitepress;
788 + if ( Visualizer_Module::is_pro() && ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) ) {
789 + $current_lang = icl_get_current_language();
790 + if ( in_array( $current_lang, array( 'all', icl_get_default_language() ), true ) ) {
791 + $query[] = array(
792 + 'key' => 'chart_lang',
793 + 'compare' => 'NOT EXISTS',
794 + );
795 + } else {
796 + $query[] = array(
797 + 'key' => 'chart_lang',
798 + 'value' => $current_lang,
799 + 'compare' => '=',
800 + );
801 + }
802 + }
803 +
804 + // add chart type filter to the query arguments
805 + $type = filter_input( INPUT_GET, 'type' );
806 + if ( $type && in_array( $type, Visualizer_Plugin::getChartTypes(), true ) ) {
807 + $query[] = array(
808 + 'key' => Visualizer_Plugin::CF_CHART_TYPE,
809 + 'value' => $type,
810 + 'compare' => '=',
811 + );
812 + }
813 +
814 + // add chart library filter to the query arguments
815 + $library = filter_input( INPUT_GET, 'library' );
816 + if ( $library ) {
817 + $query[] = array(
818 + 'key' => Visualizer_Plugin::CF_CHART_LIBRARY,
819 + 'value' => $library,
820 + 'compare' => '=',
821 + );
822 + }
823 +
824 + // add date filter to the query arguments
825 + $date = filter_input( INPUT_GET, 'date' );
826 + $possible = array_keys( Visualizer_Plugin::getSupportedDateFilter() );
827 + if ( $date && in_array( $date, $possible, true ) ) {
828 + $query_args['date_query'] = array(
829 + 'after' => "$date -1 day",
830 + 'inclusive' => true,
831 + );
832 + }
833 +
834 + // add source filter to the query arguments
835 + $source = filter_input( INPUT_GET, 'source' );
836 + if ( $source ) {
837 + $source = ucwords( $source );
838 + $source = "Visualizer_Source_{$source}";
839 + $query[] = array(
840 + 'key' => Visualizer_Plugin::CF_SOURCE,
841 + 'value' => $source,
842 + 'compare' => '=',
843 + );
844 + }
845 +
846 + $query_args['meta_query'] = $query;
847 +
848 + $orderby = filter_input( INPUT_GET, 'orderby' );
849 + $order = filter_input( INPUT_GET, 'order' );
850 + if ( $orderby ) {
851 + $query_args['order_by'] = $orderby;
852 + }
853 + $query_args['order'] = empty( $order ) ? 'desc' : $order;
854 + }
855 +
856 + /**
538 857 * Get the instance of WP_Query that fetches the charts as per the given criteria.
539 858 */
540 859 private function getQuery() {
541 860 static $q;
@@ -554,29 +873,34 @@
554 873 'default' => 1,
555 874 ),
556 875 )
557 876 );
877 +
878 + $per_page = 6;
879 + $screen = get_current_screen();
880 + if ( $screen ) {
881 + // retrieve the per_page option
882 + $screen_option = $screen->get_option( 'per_page', 'option' );
883 + // retrieve the value stored for the current user
884 + $user = get_current_user_id();
885 + $per_page = get_user_meta( $user, $screen_option, true );
886 + if ( empty( $per_page ) || $per_page < 1 ) {
887 + // nothing set, get the default value
888 + $per_page = $screen->get_option( 'per_page', 'default' );
889 + }
890 + }
891 +
558 892 // the initial query arguments to fetch charts
559 893 $query_args = array(
560 894 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
561 - 'posts_per_page' => 6,
895 + 'posts_per_page' => $per_page,
562 896 'paged' => $page,
563 897 );
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 - }
898 +
899 + $this->getDisplayFilters( $query_args );
900 +
577 901 // Added by Ash/Upwork
578 - $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
902 + $filterByMeta = ! empty( $_GET['s'] ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
579 903 if ( $filterByMeta ) {
580 904 $query = array(
581 905 'key' => Visualizer_Plugin::CF_SETTINGS,
582 906 'value' => $filterByMeta,
@@ -585,13 +909,26 @@
585 909 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
586 910 $meta[] = $query;
587 911 $query_args['meta_query'] = $meta;
588 912 }
589 - $q = new WP_Query( $query_args );
913 + $q = new WP_Query( apply_filters( 'visualizer_query_args', $query_args ) );
590 914 return $q;
591 915 }
592 916
593 917 /**
918 + * Renders support page.
919 + *
920 + * @since 3.3.0
921 + *
922 + * @access public
923 + */
924 + public function renderSupportPage() {
925 + wp_enqueue_style( 'visualizer-upsell', VISUALIZER_ABSURL . 'css/upsell.css', array(), Visualizer_Plugin::VERSION );
926 + $this->load_survey();
927 + include_once VISUALIZER_ABSPATH . '/templates/support.php';
928 + }
929 +
930 + /**
594 931 * Renders visualizer library page.
595 932 *
596 933 * @since 1.0.0
597 934 *
@@ -614,9 +951,9 @@
614 951 )
615 952 );
616 953 // add chart type filter to the query arguments
617 954 $filter = filter_input( INPUT_GET, 'type' );
618 - if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) ) {
955 + if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes(), true ) ) ) {
619 956 $filter = 'all';
620 957 }
621 958
622 959 $css = '';
@@ -637,12 +974,27 @@
637 974 if ( ! empty( $atts['settings'] ) ) {
638 975 $settings = apply_filters( $atts['settings'], $settings, $chart->ID, $type );
639 976 }
640 977
641 - unset( $settings['height'], $settings['width'] );
978 + if ( $settings ) {
979 + unset( $settings['height'], $settings['width'], $settings['chartArea'] );
980 + }
981 +
642 982 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
643 - $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
983 + $data = self::get_chart_data( $chart, $type );
644 984
985 + // Set default setting series when add manual chart data - Only during first creation.
986 + if ( isset( $settings['series'] ) && ! empty( $series ) ) {
987 + $count_series = count( $series ) - count( $settings['series'] );
988 + if ( $count_series > 1 ) {
989 + $clone_last_series = end( $settings['series'] );
990 + $clone_last_series = array_fill_keys( array_keys( $clone_last_series ), '' );
991 + foreach ( range( 1, $count_series ) as $item ) {
992 + $settings['series'][] = $clone_last_series;
993 + }
994 + }
995 + }
996 +
645 997 $library = $this->load_chart_type( $chart->ID );
646 998
647 999 $id = 'visualizer-' . $chart->ID;
648 1000 $arguments = $this->get_inline_custom_css( $id, $settings );
@@ -650,8 +1002,15 @@
650 1002 $css .= $arguments[0];
651 1003 $settings = $arguments[1];
652 1004 }
653 1005
1006 + if ( isset( $settings['controls']['ui']['labelStacking'] ) ) {
1007 + unset( $settings['controls']['ui']['labelStacking'] );
1008 + }
1009 + if ( isset( $settings['controls']['ui']['orientation'] ) ) {
1010 + unset( $settings['controls']['ui']['orientation'] );
1011 + }
1012 +
654 1013 // add chart to the array
655 1014 $charts[ $id ] = array(
656 1015 'id' => $chart->ID,
657 1016 'type' => $type,
@@ -662,8 +1021,9 @@
662 1021 );
663 1022 }
664 1023 // enqueue charts array
665 1024 $ajaxurl = admin_url( 'admin-ajax.php' );
1025 +
666 1026 wp_localize_script(
667 1027 'visualizer-library',
668 1028 'visualizer',
669 1029 array(
@@ -670,26 +1030,39 @@
670 1030 'language' => $this->get_language(),
671 1031 'map_api_key' => get_option( 'visualizer-map-api-key' ),
672 1032 'charts' => $charts,
673 1033 'urls' => array(
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
1034 + 'base' => esc_url( add_query_arg( array( 'vpage' => false, 'vaction' => false ) ) ),
1035 + 'create' => esc_url(
1036 + add_query_arg(
1037 + array(
1038 + 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
1039 + 'library' => 'yes',
1040 + 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
1041 + 'chart-library' => isset( $_GET['chart-library'] ) ? $_GET['chart-library'] : '',
1042 + 'vaction' => false,
1043 + ),
1044 + $ajaxurl
1045 + )
682 1046 ),
683 - 'edit' => add_query_arg(
684 - array(
685 - 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
686 - 'library' => 'yes',
687 - ),
688 - $ajaxurl
1047 + 'edit' => esc_url(
1048 + add_query_arg(
1049 + array(
1050 + 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
1051 + 'library' => 'yes',
1052 + 'vaction' => false,
1053 + ),
1054 + $ajaxurl
1055 + )
689 1056 ),
690 1057 ),
691 1058 'page_type' => 'library',
1059 + 'is_front' => false,
1060 + 'i10n' => array(
1061 + 'copied' => __( 'The shortcode has been copied to your clipboard. Hit Ctrl-V/Cmd-V to paste it.', 'visualizer' ),
1062 + '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' ),
1063 + ),
1064 + 'is_pro_user' => Visualizer_Module::is_pro(),
692 1065 )
693 1066 );
694 1067 // render library page
695 1068 $render = new Visualizer_Render_Library();
@@ -698,9 +1071,9 @@
698 1071 $render->types = self::_getChartTypesLocalized( false, false, false, true );
699 1072 $render->custom_css = $css;
700 1073 $render->pagination = paginate_links(
701 1074 array(
702 - 'base' => add_query_arg( 'vpage', '%#%' ),
1075 + 'base' => add_query_arg( array( 'vpage' => '%#%', 'vaction' => false ) ),
703 1076 'format' => '',
704 1077 'current' => $page,
705 1078 'total' => $query->max_num_pages,
706 1079 'type' => 'array',
@@ -705,8 +1078,11 @@
705 1078 'total' => $query->max_num_pages,
706 1079 'type' => 'array',
707 1080 )
708 1081 );
1082 +
1083 + $this->load_survey();
1084 +
709 1085 $render->render();
710 1086 }
711 1087
712 1088 /**
@@ -721,14 +1097,14 @@
721 1097 *
722 1098 * @return array Updated array of action links.
723 1099 */
724 1100 public function getPluginActionLinks( $links, $file ) {
725 - if ( $file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1101 + if ( $file === plugin_basename( VISUALIZER_BASEFILE ) ) {
726 1102 array_unshift(
727 1103 $links,
728 1104 sprintf(
729 1105 '<a href="%s">%s</a>',
730 - admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ),
1106 + admin_url( 'admin.php?page=' . Visualizer_Plugin::NAME ),
731 1107 esc_html__( 'Library', 'visualizer' )
732 1108 )
733 1109 );
734 1110 }
@@ -748,17 +1124,17 @@
748 1124 *
749 1125 * @return array Updated array of plugin meta links.
750 1126 */
751 1127 public function getPluginMetaLinks( $plugin_meta, $plugin_file ) {
752 - if ( $plugin_file == plugin_basename( VISUALIZER_BASEFILE ) ) {
1128 + if ( $plugin_file === plugin_basename( VISUALIZER_BASEFILE ) ) {
753 1129 // knowledge base link
754 1130 $plugin_meta[] = sprintf(
755 - '<a href="https://github.com/codeinwp/visualizer/wiki" target="_blank">%s</a>',
756 - esc_html__( 'Knowledge Base', 'visualizer' )
1131 + '<a href="' . VISUALIZER_MAIN_DOC . '" target="_blank">%s</a>',
1132 + esc_html__( 'Docs', 'visualizer' )
757 1133 );
758 1134 // flattr link
759 1135 $plugin_meta[] = sprintf(
760 - '<a style="color:red" href="https://themeisle.com/plugins/visualizer-charts-and-graphs-pro-addon/" target="_blank">%s</a>',
1136 + '<a style="color:red" href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'pluginrow' ) . '" target="_blank">%s</a>',
761 1137 esc_html__( 'Pro Addon', 'visualizer' )
762 1138 );
763 1139 }
764 1140
@@ -764,5 +1140,146 @@
764 1140
765 1141 return $plugin_meta;
766 1142 }
767 1143
1144 + /**
1145 + * If check is existing user.
1146 + *
1147 + * @return bool Default false
1148 + */
1149 + public static function proFeaturesLocked() {
1150 + if ( Visualizer_Module::is_pro() ) {
1151 + return true;
1152 + }
1153 + return 'yes' === get_option( 'visualizer-new-user', 'yes' ) ? false : true;
1154 + }
1155 +
1156 + /**
1157 + * Multilingual Support.
1158 + *
1159 + * @param int $chart_id Chart ID.
1160 + * @return bool Default false
1161 + */
1162 + public function addMultilingualSupport( $chart_id ) {
1163 + global $sitepress;
1164 + if ( Visualizer_Module::is_pro() ) {
1165 + return;
1166 + }
1167 + if ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) {
1168 + $language = icl_get_languages();
1169 + $current_lang = icl_get_current_language();
1170 + $default_lang = icl_get_default_language();
1171 + $post_info = wpml_get_language_information( null, $chart_id );
1172 + $translations = array();
1173 + if ( ! empty( $post_info ) && ( $default_lang === $post_info['language_code'] ) ) {
1174 + $trid = $sitepress->get_element_trid( $chart_id, 'post_' . Visualizer_Plugin::CPT_VISUALIZER );
1175 + $translations = $sitepress->get_element_translations( $trid );
1176 + }
1177 + if ( empty( $translations ) ) {
1178 + return;
1179 + }
1180 + ?>
1181 + <hr><div class="visualizer-languages-list only-pro">
1182 + <?php
1183 + foreach ( $language as $lang ) {
1184 + $lang_code = $lang['code'];
1185 + if ( $current_lang !== $lang_code ) {
1186 + ?>
1187 + <a href="javascript:;">
1188 + <img src="<?php echo esc_url( $lang['country_flag_url'] ); ?>" alt="<?php echo esc_attr( $lang['translated_name'] ); ?>">
1189 + </a>
1190 + <?php
1191 + }
1192 + }
1193 + ?>
1194 + <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>
1195 + </div>
1196 + <?php
1197 + }
1198 + }
1199 +
1200 + /**
1201 + * Check chart is enabled or not.
1202 + *
1203 + * @param string $type Chart ID.
1204 + *
1205 + * @return bool Default false
1206 + */
1207 + public static function checkChartStatus( $type ) {
1208 + $types = self::_getChartTypesLocalized( false, false, false, true );
1209 + if ( isset( $types[ $type ] ) ) {
1210 + return ! empty( $types[ $type ]['enabled'] );
1211 + }
1212 + return false;
1213 + }
1214 +
1215 + /**
1216 + * Get the survey metadata.
1217 + *
1218 + * @return array The survey metadata.
1219 + */
1220 + private function get_survey_metadata() {
1221 + $install_date = get_option( 'visualizer_install', false );
1222 + $install_category = 0;
1223 +
1224 + if ( false !== $install_date ) {
1225 + $days_since_install = round( ( time() - $install_date ) / DAY_IN_SECONDS );
1226 +
1227 + if ( 0 === $days_since_install || 1 === $days_since_install ) {
1228 + $install_category = 0;
1229 + } elseif ( 1 < $days_since_install && 8 > $days_since_install ) {
1230 + $install_category = 7;
1231 + } elseif ( 8 <= $days_since_install && 31 > $days_since_install ) {
1232 + $install_category = 30;
1233 + } elseif ( 30 < $days_since_install && 90 > $days_since_install ) {
1234 + $install_category = 90;
1235 + } elseif ( 90 <= $days_since_install ) {
1236 + $install_category = 91;
1237 + }
1238 + }
1239 +
1240 + $plugin_data = get_plugin_data( VISUALIZER_BASEFILE, false, false );
1241 + $plugin_version = '';
1242 + if ( ! empty( $plugin_data['Version'] ) ) {
1243 + $plugin_version = $plugin_data['Version'];
1244 + }
1245 +
1246 + $user_id = 'visualizer_' . preg_replace( '/[^\w\d]*/', '', get_site_url() ); // Use a normalized version of the site URL as a user ID.
1247 +
1248 + $license_data = get_option( 'visualizer_pro_license_data', false );
1249 + if ( false !== $license_data && isset( $license_data->key ) ) {
1250 + $user_id = 'visualizer_' . $license_data->key;
1251 + }
1252 +
1253 + return array(
1254 + 'userId' => $user_id,
1255 + 'attributes' => array(
1256 + 'days_since_install' => strval( $install_category ),
1257 + 'free_version' => $plugin_version,
1258 + 'pro_version' => defined( 'VISUALIZER_PRO_VERSION' ) ? VISUALIZER_PRO_VERSION : '',
1259 + 'license_status' => apply_filters( 'product_visualizer_license_status', 'invalid' ),
1260 + ),
1261 + );
1262 + }
1263 +
1264 + /**
1265 + * Load the survey.
1266 + */
1267 + private function load_survey() {
1268 +
1269 + if ( defined( 'TI_CYPRESS_TESTING' ) ) {
1270 + return;
1271 + }
1272 +
1273 + $survey_handler = apply_filters( 'themeisle_sdk_dependency_script_handler', 'survey' );
1274 +
1275 + if ( empty( $survey_handler ) ) {
1276 + return;
1277 + }
1278 +
1279 + $metadata = $this->get_survey_metadata();
1280 +
1281 + do_action( 'themeisle_sdk_dependency_enqueue_script', 'survey' );
1282 + wp_enqueue_script( 'visualizer_chart_survey', VISUALIZER_ABSURL . 'js/survey.js', array( $survey_handler ), $metadata['attributes']['free_version'], true );
1283 + wp_localize_script( 'visualizer_chart_survey', 'visualizerSurveyData', $metadata );
1284 + }
768 1285 }