PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.3.4
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.3.4
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/Chart.php +94 -458 3.10.133.3.4 View file →
@@ -68,39 +68,11 @@
68 68 $this->_addAjaxAction( Visualizer_Plugin::ACTION_JSON_SET_SCHEDULE, 'setJsonSchedule' );
69 69
70 70 $this->_addAjaxAction( Visualizer_Plugin::ACTION_SAVE_FILTER_QUERY, 'saveFilter' );
71 71
72 - $this->_addFilter( 'visualizer_get_sidebar', 'getSidebar', 10, 2 );
73 -
74 72 }
75 73
76 74 /**
77 - * Generates the HTML of the sidebar for the chart.
78 - *
79 - * @since ?
80 - *
81 - * @access public
82 - */
83 - public function getSidebar( $sidebar, $chart_id ) {
84 - $chart = get_post( $chart_id );
85 - $data = $this->_getChartArray( $chart );
86 - $sidebar = '';
87 - $sidebar_class = $this->load_chart_class_name( $chart_id );
88 - if ( class_exists( $sidebar_class, true ) ) {
89 - $sidebar = new $sidebar_class( $data['settings'] );
90 - $sidebar->__series = $data['series'];
91 - $sidebar->__data = $data['data'];
92 - } else {
93 - $sidebar = apply_filters( 'visualizer_pro_chart_type_sidebar', '', $data );
94 - if ( $sidebar !== '' ) {
95 - $sidebar->__series = $data['series'];
96 - $sidebar->__data = $data['data'];
97 - }
98 - }
99 - return str_replace( "'", '"', $sidebar->__toString() );
100 - }
101 -
102 - /**
103 75 * Sets the schedule for how JSON-endpoint charts should be updated.
104 76 *
105 77 * @since ?
106 78 *
@@ -134,30 +106,12 @@
134 106 ),
135 107 )
136 108 );
137 109
138 - if ( Visualizer_Module::is_pro() ) {
139 - $is_woocommerce_report = filter_input(
140 - INPUT_POST,
141 - 'is_woocommerce_report',
142 - FILTER_VALIDATE_BOOLEAN
143 - );
144 -
145 - if ( $is_woocommerce_report ) {
146 - update_post_meta( $chart_id, Visualizer_Plugin::CF_IS_WOOCOMMERCE_SOURCE, true );
147 - } else {
148 - delete_post_meta( $chart_id, Visualizer_Plugin::CF_IS_WOOCOMMERCE_SOURCE );
149 - }
150 - }
151 -
152 110 delete_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE );
153 111
154 112 if ( -1 < $time ) {
155 113 add_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, $time );
156 - // Update schedules.
157 - $schedules = get_option( Visualizer_Plugin::CF_JSON_SCHEDULE, array() );
158 - $schedules[ $chart_id ] = time() + $time * HOUR_IN_SECONDS;
159 - update_option( Visualizer_Plugin::CF_JSON_SCHEDULE, $schedules );
160 114 }
161 115 wp_send_json_success();
162 116 }
163 117
@@ -201,11 +155,10 @@
201 155 wp_die();
202 156 }
203 157
204 158 $source = new Visualizer_Source_Json( $params );
205 - $source->fetch();
206 - $data = $source->getRawData();
207 159
160 + $data = $source->parse();
208 161 if ( empty( $data ) ) {
209 162 wp_send_json_error( array( 'msg' => esc_html__( 'Unable to fetch data from the endpoint. Please try again.', 'visualizer' ) ) );
210 163 }
211 164
@@ -232,12 +185,11 @@
232 185
233 186 $chart = get_post( $chart_id );
234 187
235 188 $source = new Visualizer_Source_Json( $params );
236 - update_post_meta( $chart->ID, Visualizer_Plugin::CF_EDITABLE_TABLE, true );
237 - $source->fetchFromEditableTable();
189 + $source->fetch();
238 190
239 - $content = $source->getData( get_post_meta( $chart->ID, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) );
191 + $content = $source->getData();
240 192 $chart->post_content = $content;
241 193 wp_update_post( $chart->to_array() );
242 194 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
243 195 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
@@ -243,58 +195,16 @@
243 195 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
244 196 update_post_meta( $chart->ID, Visualizer_Plugin::CF_DEFAULT_DATA, 0 );
245 197 update_post_meta( $chart->ID, Visualizer_Plugin::CF_JSON_URL, $params['url'] );
246 198 update_post_meta( $chart->ID, Visualizer_Plugin::CF_JSON_ROOT, $params['root'] );
247 -
248 - delete_post_meta( $chart->ID, Visualizer_Plugin::CF_JSON_HEADERS );
249 - $headers = array( 'method' => $params['method'] );
250 - if ( ! empty( $params['auth'] ) ) {
251 - $headers['auth'] = $params['auth'];
252 - } elseif ( ! empty( $params['username'] ) && ! empty( $params['password'] ) ) {
253 - $headers['auth'] = array( 'username' => $params['username'], 'password' => $params['password'] );
254 - }
255 -
256 - add_post_meta( $chart->ID, Visualizer_Plugin::CF_JSON_HEADERS, $headers );
257 -
258 199 delete_post_meta( $chart->ID, Visualizer_Plugin::CF_JSON_PAGING );
259 200 if ( ! empty( $params['paging'] ) ) {
260 201 add_post_meta( $chart->ID, Visualizer_Plugin::CF_JSON_PAGING, $params['paging'] );
261 202 }
262 203
263 - if ( Visualizer_Module::is_pro() ) {
264 - if ( ! empty( $params['vz_woo_source'] ) ) {
265 - update_post_meta( $chart->ID, Visualizer_Plugin::CF_JSON_WOOCOMMERCE_SOURCE, $params['vz_woo_source'] );
266 - } else {
267 - delete_post_meta( $chart->ID, Visualizer_Plugin::CF_JSON_WOOCOMMERCE_SOURCE );
268 - }
269 - }
270 -
271 - $time = filter_input(
272 - INPUT_POST,
273 - 'time',
274 - FILTER_VALIDATE_INT,
275 - array(
276 - 'options' => array(
277 - 'min_range' => -1,
278 - ),
279 - )
280 - );
281 -
282 - delete_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE );
283 -
284 - if ( -1 < $time ) {
285 - add_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, $time );
286 - }
287 -
288 - // delete other source specific parameters.
289 - delete_post_meta( $chart_id, Visualizer_Plugin::CF_DB_QUERY );
290 - delete_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE );
291 - delete_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_URL );
292 - delete_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_SCHEDULE );
293 -
294 204 $render = new Visualizer_Render_Page_Update();
295 205 $render->id = $chart->ID;
296 - $render->data = json_encode( $source->getRawData( get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) ) );
206 + $render->data = json_encode( $source->getRawData() );
297 207 $render->series = json_encode( $source->getSeries() );
298 208 $render->render();
299 209
300 210 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
@@ -384,9 +294,9 @@
384 294 $chart = $this->_chart;
385 295 }
386 296 $type = get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
387 297 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
388 - $data = self::get_chart_data( $chart, $type );
298 + $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( $chart->post_content ), $chart->ID, $type );
389 299 $library = $this->load_chart_type( $chart->ID );
390 300
391 301 $settings = get_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, true );
392 302 $settings = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SETTINGS, $settings, $chart->ID, $type );
@@ -460,22 +370,9 @@
460 370 $success = $chart && $chart->post_type === Visualizer_Plugin::CPT_VISUALIZER;
461 371 }
462 372 }
463 373 if ( $success ) {
464 - global $sitepress;
465 - if ( Visualizer_Module::is_pro() && ( function_exists( 'icl_get_languages' ) && $sitepress instanceof \SitePress ) ) {
466 - $trid = $sitepress->get_element_trid( $chart_id, 'post_' . Visualizer_Plugin::CPT_VISUALIZER );
467 - $translations = $sitepress->get_element_translations( $trid );
468 - if ( ! empty( $translations ) ) {
469 - foreach ( $translations as $translated_post ) {
470 - wp_delete_post( $translated_post->element_id, true );
471 - }
472 - } else {
473 - wp_delete_post( $chart_id, true );
474 - }
475 - } else {
476 - wp_delete_post( $chart_id, true );
477 - }
374 + wp_delete_post( $chart_id, true );
478 375 }
479 376 if ( $is_post ) {
480 377 self::_sendResponse(
481 378 array(
@@ -524,104 +421,43 @@
524 421 * @access public
525 422 */
526 423 public function renderChartPages() {
527 424 defined( 'IFRAME_REQUEST' ) || define( 'IFRAME_REQUEST', 1 );
528 - if ( ! defined( 'ET_BUILDER_PRODUCT_VERSION' ) && function_exists( 'et_get_theme_version' ) ) {
529 - define( 'ET_BUILDER_PRODUCT_VERSION', et_get_theme_version() );
530 - }
531 - // Set current screen for the render chart.
532 - set_current_screen( 'visualizer_render_chart' );
533 425 // check chart, if chart not exists, will create new one and redirects to the same page with proper chart id
534 426 $chart_id = isset( $_GET['chart'] ) ? filter_var( $_GET['chart'], FILTER_VALIDATE_INT ) : '';
535 - if ( ! empty( $_POST ) ) {
536 - $_POST = map_deep( $_POST, 'wp_strip_all_tags' );
537 - }
538 427 if ( ! $chart_id || ! ( $chart = get_post( $chart_id ) ) || $chart->post_type !== Visualizer_Plugin::CPT_VISUALIZER ) {
539 - if ( empty( $_GET['lang'] ) || empty( $_GET['parent_chart_id'] ) ) {
540 - $this->deleteOldCharts();
541 - $default_type = isset( $_GET['type'] ) && ! empty( $_GET['type'] ) ? $_GET['type'] : 'line';
542 - $chart_status = Visualizer_Module_Admin::checkChartStatus( $default_type );
543 - if ( ! $chart_status ) {
544 - $default_type = 'line';
545 - }
546 - $source = new Visualizer_Source_Csv( VISUALIZER_ABSPATH . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR . $default_type . '.csv' );
547 - $source->fetch();
548 - $chart_id = wp_insert_post(
428 + $this->deleteOldCharts();
429 + $default_type = isset( $_GET['type'] ) && ! empty( $_GET['type'] ) ? $_GET['type'] : 'line';
430 + $source = new Visualizer_Source_Csv( VISUALIZER_ABSPATH . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR . $default_type . '.csv' );
431 + $source->fetch();
432 + $chart_id = wp_insert_post(
433 + array(
434 + 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
435 + 'post_title' => 'Visualization',
436 + 'post_author' => get_current_user_id(),
437 + 'post_status' => 'auto-draft',
438 + 'post_content' => $source->getData(),
439 + )
440 + );
441 + if ( $chart_id && ! is_wp_error( $chart_id ) ) {
442 + add_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, $default_type );
443 + add_post_meta( $chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, 1 );
444 + add_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
445 + add_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
446 + add_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_LIBRARY, '' );
447 + add_post_meta(
448 + $chart_id,
449 + Visualizer_Plugin::CF_SETTINGS,
549 450 array(
550 - 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
551 - 'post_title' => 'Visualization',
552 - 'post_author' => get_current_user_id(),
553 - 'post_status' => 'auto-draft',
554 - 'post_content' => $source->getData( get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) ),
451 + 'focusTarget' => 'datum',
555 452 )
556 453 );
557 - if ( $chart_id && ! is_wp_error( $chart_id ) ) {
558 - add_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, $default_type );
559 - add_post_meta( $chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, 1 );
560 - add_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
561 - add_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
562 - add_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_LIBRARY, '' );
563 - add_post_meta(
564 - $chart_id,
565 - Visualizer_Plugin::CF_SETTINGS,
566 - array(
567 - 'focusTarget' => 'datum',
568 - )
569 - );
570 -
571 - do_action( 'visualizer_pro_new_chart_defaults', $chart_id );
572 - }
573 - } else {
574 - if ( current_user_can( 'edit_posts' ) ) {
575 - $parent_chart_id = isset( $_GET['parent_chart_id'] ) ? filter_var( $_GET['parent_chart_id'], FILTER_VALIDATE_INT ) : '';
576 - $success = false;
577 - if ( $parent_chart_id ) {
578 - $parent_chart = get_post( $parent_chart_id );
579 - $success = $parent_chart && $parent_chart->post_type === Visualizer_Plugin::CPT_VISUALIZER;
580 - }
581 - if ( $success ) {
582 - $new_chart_id = wp_insert_post(
583 - array(
584 - 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
585 - 'post_title' => 'Visualization',
586 - 'post_author' => get_current_user_id(),
587 - 'post_status' => $parent_chart->post_status,
588 - 'post_content' => $parent_chart->post_content,
589 - )
590 - );
591 -
592 - if ( is_wp_error( $new_chart_id ) ) {
593 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Error while cloning chart %d = %s', $parent_chart_id, print_r( $new_chart_id, true ) ), 'error', __FILE__, __LINE__ );
594 - } else {
595 - $post_meta = get_post_meta( $parent_chart_id );
596 - $chart_id = $new_chart_id;
597 - foreach ( $post_meta as $key => $value ) {
598 - if ( strpos( $key, 'visualizer-' ) !== false ) {
599 - add_post_meta( $new_chart_id, $key, maybe_unserialize( $value[0] ) );
600 - }
601 - }
602 - }
603 - }
604 - }
605 454 do_action( 'visualizer_pro_new_chart_defaults', $chart_id );
606 455 }
607 - wp_redirect( esc_url_raw( add_query_arg( 'chart', (int) $chart_id ) ) );
608 -
609 - if ( defined( 'WP_TESTS_DOMAIN' ) ) {
610 - wp_die();
611 - }
612 - exit();
456 + wp_redirect( add_query_arg( 'chart', (int) $chart_id ) );
457 + defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
613 458 }
614 459
615 - $_POST['save_chart_image'] = isset( $_POST['save_chart_image'] ) && 'yes' === $_POST['save_chart_image'] ? true : false;
616 - $_POST['lazy_load_chart'] = isset( $_POST['lazy_load_chart'] ) && 'yes' === $_POST['lazy_load_chart'] ? true : false;
617 -
618 - if ( isset( $_POST['chart-img'] ) && ! empty( $_POST['chart-img'] ) ) {
619 - $attachment_id = $this->save_chart_image( $_POST['chart-img'], $chart_id, $_POST['save_chart_image'] );
620 - if ( $attachment_id ) {
621 - update_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_IMAGE, $attachment_id );
622 - }
623 - }
624 460 $lib = $this->load_chart_type( $chart_id );
625 461
626 462 // the alpha color picker (RGBA) is not supported by google.
627 463 $color_picker_dep = 'wp-color-picker';
@@ -634,9 +470,9 @@
634 470 wp_register_script( 'visualizer-chosen', VISUALIZER_ABSURL . 'js/lib/chosen.jquery.min.js', array( 'jquery' ), Visualizer_Plugin::VERSION );
635 471 wp_register_style( 'visualizer-chosen', VISUALIZER_ABSURL . 'css/lib/chosen.min.css', array(), Visualizer_Plugin::VERSION );
636 472
637 473 wp_register_style( 'visualizer-frame', VISUALIZER_ABSURL . 'css/frame.css', array( 'visualizer-chosen' ), Visualizer_Plugin::VERSION );
638 - wp_register_script( 'visualizer-frame', VISUALIZER_ABSURL . 'js/frame.js', array( 'visualizer-chosen', 'jquery-ui-accordion', 'jquery-ui-tabs' ), Visualizer_Plugin::VERSION, true );
474 + wp_register_script( 'visualizer-frame', VISUALIZER_ABSURL . 'js/frame.js', array( 'visualizer-chosen', 'jquery-ui-accordion' ), Visualizer_Plugin::VERSION, true );
639 475 wp_register_script( 'visualizer-customization', $this->get_user_customization_js(), array(), null, true );
640 476 wp_register_script(
641 477 'visualizer-render',
642 478 VISUALIZER_ABSURL . 'js/render-facade.js',
@@ -675,9 +511,8 @@
675 511 if ( isset( $_POST['cancel'] ) && 1 === intval( $_POST['cancel'] ) ) {
676 512 // if the cancel button is clicked.
677 513 $this->undoRevisions( $chart_id, true );
678 514 } elseif ( isset( $_POST['save'] ) && 1 === intval( $_POST['save'] ) ) {
679 - $this->handlePermissions();
680 515 // if the save button is clicked.
681 516 $this->undoRevisions( $chart_id, false );
682 517 } else {
683 518 // if the edit button is clicked.
@@ -683,16 +518,8 @@
683 518 // if the edit button is clicked.
684 519 $this->_chart = $this->handleExistingRevisions( $chart_id, $this->_chart );
685 520 }
686 521
687 - // Clear existing chart cache.
688 - if ( isset( $_POST['save'] ) && 1 === intval( $_POST['save'] ) ) {
689 - $cache_key = Visualizer_Plugin::CF_CHART_CACHE . '_' . $chart_id;
690 - if ( get_transient( $cache_key ) ) {
691 - delete_transient( $cache_key );
692 - }
693 - }
694 -
695 522 switch ( $tab ) {
696 523 case 'settings':
697 524 $this->_handleDataAndSettingsPage();
698 525 break;
@@ -700,9 +527,9 @@
700 527 case 'visualizer': // fall through.
701 528 $this->_handleTypesPage();
702 529 break;
703 530 default:
704 - // this should never happen.
531 + do_action( 'visualizer_pro_handle_tab', $tab, $this->_chart );
705 532 break;
706 533 }
707 534 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
708 535 }
@@ -709,9 +536,9 @@
709 536
710 537 /**
711 538 * Load code editor assets.
712 539 */
713 - private function loadCodeEditorAssets( $chart_id ) {
540 + private function loadCodeEditorAssets() {
714 541 global $wp_version;
715 542
716 543 $wp_scripts = wp_scripts();
717 544
@@ -717,9 +544,9 @@
717 544
718 545 // data tables assets.
719 546 wp_register_script( 'visualizer-datatables', VISUALIZER_ABSURL . 'js/lib/datatables.min.js', array( 'jquery-ui-core' ), Visualizer_Plugin::VERSION );
720 547 wp_register_style( 'visualizer-datatables', VISUALIZER_ABSURL . 'css/lib/datatables.min.css', array(), Visualizer_Plugin::VERSION );
721 - wp_register_style( 'visualizer-jquery-ui', sprintf( '//code.jquery.com/ui/%s/themes/smoothness/jquery-ui.css', $wp_scripts->registered['jquery-ui-core']->ver ), array( 'visualizer-datatables' ), Visualizer_Plugin::VERSION );
548 + wp_register_style( 'visualizer-jquery-ui', sprintf( '//ajax.googleapis.com/ajax/libs/jqueryui/%s/themes/smoothness/jquery-ui.css', $wp_scripts->registered['jquery-ui-core']->ver ), array( 'visualizer-datatables' ), Visualizer_Plugin::VERSION );
722 549 wp_enqueue_script( 'visualizer-datatables' );
723 550 wp_enqueue_style( 'visualizer-jquery-ui' );
724 551
725 552 if ( ! Visualizer_Module::is_pro() ) {
@@ -725,9 +552,9 @@
725 552 if ( ! Visualizer_Module::is_pro() ) {
726 553 return;
727 554 }
728 555
729 - $table_col_mapping = Visualizer_Source_Query_Params::get_all_db_tables_column_mapping( $chart_id );
556 + $table_col_mapping = Visualizer_Source_Query_Params::get_all_db_tables_column_mapping();
730 557
731 558 if ( version_compare( $wp_version, '4.9.0', '<' ) ) {
732 559 // code mirror assets.
733 560 wp_register_script( 'visualizer-codemirror-core', '//codemirror.net/lib/codemirror.js', array( 'jquery' ), Visualizer_Plugin::VERSION );
@@ -762,25 +589,8 @@
762 589 return $table_col_mapping;
763 590 }
764 591
765 592 /**
766 - * Handle permissions from the new conslidated settings sidebar.
767 - */
768 - private function handlePermissions() {
769 - if ( ! Visualizer_Module::is_pro() ) {
770 - return;
771 - }
772 -
773 - // we will not support old free and new pro.
774 - // handling new free and old pro.
775 - if ( has_action( 'visualizer_pro_handle_tab' ) ) {
776 - do_action( 'visualizer_pro_handle_tab', 'permissions', $this->_chart );
777 - } else {
778 - do_action( 'visualizer_handle_permissions', $this->_chart );
779 - }
780 - }
781 -
782 - /**
783 593 * Handle data and settings page
784 594 */
785 595 private function _handleDataAndSettingsPage() {
786 596 if ( isset( $_POST['map_api_key'] ) ) {
@@ -785,9 +595,8 @@
785 595 private function _handleDataAndSettingsPage() {
786 596 if ( isset( $_POST['map_api_key'] ) ) {
787 597 update_option( 'visualizer-map-api-key', $_POST['map_api_key'] );
788 598 }
789 -
790 599 if ( $_SERVER['REQUEST_METHOD'] === 'POST' && isset( $_GET['nonce'] ) && wp_verify_nonce( $_GET['nonce'] ) ) {
791 600 if ( $this->_chart->post_status === 'auto-draft' ) {
792 601 $this->_chart->post_status = 'publish';
793 602
@@ -792,10 +601,9 @@
792 601 $this->_chart->post_status = 'publish';
793 602
794 603 // 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.
795 604 // we do not want any difference in data so disable revisions temporarily.
796 - $this->disableRevisionsTemporarily();
797 -
605 + add_filter( 'wp_revisions_to_keep', '__return_false' );
798 606 wp_update_post( $this->_chart->to_array() );
799 607 }
800 608 // save meta data only when it is NOT being canceled.
801 609 if ( ! ( isset( $_POST['cancel'] ) && 1 === intval( $_POST['cancel'] ) ) ) {
@@ -814,19 +622,14 @@
814 622 if ( empty( $title ) ) {
815 623 $title = $this->_chart->ID;
816 624 }
817 625 $settings['internal_title'] = $title;
818 - $settings_label = isset( $settings['pieResidueSliceLabel'] ) ? $settings['pieResidueSliceLabel'] : '';
819 - if ( empty( $settings_label ) ) {
820 - $settings['pieResidueSliceLabel'] = esc_html__( 'Other', 'visualizer' );
821 - } else {
822 - $settings['pieResidueSliceLabel'] = $settings_label;
823 - }
824 626 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SETTINGS, $settings );
825 627 }
826 628 $render = new Visualizer_Render_Page_Send();
827 629 $render->text = sprintf( '[visualizer id="%d"]', $this->_chart->ID );
828 630 wp_iframe( array( $render, 'render' ) );
631 +
829 632 return;
830 633 }
831 634 $data = $this->_getChartArray();
832 635 $sidebar = '';
@@ -848,9 +651,9 @@
848 651 wp_enqueue_script( 'visualizer-preview' );
849 652 wp_enqueue_script( 'visualizer-chosen' );
850 653 wp_enqueue_script( 'visualizer-render' );
851 654
852 - if ( Visualizer_Module::can_show_feature( 'simple-editor' ) ) {
655 + if ( ! Visualizer_Module::is_pro() ) {
853 656 wp_enqueue_script( 'visualizer-editor-simple' );
854 657 wp_localize_script(
855 658 'visualizer-editor-simple',
856 659 'visualizer1',
@@ -865,9 +668,9 @@
865 668 )
866 669 );
867 670 }
868 671
869 - $table_col_mapping = $this->loadCodeEditorAssets( $this->_chart->ID );
672 + $table_col_mapping = $this->loadCodeEditorAssets();
870 673
871 674 wp_localize_script(
872 675 'visualizer-render',
873 676 'visualizer',
@@ -872,13 +675,11 @@
872 675 'visualizer-render',
873 676 'visualizer',
874 677 array(
875 678 'l10n' => array(
876 - 'invalid_source' => esc_html__( 'You have entered an invalid URL. Please provide a valid URL.', 'visualizer' ),
679 + 'invalid_source' => esc_html__( 'You have entered invalid URL. Please, insert proper URL.', 'visualizer' ),
877 680 'loading' => esc_html__( 'Loading...', 'visualizer' ),
878 681 'json_error' => esc_html__( 'An error occured in fetching data.', 'visualizer' ),
879 - 'select_columns' => esc_html__( 'Please select a few columns to include in the chart.', 'visualizer' ),
880 - 'save_settings' => __( 'You have modified the chart\'s settings. To modify the source/data again, you must save this chart and reopen it for editing. If you continue without saving the chart, you may lose your changes.', 'visualizer' ),
881 682 ),
882 683 'charts' => array(
883 684 'canvas' => $data,
884 685 'id' => $this->_chart->ID,
@@ -909,9 +710,8 @@
909 710 'page_type' => 'chart',
910 711 'json_tag_separator' => Visualizer_Source_Json::TAG_SEPARATOR,
911 712 'json_tag_separator_view' => Visualizer_Source_Json::TAG_SEPARATOR_VIEW,
912 713 'is_front' => false,
913 - 'rest_base' => get_rest_url( null, 'wc/v3/reports/' ),
914 714 )
915 715 );
916 716
917 717 $render = new Visualizer_Render_Page_Data();
@@ -929,13 +729,13 @@
929 729 } else {
930 730 $render->button = esc_attr__( 'Insert Chart', 'visualizer' );
931 731 }
932 732
933 - do_action( 'visualizer_enqueue_scripts_and_styles', $data, $this->_chart->ID );
733 + do_action( 'visualizer_enqueue_scripts_and_styles', $data );
934 734
935 735 if ( Visualizer_Module::is_pro() && Visualizer_Module::is_pro_older_than( '1.9.0' ) ) {
936 736 global $Visualizer_Pro;
937 - $Visualizer_Pro->_enqueueScriptsAndStyles( $data, $this->_chart->ID );
737 + $Visualizer_Pro->_enqueueScriptsAndStyles( $data );
938 738 }
939 739
940 740 $this->_addAction( 'admin_head', 'renderFlattrScript' );
941 741 wp_iframe( array( $render, 'render' ) );
@@ -952,9 +752,9 @@
952 752 // process post request
953 753 if ( $_SERVER['REQUEST_METHOD'] === 'POST' && wp_verify_nonce( filter_input( INPUT_POST, 'nonce' ) ) ) {
954 754 $type = filter_input( INPUT_POST, 'type' );
955 755 $library = filter_input( INPUT_POST, 'chart-library' );
956 - if ( Visualizer_Module_Admin::checkChartStatus( $type ) ) {
756 + if ( in_array( $type, Visualizer_Plugin::getChartTypes(), true ) ) {
957 757 if ( empty( $library ) ) {
958 758 // library cannot be empty.
959 759 do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, 'Chart library empty while creating the chart! Aborting...', 'error', __FILE__, __LINE__ );
960 760 return;
@@ -966,9 +766,9 @@
966 766 // if the chart has default data, update it with appropriate default data for new type
967 767 if ( filter_var( get_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_DEFAULT_DATA, true ), FILTER_VALIDATE_BOOLEAN ) ) {
968 768 $source = new Visualizer_Source_Csv( VISUALIZER_ABSPATH . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR . $type . '.csv' );
969 769 $source->fetch();
970 - $this->_chart->post_content = $source->getData( get_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) );
770 + $this->_chart->post_content = $source->getData();
971 771 wp_update_post( $this->_chart->to_array() );
972 772 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
973 773 }
974 774
@@ -975,9 +775,9 @@
975 775 Visualizer_Module_Utility::set_defaults( $this->_chart );
976 776
977 777 // redirect to next tab
978 778 // changed by Ash/Upwork
979 - wp_redirect( esc_url_raw( add_query_arg( 'tab', 'settings' ) ) );
779 + wp_redirect( add_query_arg( 'tab', 'settings' ) );
980 780
981 781 return;
982 782 }
983 783 }
@@ -1006,51 +806,30 @@
1006 806 * Processes the CSV that is sent in the request as a string.
1007 807 *
1008 808 * @since 3.2.0
1009 809 */
1010 - private function handleCSVasString( $data, $editor_type ) {
810 + private function handleCSVasString( $data ) {
1011 811 $source = null;
1012 812
1013 - switch ( $editor_type ) {
1014 - case 'text':
1015 - // data coming in from the text editor.
1016 - $tmpfile = tempnam( get_temp_dir(), Visualizer_Plugin::NAME );
1017 - $handle = fopen( $tmpfile, 'w' );
1018 - $values = preg_split( '/[\n\r]+/', stripslashes( trim( $data ) ) );
1019 - if ( $values ) {
1020 - foreach ( $values as $row ) {
1021 - if ( empty( $row ) ) {
1022 - continue;
1023 - }
1024 - $row = explode( ',', $row );
1025 - $row = array_map(
1026 - function( $r ) {
1027 - return '' === $r ? ' ' : $r;
1028 - },
1029 - $row
1030 - );
1031 - $row = implode( ',', $row );
1032 - // don't use fpucsv here because we need to just dump the data
1033 - // minus the empty rows
1034 - // because fputcsv needs to tokenize
1035 - // we can standardize the CSV enclosure here and replace all ' with "
1036 - // we can assume that if there are an even number of ' they should be changed to "
1037 - // but that will screw up words like fo'c'sle
1038 - // so here let's just assume ' will NOT be used for enclosures
1039 - fwrite( $handle, $row );
1040 - fwrite( $handle, PHP_EOL );
813 + // @issue https://github.com/Codeinwp/visualizer/issues/412
814 + if ( has_filter( 'visualizer_pro_handle_chart_data' ) ) {
815 + $source = apply_filters( 'visualizer_pro_handle_chart_data', $data, '' );
816 + } else {
817 + // data coming in from the text editor.
818 + $tmpfile = tempnam( get_temp_dir(), Visualizer_Plugin::NAME );
819 + $handle = fopen( $tmpfile, 'w' );
820 + $values = preg_split( '/[\n\r]+/', stripslashes( trim( $data ) ) );
821 + if ( $values ) {
822 + foreach ( $values as $row ) {
823 + if ( empty( $row ) ) {
824 + continue;
1041 825 }
826 + $columns = explode( ',', $row );
827 + fputcsv( $handle, $columns );
1042 828 }
1043 - $source = new Visualizer_Source_Csv( $tmpfile );
1044 - fclose( $handle );
1045 - break;
1046 - case 'table':
1047 - // Import from Chart
1048 - // fall-through.
1049 - case 'excel':
1050 - // data coming in from the excel editor.
1051 - $source = apply_filters( 'visualizer_pro_handle_chart_data', $data, '' );
1052 - break;
829 + }
830 + $source = new Visualizer_Source_Csv( $tmpfile );
831 + fclose( $handle );
1053 832 }
1054 833 return $source;
1055 834 }
1056 835
@@ -1099,9 +878,9 @@
1099 878 $csv[] = $types;
1100 879 for ( $j = 0; $j < count( $columns[0] ); $j++ ) {
1101 880 $row = array();
1102 881 for ( $i = 0; $i < count( $headers ); $i++ ) {
1103 - $row[] = sanitize_text_field( $columns[ $i ][ $j ] );
882 + $row[] = $columns[ $i ][ $j ];
1104 883 }
1105 884 $csv[] = $row;
1106 885 }
1107 886
@@ -1154,10 +933,8 @@
1154 933 status_header( 400 );
1155 934 exit;
1156 935 }
1157 936
1158 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Uploading data for chart %d with POST = %s and GET = %s', $chart_id, print_r( $_POST, true ), print_r( $_GET, true ) ), 'debug', __FILE__, __LINE__ );
1159 -
1160 937 if ( ! isset( $_POST['vz-import-time'] ) ) {
1161 938 apply_filters( 'visualizer_pro_remove_schedule', $chart_id );
1162 939 }
1163 940
@@ -1169,9 +946,8 @@
1169 946
1170 947 // delete "import from db" specific parameters.
1171 948 delete_post_meta( $chart_id, Visualizer_Plugin::CF_DB_QUERY );
1172 949 delete_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE );
1173 - delete_post_meta( $chart_id, Visualizer_Plugin::CF_REMOTE_DB_PARAMS );
1174 950 }
1175 951
1176 952 // delete json related data.
1177 953 delete_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_URL );
@@ -1176,51 +952,29 @@
1176 952 // delete json related data.
1177 953 delete_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_URL );
1178 954 delete_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_ROOT );
1179 955 delete_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_PAGING );
1180 - delete_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_HEADERS );
1181 956
1182 - // delete last error
1183 - delete_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR );
1184 -
1185 - // delete editor related data.
1186 - delete_post_meta( $chart_id, Visualizer_Plugin::CF_EDITOR );
1187 -
1188 - // delete this so that a JSON import can be later edited manually without a problem.
1189 - delete_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE );
1190 -
1191 957 $source = null;
1192 958 $render = new Visualizer_Render_Page_Update();
1193 -
1194 - $remote_data = false;
1195 - if ( isset( $_POST['remote_data'] ) && function_exists( 'wp_http_validate_url' ) ) {
1196 - $remote_data = wp_http_validate_url( $_POST['remote_data'] );
1197 - }
1198 - if ( false !== $remote_data ) {
1199 - $source = new Visualizer_Source_Csv_Remote( $remote_data );
959 + if ( isset( $_POST['remote_data'] ) && filter_var( $_POST['remote_data'], FILTER_VALIDATE_URL ) ) {
960 + $source = new Visualizer_Source_Csv_Remote( $_POST['remote_data'] );
1200 961 if ( isset( $_POST['vz-import-time'] ) ) {
1201 - apply_filters( 'visualizer_pro_chart_schedule', $chart_id, $remote_data, $_POST['vz-import-time'] );
962 + apply_filters( 'visualizer_pro_chart_schedule', $chart_id, $_POST['remote_data'], $_POST['vz-import-time'] );
1202 963 }
1203 964 // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1204 965 } elseif ( isset( $_FILES['local_data'] ) && $_FILES['local_data']['error'] == 0 ) {
1205 966 $source = new Visualizer_Source_Csv( $_FILES['local_data']['tmp_name'] );
1206 967 } elseif ( isset( $_POST['chart_data'] ) && strlen( $_POST['chart_data'] ) > 0 ) {
1207 - $source = $this->handleCSVasString( $_POST['chart_data'], $_POST['editor-type'] );
1208 - update_post_meta( $chart_id, Visualizer_Plugin::CF_EDITOR, $_POST['editor-type'] );
968 + $source = $this->handleCSVasString( $_POST['chart_data'] );
1209 969 } elseif ( isset( $_POST['table_data'] ) && 'yes' === $_POST['table_data'] ) {
1210 970 $source = $this->handleTabularData();
1211 - update_post_meta( $chart_id, Visualizer_Plugin::CF_EDITOR, $_POST['editor-type'] );
1212 971 } else {
1213 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'CSV file with chart data was not uploaded for chart %d.', $chart_id ), 'error', __FILE__, __LINE__ );
1214 972 $render->message = esc_html__( 'CSV file with chart data was not uploaded. Please try again.', 'visualizer' );
1215 - update_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR, esc_html__( 'CSV file with chart data was not uploaded. Please try again.', 'visualizer' ) );
1216 973 }
1217 -
1218 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Uploaded data for chart %d with source %s', $chart_id, print_r( $source, true ) ), 'debug', __FILE__, __LINE__ );
1219 -
1220 974 if ( $source ) {
1221 975 if ( $source->fetch() ) {
1222 - $content = $source->getData( get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) );
976 + $content = $source->getData();
1223 977 $populate = true;
1224 978 if ( is_string( $content ) && is_array( unserialize( $content ) ) ) {
1225 979 $json = unserialize( $content );
1226 980 // if source exists, so should data. if source exists but data is blank, do not populate the chart.
@@ -1226,9 +980,8 @@
1226 980 // if source exists, so should data. if source exists but data is blank, do not populate the chart.
1227 981 // if we populate the data even if it is empty, the chart will show "Table has no columns".
1228 982 if ( array_key_exists( 'source', $json ) && ! empty( $json['source'] ) && ( ! array_key_exists( 'data', $json ) || empty( $json['data'] ) ) ) {
1229 983 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__ );
1230 - update_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR, sprintf( 'Not populating chart data as source exists (%s) but data is empty!', $json['source'] ) );
1231 984 $populate = false;
1232 985 }
1233 986 }
1234 987 if ( $populate ) {
@@ -1234,43 +987,26 @@
1234 987 if ( $populate ) {
1235 988 $chart->post_content = $content;
1236 989 }
1237 990 wp_update_post( $chart->to_array() );
1238 -
1239 991 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
1240 992 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
1241 993 update_post_meta( $chart->ID, Visualizer_Plugin::CF_DEFAULT_DATA, 0 );
1242 994
1243 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Updated post for chart %d', $chart_id ), 'debug', __FILE__, __LINE__ );
1244 -
1245 995 Visualizer_Module_Utility::set_defaults( $chart, null );
1246 996
1247 997 $settings = get_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, true );
1248 - if ( isset( $settings['series'] ) && ! ( count( $settings['series'] ) - count( $source->getSeries() ) > 1 ) ) {
1249 - $diff_total_series = abs( count( $settings['series'] ) - count( $source->getSeries() ) );
1250 - if ( $diff_total_series ) {
1251 - foreach ( range( 1, $diff_total_series ) as $k => $diff_series ) {
1252 - $settings['series'][] = end( $settings['series'] );
1253 - }
1254 - update_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, $settings );
1255 - }
1256 - }
1257 998
1258 999 $render->id = $chart->ID;
1259 - $render->data = json_encode( $source->getRawData( get_post_meta( $chart->ID, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) ) );
1000 + $render->data = json_encode( $source->getRawData() );
1260 1001 $render->series = json_encode( $source->getSeries() );
1261 1002 $render->settings = json_encode( $settings );
1262 1003 } else {
1263 - $error = $source->get_error();
1264 - if ( empty( $error ) ) {
1265 - $error = esc_html__( 'CSV file is broken or invalid. Please try again.', 'visualizer' );
1004 + $render->message = $source->get_error();
1005 + if ( empty( $render->message ) ) {
1006 + $render->message = esc_html__( 'CSV file is broken or invalid. Please try again.', 'visualizer' );
1266 1007 }
1267 - $render->message = $error;
1268 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( '%s for chart %d.', $error, $chart_id ), 'error', __FILE__, __LINE__ );
1269 - update_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR, $error );
1270 1008 }
1271 - } else {
1272 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Unknown internal error for chart %d.', $chart_id ), 'error', __FILE__, __LINE__ );
1273 1009 }
1274 1010 $render->render();
1275 1011 if ( ! $can_die ) {
1276 1012 return;
@@ -1315,19 +1051,15 @@
1315 1051 if ( strpos( $key, 'visualizer-' ) !== false ) {
1316 1052 add_post_meta( $new_chart_id, $key, maybe_unserialize( $value[0] ) );
1317 1053 }
1318 1054 }
1319 - $redirect = esc_url(
1320 - add_query_arg(
1321 - array(
1322 - 'page' => 'visualizer',
1323 - 'type' => filter_input( INPUT_GET, 'type' ),
1324 - 'vaction' => false,
1325 - ),
1326 - admin_url( 'admin.php' )
1055 + $redirect = add_query_arg(
1056 + array(
1057 + 'page' => 'visualizer',
1058 + 'type' => filter_input( INPUT_GET, 'type' ),
1059 + 'vaction' => false,
1327 1060 ),
1328 - null,
1329 - 'db'
1061 + admin_url( 'admin.php' )
1330 1062 );
1331 1063 }
1332 1064 }
1333 1065
@@ -1333,8 +1065,9 @@
1333 1065
1334 1066 if ( defined( 'WP_TESTS_DOMAIN' ) ) {
1335 1067 wp_die();
1336 1068 }
1069 +
1337 1070 wp_redirect( $redirect );
1338 1071 exit;
1339 1072 }
1340 1073
@@ -1380,12 +1113,9 @@
1380 1113 $data = $this->_getChartArray();
1381 1114 $render = new Visualizer_Render_Page_Data();
1382 1115 $render->chart = $this->_chart;
1383 1116 $render->type = $data['type'];
1384 -
1385 - if ( $data && $data['settings'] ) {
1386 - unset( $data['settings']['width'], $data['settings']['height'], $data['settings']['chartArea'] );
1387 - }
1117 + unset( $data['settings']['width'], $data['settings']['height'], $data['settings']['chartArea'] );
1388 1118 wp_enqueue_style( 'visualizer-frame' );
1389 1119 wp_enqueue_script( 'visualizer-render' );
1390 1120 wp_localize_script(
1391 1121 'visualizer-render',
@@ -1391,9 +1121,9 @@
1391 1121 'visualizer-render',
1392 1122 'visualizer',
1393 1123 array(
1394 1124 'l10n' => array(
1395 - 'invalid_source' => esc_html__( 'You have entered an invalid URL. Please provide a valid URL.', 'visualizer' ),
1125 + 'invalid_source' => esc_html__( 'You have entered invalid URL. Please, insert proper URL.', 'visualizer' ),
1396 1126 'loading' => esc_html__( 'Loading...', 'visualizer' ),
1397 1127 ),
1398 1128 'charts' => array(
1399 1129 'canvas' => $data,
@@ -1400,13 +1130,13 @@
1400 1130 ),
1401 1131 )
1402 1132 );
1403 1133
1404 - do_action( 'visualizer_enqueue_scripts_and_styles', $data, $this->_chart->ID );
1134 + do_action( 'visualizer_enqueue_scripts_and_styles', $data );
1405 1135
1406 1136 if ( Visualizer_Module::is_pro() && Visualizer_Module::is_pro_older_than( '1.9.0' ) ) {
1407 1137 global $Visualizer_Pro;
1408 - $Visualizer_Pro->_enqueueScriptsAndStyles( $data, $this->_chart->ID );
1138 + $Visualizer_Pro->_enqueueScriptsAndStyles( $data );
1409 1139 }
1410 1140
1411 1141 // Added by Ash/Upwork
1412 1142 $this->_addAction( 'admin_head', 'renderFlattrScript' );
@@ -1420,19 +1150,14 @@
1420 1150 */
1421 1151 public function getQueryData() {
1422 1152 check_ajax_referer( Visualizer_Plugin::ACTION_FETCH_DB_DATA . Visualizer_Plugin::VERSION, 'security' );
1423 1153
1424 - if ( ! current_user_can( 'administrator' ) ) {
1425 - wp_send_json_error( array( 'msg' => __( 'Action not allowed for this user.', 'visualizer' ) ) );
1426 - }
1427 -
1428 1154 $params = wp_parse_args( $_POST['params'] );
1429 - $chart_id = filter_var( $params['chart_id'], FILTER_VALIDATE_INT );
1430 -
1431 - $source = new Visualizer_Source_Query( stripslashes( $params['query'] ), $chart_id, $params );
1155 + $source = new Visualizer_Source_Query( stripslashes( $params['query'] ) );
1432 1156 $html = $source->fetch( true );
1433 - $error = $source->get_error();
1434 - if ( ! empty( $error ) ) {
1157 + $error = '';
1158 + if ( empty( $html ) ) {
1159 + $error = $source->get_error();
1435 1160 wp_send_json_error( array( 'msg' => $error ) );
1436 1161 }
1437 1162 wp_send_json_success( array( 'table' => $html ) );
1438 1163 }
@@ -1455,42 +1180,21 @@
1455 1180 ),
1456 1181 )
1457 1182 );
1458 1183
1459 - $hours = filter_input(
1460 - INPUT_POST,
1461 - 'refresh',
1462 - FILTER_VALIDATE_FLOAT,
1463 - array(
1464 - 'options' => array(
1465 - 'min_range' => -1,
1466 - 'max_range' => apply_filters( 'visualizer_is_business', false ) ? PHP_INT_MAX : -1,
1467 - ),
1468 - )
1469 - );
1470 -
1471 - if ( ! is_numeric( $hours ) ) {
1472 - $hours = -1;
1473 - }
1474 -
1475 1184 $render = new Visualizer_Render_Page_Update();
1476 1185 if ( $chart_id ) {
1477 1186 $params = wp_parse_args( $_POST['params'] );
1478 - $source = new Visualizer_Source_Query( stripslashes( $params['query'] ), $chart_id, $params );
1187 + $source = new Visualizer_Source_Query( stripslashes( $params['query'] ) );
1479 1188 $source->fetch( false );
1480 1189 $error = $source->get_error();
1481 1190 if ( empty( $error ) ) {
1191 + $hours = $_POST['refresh'];
1482 1192 update_post_meta( $chart_id, Visualizer_Plugin::CF_DB_QUERY, stripslashes( $params['query'] ) );
1483 1193 update_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
1484 1194 update_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
1485 1195 update_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, $hours );
1486 1196 update_post_meta( $chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, 0 );
1487 - if ( isset( $params['db_type'] ) && $params['db_type'] !== Visualizer_Plugin::WP_DB_NAME ) {
1488 - $remote_db_params = $params;
1489 - unset( $remote_db_params['query'] );
1490 - unset( $remote_db_params['chart_id'] );
1491 - update_post_meta( $chart_id, Visualizer_Plugin::CF_REMOTE_DB_PARAMS, $remote_db_params );
1492 - }
1493 1197
1494 1198 $schedules = get_option( Visualizer_Plugin::CF_DB_SCHEDULE, array() );
1495 1199 $schedules[ $chart_id ] = time() + $hours * HOUR_IN_SECONDS;
1496 1200 update_option( Visualizer_Plugin::CF_DB_SCHEDULE, $schedules );
@@ -1497,14 +1201,13 @@
1497 1201
1498 1202 wp_update_post(
1499 1203 array(
1500 1204 'ID' => $chart_id,
1501 - 'post_content' => $source->getData( get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) ),
1205 + 'post_content' => $source->getData(),
1502 1206 )
1503 1207 );
1504 - $render->data = json_encode( $source->getRawData( get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) ) );
1208 + $render->data = json_encode( $source->getRawData() );
1505 1209 $render->series = json_encode( $source->getSeries() );
1506 - $render->id = $chart_id;
1507 1210 } else {
1508 1211 $render->message = $error;
1509 1212 }
1510 1213 }
@@ -1533,80 +1236,13 @@
1533 1236 ),
1534 1237 )
1535 1238 );
1536 1239
1537 - $hours = filter_input(
1538 - INPUT_POST,
1539 - 'refresh',
1540 - FILTER_VALIDATE_INT,
1541 - array(
1542 - 'options' => array(
1543 - 'min_range' => -1,
1544 - 'max_range' => apply_filters( 'visualizer_is_business', false ) ? PHP_INT_MAX : -1,
1545 - ),
1546 - )
1547 - );
1240 + $hours = $_POST['refresh'];
1548 1241
1549 - if ( 0 !== $hours && empty( $hours ) ) {
1550 - $hours = -1;
1551 - }
1552 -
1553 1242 do_action( 'visualizer_save_filter', $chart_id, $hours );
1554 1243
1555 1244 if ( ! ( defined( 'VISUALIZER_DO_NOT_DIE' ) && VISUALIZER_DO_NOT_DIE ) ) {
1556 1245 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
1557 1246 }
1558 - }
1559 -
1560 - /**
1561 - * Save chart image.
1562 - *
1563 - * @param string $base64_img Chart image.
1564 - * @param int $chart_id Chart ID.
1565 - * @param bool $save_attachment Save attachment.
1566 - * @return attachment ID
1567 - */
1568 - public function save_chart_image( $base64_img, $chart_id, $save_attachment = true ) {
1569 - // Delete old chart image.
1570 - $old_attachment_id = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_IMAGE, true );
1571 - if ( $old_attachment_id ) {
1572 - wp_delete_attachment( $old_attachment_id, true );
1573 - }
1574 -
1575 - if ( ! $save_attachment ) {
1576 - return 0;
1577 - }
1578 -
1579 - // Upload dir.
1580 - $upload_dir = wp_upload_dir();
1581 - $upload_path = str_replace( '/', DIRECTORY_SEPARATOR, $upload_dir['path'] ) . DIRECTORY_SEPARATOR;
1582 -
1583 - $img = str_replace( 'data:image/png;base64,', '', $base64_img );
1584 - $img = str_replace( ' ', '+', $img );
1585 - $decoded = base64_decode( $img );
1586 - $filename = 'visualization-' . $chart_id . '.png';
1587 - $file_type = 'image/png';
1588 - $hashed_filename = $filename;
1589 -
1590 - // Save the image in the uploads directory.
1591 - require_once ABSPATH . '/wp-admin/includes/file.php';
1592 - \WP_Filesystem();
1593 - global $wp_filesystem;
1594 - if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base' ) ) {
1595 - $creds = request_filesystem_credentials( site_url() );
1596 - wp_filesystem( $creds );
1597 - }
1598 - $upload_file = $wp_filesystem->put_contents( $upload_path . $hashed_filename, $decoded );
1599 -
1600 - // Insert new chart image.
1601 - $attachment = array(
1602 - 'post_mime_type' => $file_type,
1603 - 'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $hashed_filename ) ),
1604 - 'post_content' => '',
1605 - 'post_status' => 'inherit',
1606 - 'guid' => $upload_dir['url'] . '/' . basename( $hashed_filename ),
1607 - );
1608 -
1609 - $attach_id = wp_insert_attachment( $attachment, $upload_dir['path'] . '/' . $hashed_filename );
1610 - return $attach_id;
1611 1247 }
1612 1248 }