PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.11
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.11
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/Chart.php +66 -11 3.0.53.0.11 View file →
@@ -56,11 +56,9 @@
56 56 $this->_addAjaxAction( Visualizer_Plugin::ACTION_CREATE_CHART, 'renderChartPages' );
57 57 $this->_addAjaxAction( Visualizer_Plugin::ACTION_EDIT_CHART, 'renderChartPages' );
58 58 $this->_addAjaxAction( Visualizer_Plugin::ACTION_UPLOAD_DATA, 'uploadData' );
59 59 $this->_addAjaxAction( Visualizer_Plugin::ACTION_CLONE_CHART, 'cloneChart' );
60 - // Added by Ash/Upwork
61 60 $this->_addAjaxAction( Visualizer_Plugin::ACTION_EXPORT_DATA, 'exportData' );
62 - // Added by Ash/Upwork
63 61 }
64 62
65 63 /**
66 64 * Fetches charts from database.
@@ -82,8 +80,13 @@
82 80 )
83 81 ),
84 82 );
85 83 $filter = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
84 + if ( empty( $filter ) ) {
85 + // 'filter' is from the modal from the add media button.
86 + $filter = filter_input( INPUT_GET, 'filter', FILTER_SANITIZE_STRING );
87 + }
88 +
86 89 if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
87 90 $query_args['meta_query'] = array(
88 91 array(
89 92 'key' => Visualizer_Plugin::CF_CHART_TYPE,
@@ -205,9 +208,9 @@
205 208 defined( 'IFRAME_REQUEST' ) || define( 'IFRAME_REQUEST', 1 );
206 209 // check chart, if chart not exists, will create new one and redirects to the same page with proper chart id
207 210 $chart_id = isset( $_GET['chart'] ) ? filter_var( $_GET['chart'], FILTER_VALIDATE_INT ) : '';
208 211 if ( ! $chart_id || ! ( $chart = get_post( $chart_id ) ) || $chart->post_type != Visualizer_Plugin::CPT_VISUALIZER ) {
209 - $default_type = 'line';
212 + $default_type = isset( $_GET['type'] ) && ! empty( $_GET['type'] ) ? $_GET['type'] : 'line';
210 213 $source = new Visualizer_Source_Csv( VISUALIZER_ABSPATH . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR . $default_type . '.csv' );
211 214 $source->fetch();
212 215 $chart_id = wp_insert_post(
213 216 array(
@@ -261,11 +264,27 @@
261 264 }
262 265 // dispatch pages
263 266 $this->_chart = get_post( $chart_id );
264 267 $tab = isset( $_GET['tab'] ) && ! empty( $_GET['tab'] ) ? $_GET['tab'] : 'visualizer';
268 +
269 + // skip chart type pages only for existing charts.
270 + if ( VISUALIZER_SKIP_CHART_TYPE_PAGE && 'auto-draft' !== $this->_chart->post_status && ( ! empty( $_GET['tab'] ) && 'visualizer' === $_GET['tab'] ) ) {
271 + $tab = 'settings';
272 + }
273 +
274 + if ( isset( $_POST['cancel'] ) && 1 === intval( $_POST['cancel'] ) ) {
275 + // if the cancel button is clicked.
276 + $this->undoRevisions( $chart_id, true );
277 + } elseif ( isset( $_POST['save'] ) && 1 === intval( $_POST['save'] ) ) {
278 + // if the save button is clicked.
279 + $this->undoRevisions( $chart_id, false );
280 + } else {
281 + // if the edit button is clicked.
282 + $this->_chart = $this->handleExistingRevisions( $chart_id, $this->_chart );
283 + }
284 +
265 285 switch ( $tab ) {
266 286 case 'settings':
267 - // changed by Ash/Upwork
268 287 $this->_handleDataAndSettingsPage();
269 288 break;
270 289 case 'type': // fall through.
271 290 case 'visualizer': // fall through.
@@ -287,11 +306,18 @@
287 306 }
288 307 if ( $_SERVER['REQUEST_METHOD'] == 'POST' && isset( $_GET['nonce'] ) && wp_verify_nonce( $_GET['nonce'] ) ) {
289 308 if ( $this->_chart->post_status == 'auto-draft' ) {
290 309 $this->_chart->post_status = 'publish';
310 +
311 + // ensure that a revision is not created. If a revision is created it will have the proper data and the parent of the revision will have default data.
312 + // we do not want any difference in data so disable revisions temporarily.
313 + add_filter( 'wp_revisions_to_keep', '__return_false' );
291 314 wp_update_post( $this->_chart->to_array() );
292 315 }
293 - update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SETTINGS, $_POST );
316 + // save meta data only when it is NOT being canceled.
317 + if ( ! ( isset( $_POST['cancel'] ) && 1 === intval( $_POST['cancel'] ) ) ) {
318 + update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SETTINGS, $_POST );
319 + }
294 320 $render = new Visualizer_Render_Page_Send();
295 321 $render->text = sprintf( '[visualizer id="%d"]', $this->_chart->ID );
296 322 wp_iframe( array( $render, 'render' ) );
297 323
@@ -325,8 +351,9 @@
325 351 ),
326 352 'charts' => array(
327 353 'canvas' => $data,
328 354 ),
355 + 'language' => $this->get_language(),
329 356 'map_api_key' => get_option( 'visualizer-map-api-key' ),
330 357 'ajax' => array(
331 358 'url' => admin_url( 'admin-ajax.php' ),
332 359 'nonces' => array(
@@ -345,8 +372,11 @@
345 372 if ( filter_input( INPUT_GET, 'library', FILTER_VALIDATE_BOOLEAN ) ) {
346 373 $render->button = filter_input( INPUT_GET, 'action' ) == Visualizer_Plugin::ACTION_EDIT_CHART
347 374 ? esc_html__( 'Save Chart', 'visualizer' )
348 375 : esc_html__( 'Create Chart', 'visualizer' );
376 + if ( filter_input( INPUT_GET, 'action' ) == Visualizer_Plugin::ACTION_EDIT_CHART ) {
377 + $render->cancel_button = esc_html__( 'Cancel', 'visualizer' );
378 + }
349 379 } else {
350 380 $render->button = esc_attr__( 'Insert Chart', 'visualizer' );
351 381 }
352 382 if ( VISUALIZER_PRO ) {
@@ -414,20 +444,32 @@
414 444 *
415 445 * @access public
416 446 */
417 447 public function uploadData() {
448 + // if this is being called internally from pro and VISUALIZER_DO_NOT_DIE is set.
449 + // otherwise, assume this is a normal web request.
450 + $can_die = ! ( defined( 'VISUALIZER_DO_NOT_DIE' ) && VISUALIZER_DO_NOT_DIE );
451 +
418 452 // validate nonce
419 - // do not use filter_input as it does not work for phpunit test cases, use filter_var instead
420 453 if ( ! isset( $_GET['nonce'] ) || ! wp_verify_nonce( $_GET['nonce'] ) ) {
454 + if ( ! $can_die ) {
455 + return;
456 + }
421 457 status_header( 403 );
422 458 exit;
423 459 }
460 +
424 461 // check chart, if chart exists
462 + // do not use filter_input as it does not work for phpunit test cases, use filter_var instead
425 463 $chart_id = isset( $_GET['chart'] ) ? filter_var( $_GET['chart'], FILTER_VALIDATE_INT ) : '';
426 464 if ( ! $chart_id || ! ( $chart = get_post( $chart_id ) ) || $chart->post_type != Visualizer_Plugin::CPT_VISUALIZER ) {
465 + if ( ! $can_die ) {
466 + return;
467 + }
427 468 status_header( 400 );
428 469 exit;
429 470 }
471 +
430 472 if ( ! isset( $_POST['vz-import-time'] ) ) {
431 473 apply_filters( 'visualizer_pro_remove_schedule', $chart_id );
432 474 }
433 475
@@ -444,18 +486,29 @@
444 486 apply_filters( 'visualizer_pro_chart_schedule', $chart_id, $_POST['remote_data'], $_POST['vz-import-time'] );
445 487 }
446 488 } elseif ( isset( $_FILES['local_data'] ) && $_FILES['local_data']['error'] == 0 ) {
447 489 $source = new Visualizer_Source_Csv( $_FILES['local_data']['tmp_name'] );
448 - // Added by Ash/Upwork
449 490 } elseif ( isset( $_POST['chart_data'] ) && strlen( $_POST['chart_data'] ) > 0 ) {
450 491 $source = apply_filters( 'visualizer_pro_handle_chart_data', $_POST['chart_data'], '' );
451 - // Added by Ash/Upwork
452 492 } else {
453 493 $render->message = esc_html__( 'CSV file with chart data was not uploaded. Please, try again.', 'visualizer' );
454 494 }
455 495 if ( $source ) {
456 496 if ( $source->fetch() ) {
457 - $chart->post_content = $source->getData();
497 + $content = $source->getData();
498 + $populate = true;
499 + if ( is_string( $content ) && is_array( unserialize( $content ) ) ) {
500 + $json = unserialize( $content );
501 + // if source exists, so should data. if source exists but data is blank, do not populate the chart.
502 + // if we populate the data even if it is empty, the chart will show "Table has no columns".
503 + if ( array_key_exists( 'source', $json ) && ! empty( $json['source'] ) && ( ! array_key_exists( 'data', $json ) || empty( $json['data'] ) ) ) {
504 + do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Not populating chart data as source exists (%s) but data is empty!', $json['source'] ), 'warn', __FILE__, __LINE__ );
505 + $populate = false;
506 + }
507 + }
508 + if ( $populate ) {
509 + $chart->post_content = $content;
510 + }
458 511 wp_update_post( $chart->to_array() );
459 512 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
460 513 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
461 514 update_post_meta( $chart->ID, Visualizer_Plugin::CF_DEFAULT_DATA, 0 );
@@ -465,11 +518,12 @@
465 518 $render->message = esc_html__( 'CSV file is broken or invalid. Please, try again.', 'visualizer' );
466 519 }
467 520 }
468 521 $render->render();
469 - if ( ! ( defined( 'VISUALIZER_DO_NOT_DIE' ) && VISUALIZER_DO_NOT_DIE ) ) {
470 - defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
522 + if ( ! $can_die ) {
523 + return;
471 524 }
525 + defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
472 526 }
473 527
474 528 /**
475 529 * Clones the chart.
@@ -587,5 +641,6 @@
587 641 // Added by Ash/Upwork
588 642 $this->_addAction( 'admin_head', 'renderFlattrScript' );
589 643 wp_iframe( array( $render, 'render' ) );
590 644 }
645 +
591 646 }