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 +44 -13 3.10.33.11.7 View file →
@@ -751,9 +751,9 @@
751 751 'lineWrapping' => true,
752 752 'dragDrop' => false,
753 753 'matchBrackets' => true,
754 754 'autoCloseBrackets' => true,
755 - 'extraKeys' => array( 'Ctrl-Space' => 'autocomplete' ),
755 + 'extraKeys' => array( 'Shift-Space' => 'autocomplete' ),
756 756 'hintOptions' => array( 'tables' => $table_col_mapping ),
757 757 ),
758 758 )
759 759 );
@@ -787,9 +787,12 @@
787 787 update_option( 'visualizer-map-api-key', $_POST['map_api_key'] );
788 788 }
789 789
790 790 if ( $_SERVER['REQUEST_METHOD'] === 'POST' && isset( $_GET['nonce'] ) && wp_verify_nonce( $_GET['nonce'] ) ) {
791 - if ( $this->_chart->post_status === 'auto-draft' ) {
791 + $is_canceled = isset( $_POST['cancel'] ) && 1 === intval( $_POST['cancel'] );
792 + $is_newly_created = $this->_chart->post_status === 'auto-draft';
793 +
794 + if ( $is_newly_created && ! $is_canceled ) {
792 795 $this->_chart->post_status = 'publish';
793 796
794 797 // 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 798 // we do not want any difference in data so disable revisions temporarily.
@@ -797,9 +800,9 @@
797 800
798 801 wp_update_post( $this->_chart->to_array() );
799 802 }
800 803 // save meta data only when it is NOT being canceled.
801 - if ( ! ( isset( $_POST['cancel'] ) && 1 === intval( $_POST['cancel'] ) ) ) {
804 + if ( ! $is_canceled ) {
802 805 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SETTINGS, $_POST );
803 806
804 807 // we will keep a parameter called 'internal_title' that will be set to the given title or, if empty, the chart ID
805 808 // this will help in searching with the chart id.
@@ -873,12 +876,13 @@
873 876 'visualizer',
874 877 array(
875 878 'l10n' => array(
876 879 'invalid_source' => esc_html__( 'You have entered an invalid URL. Please provide a valid URL.', 'visualizer' ),
877 - 'loading' => esc_html__( 'Loading...', 'visualizer' ),
878 - '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' ),
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' ),
881 885 ),
882 886 'charts' => array(
883 887 'canvas' => $data,
884 888 'id' => $this->_chart->ID,
@@ -922,11 +926,10 @@
922 926 if ( filter_input( INPUT_GET, 'library', FILTER_VALIDATE_BOOLEAN ) ) {
923 927 $render->button = filter_input( INPUT_GET, 'action' ) === Visualizer_Plugin::ACTION_EDIT_CHART
924 928 ? esc_html__( 'Save Chart', 'visualizer' )
925 929 : esc_html__( 'Create Chart', 'visualizer' );
926 - if ( filter_input( INPUT_GET, 'action' ) === Visualizer_Plugin::ACTION_EDIT_CHART ) {
927 - $render->cancel_button = esc_html__( 'Cancel', 'visualizer' );
928 - }
930 +
931 + $render->cancel_button = esc_html__( 'Cancel', 'visualizer' );
929 932 } else {
930 933 $render->button = esc_attr__( 'Insert Chart', 'visualizer' );
931 934 }
932 935
@@ -1420,12 +1423,24 @@
1420 1423 */
1421 1424 public function getQueryData() {
1422 1425 check_ajax_referer( Visualizer_Plugin::ACTION_FETCH_DB_DATA . Visualizer_Plugin::VERSION, 'security' );
1423 1426
1427 + if ( ! current_user_can( 'administrator' ) ) {
1428 + wp_send_json_error( array( 'msg' => __( 'Action not allowed for this user.', 'visualizer' ) ) );
1429 + }
1430 + if ( ! is_super_admin() ) {
1431 + wp_send_json_error( array( 'msg' => __( 'Action not allowed for this user.', 'visualizer' ) ) );
1432 + }
1433 +
1434 + if ( ! Visualizer_Module::is_pro() ) {
1435 + wp_send_json_error( array( 'msg' => __( 'Feature is not available.', 'visualizer' ) ) );
1436 + }
1437 +
1424 1438 $params = wp_parse_args( $_POST['params'] );
1425 1439 $chart_id = filter_var( $params['chart_id'], FILTER_VALIDATE_INT );
1440 + $query = trim( $params['query'], ';' );
1426 1441
1427 - $source = new Visualizer_Source_Query( stripslashes( $params['query'] ), $chart_id, $params );
1442 + $source = new Visualizer_Source_Query( stripslashes( $query ), $chart_id, $params );
1428 1443 $html = $source->fetch( true );
1429 1444 $error = $source->get_error();
1430 1445 if ( ! empty( $error ) ) {
1431 1446 wp_send_json_error( array( 'msg' => $error ) );
@@ -1440,8 +1455,19 @@
1440 1455 */
1441 1456 public function saveQuery() {
1442 1457 check_ajax_referer( Visualizer_Plugin::ACTION_SAVE_DB_QUERY . Visualizer_Plugin::VERSION, 'security' );
1443 1458
1459 + if ( ! current_user_can( 'administrator' ) ) {
1460 + wp_send_json_error( array( 'msg' => __( 'Action not allowed for this user.', 'visualizer' ) ) );
1461 + }
1462 + if ( ! is_super_admin() ) {
1463 + wp_send_json_error( array( 'msg' => __( 'Action not allowed for this user.', 'visualizer' ) ) );
1464 + }
1465 +
1466 + if ( ! Visualizer_Module::is_pro() ) {
1467 + wp_send_json_error( array( 'msg' => __( 'Feature is not available.', 'visualizer' ) ) );
1468 + }
1469 +
1444 1470 $chart_id = filter_input(
1445 1471 INPUT_GET,
1446 1472 'chart',
1447 1473 FILTER_VALIDATE_INT,
@@ -1470,13 +1496,14 @@
1470 1496
1471 1497 $render = new Visualizer_Render_Page_Update();
1472 1498 if ( $chart_id ) {
1473 1499 $params = wp_parse_args( $_POST['params'] );
1474 - $source = new Visualizer_Source_Query( stripslashes( $params['query'] ), $chart_id, $params );
1500 + $query = trim( $params['query'], ';' );
1501 + $source = new Visualizer_Source_Query( stripslashes( $query ), $chart_id, $params );
1475 1502 $source->fetch( false );
1476 1503 $error = $source->get_error();
1477 1504 if ( empty( $error ) ) {
1478 - update_post_meta( $chart_id, Visualizer_Plugin::CF_DB_QUERY, stripslashes( $params['query'] ) );
1505 + update_post_meta( $chart_id, Visualizer_Plugin::CF_DB_QUERY, stripslashes( $query ) );
1479 1506 update_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
1480 1507 update_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
1481 1508 update_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, $hours );
1482 1509 update_post_meta( $chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, 0 );
@@ -1586,8 +1613,12 @@
1586 1613 // Save the image in the uploads directory.
1587 1614 require_once ABSPATH . '/wp-admin/includes/file.php';
1588 1615 \WP_Filesystem();
1589 1616 global $wp_filesystem;
1617 + if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base' ) ) {
1618 + $creds = request_filesystem_credentials( site_url() );
1619 + wp_filesystem( $creds );
1620 + }
1590 1621 $upload_file = $wp_filesystem->put_contents( $upload_path . $hashed_filename, $decoded );
1591 1622
1592 1623 // Insert new chart image.
1593 1624 $attachment = array(