PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.11.7
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.11.7
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 +67 -172 4.0.43.11.7 View file →
@@ -69,8 +69,9 @@
69 69
70 70 $this->_addAjaxAction( Visualizer_Plugin::ACTION_SAVE_FILTER_QUERY, 'saveFilter' );
71 71
72 72 $this->_addFilter( 'visualizer_get_sidebar', 'getSidebar', 10, 2 );
73 +
73 74 }
74 75
75 76 /**
76 77 * Generates the HTML of the sidebar for the chart.
@@ -295,9 +296,9 @@
295 296 $render->data = json_encode( $source->getRawData( get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITABLE_TABLE, true ) ) );
296 297 $render->series = json_encode( $source->getSeries() );
297 298 $render->render();
298 299
299 - ( defined( 'WP_TESTS_DOMAIN' ) && function_exists( 'tests_add_filter' ) ) ? wp_die() : exit();
300 + defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
300 301 }
301 302
302 303
303 304 /**
@@ -373,13 +374,13 @@
373 374 * @since 1.0.0
374 375 *
375 376 * @access private
376 377 *
377 - * @param WP_Post|null $chart The chart object.
378 + * @param WP_Post $chart The chart object.
378 379 *
379 380 * @return array The array of chart data.
380 381 */
381 - private function _getChartArray( $chart = null ) {
382 + private function _getChartArray( WP_Post $chart = null ) {
382 383 if ( is_null( $chart ) ) {
383 384 $chart = $this->_chart;
384 385 }
385 386 $type = get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
@@ -401,13 +402,8 @@
401 402 }
402 403
403 404 $date_formats = Visualizer_Source::get_date_formats_if_exists( $series, $data );
404 405
405 - $code = '';
406 - if ( 'd3' === $library ) {
407 - $code = get_post_meta( $chart->ID, Visualizer_Module_AIBuilder::CF_D3_CODE, true );
408 - }
409 -
410 406 return array(
411 407 'type' => $type,
412 408 'series' => $series,
413 409 'settings' => $settings,
@@ -412,9 +408,8 @@
412 408 'series' => $series,
413 409 'settings' => $settings,
414 410 'data' => $data,
415 411 'library' => $library,
416 - 'code' => $code,
417 412 'css' => $css,
418 413 'date_formats' => $date_formats,
419 414 );
420 415 }
@@ -431,9 +426,9 @@
431 426 public static function _sendResponse( $results ) {
432 427 header( 'Content-type: application/json' );
433 428 nocache_headers();
434 429 echo json_encode( $results );
435 - ( defined( 'WP_TESTS_DOMAIN' ) && function_exists( 'tests_add_filter' ) ) ? wp_die() : exit();
430 + defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
436 431 }
437 432
438 433 /**
439 434 * Deletes a chart from database.
@@ -528,12 +523,8 @@
528 523 *
529 524 * @access public
530 525 */
531 526 public function renderChartPages() {
532 - if ( ! current_user_can( 'edit_posts' ) ) {
533 - wp_die( __( 'You do not have permission to access this page.', 'visualizer' ) );
534 - }
535 -
536 527 defined( 'IFRAME_REQUEST' ) || define( 'IFRAME_REQUEST', 1 );
537 528 if ( ! defined( 'ET_BUILDER_PRODUCT_VERSION' ) && function_exists( 'et_get_theme_version' ) ) {
538 529 define( 'ET_BUILDER_PRODUCT_VERSION', et_get_theme_version() );
539 530 }
@@ -543,10 +534,9 @@
543 534 $chart_id = isset( $_GET['chart'] ) ? filter_var( $_GET['chart'], FILTER_VALIDATE_INT ) : '';
544 535 if ( ! empty( $_POST ) ) {
545 536 $_POST = map_deep( $_POST, 'wp_strip_all_tags' );
546 537 }
547 - $chart = $chart_id ? get_post( $chart_id ) : null;
548 - if ( ! $chart_id || ! $chart || $chart->post_type !== Visualizer_Plugin::CPT_VISUALIZER ) {
538 + if ( ! $chart_id || ! ( $chart = get_post( $chart_id ) ) || $chart->post_type !== Visualizer_Plugin::CPT_VISUALIZER ) {
549 539 if ( empty( $_GET['lang'] ) || empty( $_GET['parent_chart_id'] ) ) {
550 540 $this->deleteOldCharts();
551 541 $default_type = isset( $_GET['type'] ) && ! empty( $_GET['type'] ) ? $_GET['type'] : 'line';
552 542 $chart_status = Visualizer_Module_Admin::checkChartStatus( $default_type );
@@ -580,33 +570,35 @@
580 570
581 571 do_action( 'visualizer_pro_new_chart_defaults', $chart_id );
582 572 }
583 573 } else {
584 - $parent_chart_id = filter_var( $_GET['parent_chart_id'], FILTER_VALIDATE_INT );
585 - $success = false;
586 - if ( $parent_chart_id ) {
587 - $parent_chart = get_post( $parent_chart_id );
588 - $success = $parent_chart && $parent_chart->post_type === Visualizer_Plugin::CPT_VISUALIZER;
589 - }
590 - if ( $success ) {
591 - $new_chart_id = wp_insert_post(
592 - array(
593 - 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
594 - 'post_title' => 'Visualization',
595 - 'post_author' => get_current_user_id(),
596 - 'post_status' => $parent_chart->post_status,
597 - 'post_content' => $parent_chart->post_content,
598 - )
599 - );
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 + );
600 591
601 - if ( is_wp_error( $new_chart_id ) ) {
602 - 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__ );
603 - } else {
604 - $post_meta = get_post_meta( $parent_chart_id );
605 - $chart_id = $new_chart_id;
606 - foreach ( $post_meta as $key => $value ) {
607 - if ( strpos( $key, 'visualizer-' ) !== false ) {
608 - add_post_meta( $new_chart_id, $key, maybe_unserialize( $value[0] ) );
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 + }
609 601 }
610 602 }
611 603 }
612 604 }
@@ -613,9 +605,9 @@
613 605 do_action( 'visualizer_pro_new_chart_defaults', $chart_id );
614 606 }
615 607 wp_redirect( esc_url_raw( add_query_arg( 'chart', (int) $chart_id ) ) );
616 608
617 - if ( defined( 'WP_TESTS_DOMAIN' ) && function_exists( 'tests_add_filter' ) ) {
609 + if ( defined( 'WP_TESTS_DOMAIN' ) ) {
618 610 wp_die();
619 611 }
620 612 exit();
621 613 }
@@ -711,9 +703,9 @@
711 703 default:
712 704 // this should never happen.
713 705 break;
714 706 }
715 - ( defined( 'WP_TESTS_DOMAIN' ) && function_exists( 'tests_add_filter' ) ) ? wp_die() : exit();
707 + defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
716 708 }
717 709
718 710 /**
719 711 * Load code editor assets.
@@ -743,9 +735,9 @@
743 735 wp_register_script( 'visualizer-codemirror-matchbrackets', '//codemirror.net/addon/edit/matchbrackets.js', array( 'visualizer-codemirror-core' ), Visualizer_Plugin::VERSION );
744 736 wp_register_script( 'visualizer-codemirror-closebrackets', '//codemirror.net/addon/edit/closebrackets.js', array( 'visualizer-codemirror-core' ), Visualizer_Plugin::VERSION );
745 737 wp_register_script( 'visualizer-codemirror-sql', '//codemirror.net/mode/sql/sql.js', array( 'visualizer-codemirror-core' ), Visualizer_Plugin::VERSION );
746 738 wp_register_script( 'visualizer-codemirror-sql-hint', '//codemirror.net/addon/hint/sql-hint.js', array( 'visualizer-codemirror-core' ), Visualizer_Plugin::VERSION );
747 - wp_register_script( 'visualizer-codemirror-hint', '//codemirror.net/addon/hint/show-hint.js', array( 'visualizer-codemirror-sql', 'visualizer-codemirror-sql-hint', 'visualizer-codemirror-placeholder', 'visualizer-codemirror-matchbrackets', 'visualizer-codemirror-closebrackets' ), Visualizer_Plugin::VERSION );
739 + wp_register_script( 'visualizer-codemirror-hint', '//codemirror.net/addon/hint/show-hint.js', array( 'visualizer-codemirror-sql', 'visualizer-codemirror-sql-hint', 'visualizer-codemirror-placeholder', 'visualizer-codemirror-matchbrackets', 'visualizer-codemirror-closebrackets' ), Visualizer_Plugin::VERSION );
748 740 wp_register_style( 'visualizer-codemirror-core', '//codemirror.net/lib/codemirror.css', array(), Visualizer_Plugin::VERSION );
749 741 wp_register_style( 'visualizer-codemirror-hint', '//codemirror.net/addon/hint/show-hint.css', array( 'visualizer-codemirror-core' ), Visualizer_Plugin::VERSION );
750 742
751 743 wp_enqueue_script( 'visualizer-codemirror-hint' );
@@ -809,14 +801,9 @@
809 801 wp_update_post( $this->_chart->to_array() );
810 802 }
811 803 // save meta data only when it is NOT being canceled.
812 804 if ( ! $is_canceled ) {
813 - $post_settings = $_POST;
814 - $existing = get_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SETTINGS, true );
815 - if ( isset( $existing['colors'] ) && is_array( $existing['colors'] ) && ! isset( $post_settings['colors'] ) ) {
816 - $post_settings['colors'] = $existing['colors'];
817 - }
818 - update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SETTINGS, $post_settings );
805 + update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SETTINGS, $_POST );
819 806
820 807 // we will keep a parameter called 'internal_title' that will be set to the given title or, if empty, the chart ID
821 808 // this will help in searching with the chart id.
822 809 $settings = get_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SETTINGS, true );
@@ -863,9 +850,8 @@
863 850 wp_enqueue_style( 'visualizer-frame' );
864 851 wp_enqueue_script( 'visualizer-preview' );
865 852 wp_enqueue_script( 'visualizer-chosen' );
866 853 wp_enqueue_script( 'visualizer-render' );
867 - wp_enqueue_code_editor( array( 'type' => 'application/json' ) );
868 854
869 855 if ( Visualizer_Module::can_show_feature( 'simple-editor' ) ) {
870 856 wp_enqueue_script( 'visualizer-editor-simple' );
871 857 wp_localize_script(
@@ -873,10 +859,12 @@
873 859 'visualizer1',
874 860 array(
875 861 'ajax' => array(
876 862 'url' => admin_url( 'admin-ajax.php' ),
877 - 'nonces' => array(),
878 - 'actions' => array(),
863 + 'nonces' => array(
864 + ),
865 + 'actions' => array(
866 + ),
879 867 ),
880 868 )
881 869 );
882 870 }
@@ -887,15 +875,14 @@
887 875 'visualizer-render',
888 876 'visualizer',
889 877 array(
890 878 'l10n' => array(
891 - 'invalid_source' => esc_html__( 'The URL you entered is invalid. Please enter a valid URL.', 'visualizer' ),
892 - 'loading' => esc_html__( 'Loading...', 'visualizer' ),
893 - 'json_error' => esc_html__( 'An error occured in fetching data.', 'visualizer' ),
894 - 'select_columns' => esc_html__( 'Please select a few columns to include in the chart.', 'visualizer' ),
895 - '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' ),
896 - 'copied' => __( 'The data has been copied to your clipboard. Hit Ctrl-V/Cmd-V in your spreadsheet editor to paste the data.', 'visualizer' ),
897 - 'invalid_format' => esc_html__( 'This format pattern is not supported in the series settings field. Use the Manual Configuration option instead.', 'visualizer' ),
879 + 'invalid_source' => esc_html__( 'You have entered an invalid URL. Please provide a valid URL.', 'visualizer' ),
880 + 'loading' => esc_html__( 'Loading...', 'visualizer' ),
881 + 'json_error' => esc_html__( 'An error occured in fetching data.', 'visualizer' ),
882 + 'select_columns' => esc_html__( 'Please select a few columns to include in the chart.', 'visualizer' ),
883 + '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' ),
884 + 'copied' => __( 'The data has been copied to your clipboard. Hit Ctrl-V/Cmd-V in your spreadsheet editor to paste the data.', 'visualizer' ),
898 885 ),
899 886 'charts' => array(
900 887 'canvas' => $data,
901 888 'id' => $this->_chart->ID,
@@ -965,9 +952,9 @@
965 952 * @access private
966 953 */
967 954 private function _handleTypesPage() {
968 955 // process post request
969 - if ( $_SERVER['REQUEST_METHOD'] === 'POST' && wp_verify_nonce( filter_input( INPUT_POST, 'nonce' ), 'visualizer-upload-data' ) ) {
956 + if ( $_SERVER['REQUEST_METHOD'] === 'POST' && wp_verify_nonce( filter_input( INPUT_POST, 'nonce' ) ) ) {
970 957 $type = filter_input( INPUT_POST, 'type' );
971 958 $library = filter_input( INPUT_POST, 'chart-library' );
972 959 if ( Visualizer_Module_Admin::checkChartStatus( $type ) ) {
973 960 if ( empty( $library ) ) {
@@ -1022,80 +1009,8 @@
1022 1009 * Processes the CSV that is sent in the request as a string.
1023 1010 *
1024 1011 * @since 3.2.0
1025 1012 */
1026 - /**
1027 - * Determines whether a remote URL serves an XLSX file.
1028 - *
1029 - * Used as a fallback when the URL path has no recognisable file extension
1030 - * (e.g. SharePoint, signed S3 URLs, or "download?id=…" endpoints).
1031 - *
1032 - * Uses wp_safe_remote_get() to block requests to private/loopback addresses,
1033 - * and streams the response to a temp file so no body data is held in memory
1034 - * regardless of whether the server honours the Range header.
1035 - *
1036 - * The check relies on the ZIP magic number (PK\x03\x04) that every XLSX
1037 - * file begins with, making it immune to misleading Content-Type headers
1038 - * such as application/octet-stream. Content-Type is used as a last-resort
1039 - * fallback only when the temp file is empty (e.g. a HEAD-only server).
1040 - *
1041 - * @access private
1042 - * @param string $url The remote URL to probe.
1043 - * @return bool TRUE if the file appears to be XLSX, FALSE otherwise.
1044 - */
1045 - private static function _url_is_xlsx( $url ) {
1046 - $tmpfile = wp_tempnam( 'visualizer_xlsx_probe' );
1047 - if ( ! $tmpfile ) {
1048 - return false;
1049 - }
1050 -
1051 - $response = wp_safe_remote_get(
1052 - $url,
1053 - array(
1054 - 'timeout' => 10,
1055 - 'user-agent' => 'WordPress/' . get_bloginfo( 'version' ),
1056 - 'headers' => array( 'Range' => 'bytes=0-3' ),
1057 - 'stream' => true,
1058 - 'filename' => $tmpfile,
1059 - )
1060 - );
1061 -
1062 - if ( is_wp_error( $response ) ) {
1063 - @unlink( $tmpfile ); // phpcs:ignore WordPress.PHP.NoSilencedErrors
1064 - return false;
1065 - }
1066 -
1067 - $magic = '';
1068 - // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fopen
1069 - $fh = @fopen( $tmpfile, 'rb' ); // phpcs:ignore WordPress.PHP.NoSilencedErrors
1070 - if ( $fh ) {
1071 - $magic = fread( $fh, 4 ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fread
1072 - fclose( $fh ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fclose
1073 - }
1074 - @unlink( $tmpfile ); // phpcs:ignore WordPress.PHP.NoSilencedErrors
1075 -
1076 - if ( strlen( $magic ) >= 4 ) {
1077 - // XLSX (and all ZIP-based Office formats) start with PK\x03\x04.
1078 - return $magic === "PK\x03\x04";
1079 - }
1080 -
1081 - // Last resort: server returned an empty body (e.g. ignored Range and
1082 - // returned only headers). Check Content-Type from the same response.
1083 - // application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
1084 - return false !== strpos(
1085 - wp_remote_retrieve_header( $response, 'content-type' ),
1086 - 'spreadsheetml'
1087 - );
1088 - }
1089 -
1090 - /**
1091 - * Parses a raw CSV string or editor payload and returns a source object.
1092 - *
1093 - * @access private
1094 - * @param string $data The raw CSV data string.
1095 - * @param string $editor_type The editor type ('text' or 'tabular').
1096 - * @return Visualizer_Source|null The populated source object, or null on failure.
1097 - */
1098 1013 private function handleCSVasString( $data, $editor_type ) {
1099 1014 $source = null;
1100 1015
1101 1016 switch ( $editor_type ) {
@@ -1110,9 +1025,9 @@
1110 1025 continue;
1111 1026 }
1112 1027 $row = explode( ',', $row );
1113 1028 $row = array_map(
1114 - function ( $r ) {
1029 + function( $r ) {
1115 1030 return '' === $r ? ' ' : $r;
1116 1031 },
1117 1032 $row
1118 1033 );
@@ -1161,9 +1076,9 @@
1161 1076 foreach ( $types as $type ) {
1162 1077 if ( empty( $type ) ) {
1163 1078 $exclude[] = $index;
1164 1079 }
1165 - ++$index;
1080 + $index++;
1166 1081 }
1167 1082
1168 1083 // when N headers are being renamed, the number of headers increases by N
1169 1084 // because of the way datatable duplicates header information
@@ -1223,13 +1138,9 @@
1223 1138 // otherwise, assume this is a normal web request.
1224 1139 $can_die = ! ( defined( 'VISUALIZER_DO_NOT_DIE' ) && VISUALIZER_DO_NOT_DIE );
1225 1140
1226 1141 // validate nonce
1227 - if (
1228 - ! isset( $_GET['nonce'] ) ||
1229 - ! wp_verify_nonce( $_GET['nonce'], 'visualizer-upload-data' ) ||
1230 - ! current_user_can( 'edit_posts' )
1231 - ) {
1142 + if ( ! isset( $_GET['nonce'] ) || ! wp_verify_nonce( $_GET['nonce'] ) ) {
1232 1143 if ( ! $can_die ) {
1233 1144 return;
1234 1145 }
1235 1146 status_header( 403 );
@@ -1238,15 +1149,9 @@
1238 1149
1239 1150 // check chart, if chart exists
1240 1151 // do not use filter_input as it does not work for phpunit test cases, use filter_var instead
1241 1152 $chart_id = isset( $_GET['chart'] ) ? filter_var( $_GET['chart'], FILTER_VALIDATE_INT ) : '';
1242 - $chart = $chart_id ? get_post( $chart_id ) : null;
1243 - if (
1244 - ! $chart_id ||
1245 - ! $chart ||
1246 - $chart->post_type !== Visualizer_Plugin::CPT_VISUALIZER ||
1247 - ! current_user_can( 'edit_post', $chart_id )
1248 - ) {
1153 + if ( ! $chart_id || ! ( $chart = get_post( $chart_id ) ) || $chart->post_type !== Visualizer_Plugin::CPT_VISUALIZER ) {
1249 1154 if ( ! $can_die ) {
1250 1155 return;
1251 1156 }
1252 1157 status_header( 400 );
@@ -1293,24 +1198,15 @@
1293 1198 if ( isset( $_POST['remote_data'] ) && function_exists( 'wp_http_validate_url' ) ) {
1294 1199 $remote_data = wp_http_validate_url( $_POST['remote_data'] );
1295 1200 }
1296 1201 if ( false !== $remote_data ) {
1297 - $remote_ext = strtolower( pathinfo( parse_url( $remote_data, PHP_URL_PATH ), PATHINFO_EXTENSION ) );
1298 - if ( 'xlsx' === $remote_ext || ( 'csv' !== $remote_ext && self::_url_is_xlsx( $remote_data ) ) ) {
1299 - $source = new Visualizer_Source_Xlsx_Remote( $remote_data );
1300 - } else {
1301 - $source = new Visualizer_Source_Csv_Remote( $remote_data );
1302 - }
1202 + $source = new Visualizer_Source_Csv_Remote( $remote_data );
1303 1203 if ( isset( $_POST['vz-import-time'] ) ) {
1304 1204 apply_filters( 'visualizer_pro_chart_schedule', $chart_id, $remote_data, $_POST['vz-import-time'] );
1305 1205 }
1306 - } elseif ( isset( $_FILES['local_data'] ) && $_FILES['local_data']['error'] === 0 ) {
1307 - $local_ext = strtolower( pathinfo( isset( $_FILES['local_data']['name'] ) ? $_FILES['local_data']['name'] : '', PATHINFO_EXTENSION ) );
1308 - if ( 'xlsx' === $local_ext ) {
1309 - $source = new Visualizer_Source_Xlsx( $_FILES['local_data']['tmp_name'] );
1310 - } else {
1311 - $source = new Visualizer_Source_Csv( $_FILES['local_data']['tmp_name'] );
1312 - }
1206 + // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
1207 + } elseif ( isset( $_FILES['local_data'] ) && $_FILES['local_data']['error'] == 0 ) {
1208 + $source = new Visualizer_Source_Csv( $_FILES['local_data']['tmp_name'] );
1313 1209 } elseif ( isset( $_POST['chart_data'] ) && strlen( $_POST['chart_data'] ) > 0 ) {
1314 1210 $source = $this->handleCSVasString( $_POST['chart_data'], $_POST['editor-type'] );
1315 1211 update_post_meta( $chart_id, Visualizer_Plugin::CF_EDITOR, $_POST['editor-type'] );
1316 1212 } elseif ( isset( $_POST['table_data'] ) && 'yes' === $_POST['table_data'] ) {
@@ -1317,10 +1213,10 @@
1317 1213 $source = $this->handleTabularData();
1318 1214 update_post_meta( $chart_id, Visualizer_Plugin::CF_EDITOR, $_POST['editor-type'] );
1319 1215 } else {
1320 1216 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__ );
1321 - $render->message = esc_html__( 'No CSV file was received. Select a file and try uploading again.', 'visualizer' );
1322 - update_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR, esc_html__( 'No CSV file was received. Select a file and try uploading again.', 'visualizer' ) );
1217 + $render->message = esc_html__( 'CSV file with chart data was not uploaded. Please try again.', 'visualizer' );
1218 + update_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR, esc_html__( 'CSV file with chart data was not uploaded. Please try again.', 'visualizer' ) );
1323 1219 }
1324 1220
1325 1221 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__ );
1326 1222
@@ -1368,9 +1264,9 @@
1368 1264 $render->settings = json_encode( $settings );
1369 1265 } else {
1370 1266 $error = $source->get_error();
1371 1267 if ( empty( $error ) ) {
1372 - $error = esc_html__( 'The CSV file couldn\'t be read. Check that it\'s properly formatted and try again.', 'visualizer' );
1268 + $error = esc_html__( 'CSV file is broken or invalid. Please try again.', 'visualizer' );
1373 1269 }
1374 1270 $render->message = $error;
1375 1271 do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( '%s for chart %d.', $error, $chart_id ), 'error', __FILE__, __LINE__ );
1376 1272 update_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR, $error );
@@ -1381,9 +1277,9 @@
1381 1277 $render->render();
1382 1278 if ( ! $can_die ) {
1383 1279 return;
1384 1280 }
1385 - ( defined( 'WP_TESTS_DOMAIN' ) && function_exists( 'tests_add_filter' ) ) ? wp_die() : exit();
1281 + defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
1386 1282 }
1387 1283
1388 1284 /**
1389 1285 * Clones the chart.
@@ -1437,9 +1333,9 @@
1437 1333 );
1438 1334 }
1439 1335 }
1440 1336
1441 - if ( defined( 'WP_TESTS_DOMAIN' ) && function_exists( 'tests_add_filter' ) ) {
1337 + if ( defined( 'WP_TESTS_DOMAIN' ) ) {
1442 1338 wp_die();
1443 1339 }
1444 1340 wp_redirect( $redirect );
1445 1341 exit;
@@ -1472,9 +1368,9 @@
1472 1368 }
1473 1369 }
1474 1370 }
1475 1371
1476 - ( defined( 'WP_TESTS_DOMAIN' ) && function_exists( 'tests_add_filter' ) ) ? wp_die() : exit();
1372 + defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
1477 1373 }
1478 1374
1479 1375 /**
1480 1376 * Handles chart data page.
@@ -1498,11 +1394,10 @@
1498 1394 'visualizer-render',
1499 1395 'visualizer',
1500 1396 array(
1501 1397 'l10n' => array(
1502 - 'invalid_source' => esc_html__( 'The URL you entered is invalid. Please enter a valid URL.', 'visualizer' ),
1503 - 'loading' => esc_html__( 'Loading...', 'visualizer' ),
1504 - 'invalid_format' => esc_html__( 'This format pattern is not supported in the series settings field. To display percentages, use the Manual Configuration option instead.', 'visualizer' ),
1398 + 'invalid_source' => esc_html__( 'You have entered an invalid URL. Please provide a valid URL.', 'visualizer' ),
1399 + 'loading' => esc_html__( 'Loading...', 'visualizer' ),
1505 1400 ),
1506 1401 'charts' => array(
1507 1402 'canvas' => $data,
1508 1403 ),
@@ -1637,9 +1532,9 @@
1637 1532 }
1638 1533 }
1639 1534 $render->render();
1640 1535 if ( ! ( defined( 'VISUALIZER_DO_NOT_DIE' ) && VISUALIZER_DO_NOT_DIE ) ) {
1641 - ( defined( 'WP_TESTS_DOMAIN' ) && function_exists( 'tests_add_filter' ) ) ? wp_die() : exit();
1536 + defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
1642 1537 }
1643 1538 }
1644 1539
1645 1540
@@ -1664,9 +1559,9 @@
1664 1559
1665 1560 $hours = filter_input(
1666 1561 INPUT_POST,
1667 1562 'refresh',
1668 - FILTER_VALIDATE_FLOAT,
1563 + FILTER_VALIDATE_INT,
1669 1564 array(
1670 1565 'options' => array(
1671 1566 'min_range' => -1,
1672 1567 'max_range' => apply_filters( 'visualizer_is_business', false ) ? PHP_INT_MAX : -1,
@@ -1673,9 +1568,9 @@
1673 1568 ),
1674 1569 )
1675 1570 );
1676 1571
1677 - if ( ! is_numeric( $hours ) ) {
1572 + if ( 0 !== $hours && empty( $hours ) ) {
1678 1573 $hours = -1;
1679 1574 }
1680 1575
1681 1576 do_action( 'visualizer_save_filter', $chart_id, $hours );
@@ -1680,9 +1575,9 @@
1680 1575
1681 1576 do_action( 'visualizer_save_filter', $chart_id, $hours );
1682 1577
1683 1578 if ( ! ( defined( 'VISUALIZER_DO_NOT_DIE' ) && VISUALIZER_DO_NOT_DIE ) ) {
1684 - ( defined( 'WP_TESTS_DOMAIN' ) && function_exists( 'tests_add_filter' ) ) ? wp_die() : exit();
1579 + defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
1685 1580 }
1686 1581 }
1687 1582
1688 1583 /**