PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.4
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.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
visualizer / classes / Visualizer / Module / Chart.php

Chart.php in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.0.4, at classes/Visualizer/Module/Chart.php

592 lines 20.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 // +----------------------------------------------------------------------+
3 // | Copyright 2013 Madpixels (email : visualizer@madpixels.net) |
4 // +----------------------------------------------------------------------+
5 // | This program is free software; you can redistribute it and/or modify |
6 // | it under the terms of the GNU General Public License, version 2, as |
7 // | published by the Free Software Foundation. |
8 // | |
9 // | This program is distributed in the hope that it will be useful, |
10 // | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 // | GNU General Public License for more details. |
13 // | |
14 // | You should have received a copy of the GNU General Public License |
15 // | along with this program; if not, write to the Free Software |
16 // | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, |
17 // | MA 02110-1301 USA |
18 // +----------------------------------------------------------------------+
19 // | Author: Eugene Manuilov <eugene@manuilov.org> |
20 // +----------------------------------------------------------------------+
21 /**
22 * The module for all stuff related to getting, editing, creating and deleting charts.
23 *
24 * @category Visualizer
25 * @package Module
26 *
27 * @since 1.0.0
28 */
29 class Visualizer_Module_Chart extends Visualizer_Module {
30
31 const NAME = __CLASS__;
32
33 /**
34 * The chart object.
35 *
36 * @since 1.0.0
37 *
38 * @access private
39 * @var WP_Post
40 */
41 private $_chart;
42
43 /**
44 * Constructor.
45 *
46 * @since 1.0.0
47 *
48 * @access public
49 *
50 * @param Visualizer_Plugin $plugin The instance of the plugin.
51 */
52 public function __construct( Visualizer_Plugin $plugin ) {
53 parent::__construct( $plugin );
54 $this->_addAjaxAction( Visualizer_Plugin::ACTION_GET_CHARTS, 'getCharts' );
55 $this->_addAjaxAction( Visualizer_Plugin::ACTION_DELETE_CHART, 'deleteChart' );
56 $this->_addAjaxAction( Visualizer_Plugin::ACTION_CREATE_CHART, 'renderChartPages' );
57 $this->_addAjaxAction( Visualizer_Plugin::ACTION_EDIT_CHART, 'renderChartPages' );
58 $this->_addAjaxAction( Visualizer_Plugin::ACTION_UPLOAD_DATA, 'uploadData' );
59 $this->_addAjaxAction( Visualizer_Plugin::ACTION_CLONE_CHART, 'cloneChart' );
60 // Added by Ash/Upwork
61 $this->_addAjaxAction( Visualizer_Plugin::ACTION_EXPORT_DATA, 'exportData' );
62 // Added by Ash/Upwork
63 }
64
65 /**
66 * Fetches charts from database.
67 *
68 * @since 1.0.0
69 *
70 * @access public
71 */
72 public function getCharts() {
73 $query_args = array(
74 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
75 'posts_per_page' => 9,
76 'paged' => filter_input(
77 INPUT_GET, 'page', FILTER_VALIDATE_INT, array(
78 'options' => array(
79 'min_range' => 1,
80 'default' => 1,
81 ),
82 )
83 ),
84 );
85 $filter = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
86 if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
87 $query_args['meta_query'] = array(
88 array(
89 'key' => Visualizer_Plugin::CF_CHART_TYPE,
90 'value' => $filter,
91 'compare' => '=',
92 ),
93 );
94 }
95 $query = new WP_Query( $query_args );
96 $charts = array();
97 while ( $query->have_posts() ) {
98 $chart = $query->next_post();
99 $chart_data = $this->_getChartArray( $chart );
100 $chart_data['id'] = $chart->ID;
101 $charts[] = $chart_data;
102 }
103 self::_sendResponse(
104 array(
105 'success' => true,
106 'data' => $charts,
107 'total' => $query->max_num_pages,
108 )
109 );
110 }
111
112 /**
113 * Returns chart data required for rendering.
114 *
115 * @since 1.0.0
116 *
117 * @access private
118 *
119 * @param WP_Post $chart The chart object.
120 *
121 * @return array The array of chart data.
122 */
123 private function _getChartArray( WP_Post $chart = null ) {
124 if ( is_null( $chart ) ) {
125 $chart = $this->_chart;
126 }
127 $type = get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
128 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
129 $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( $chart->post_content ), $chart->ID, $type );
130
131 return array(
132 'type' => $type,
133 'series' => $series,
134 'settings' => get_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, true ),
135 'data' => $data,
136 );
137 }
138
139 /**
140 * Sends json response.
141 *
142 * @since 1.0.0
143 *
144 * @access private
145 *
146 * @param array $results The response array.
147 */
148 public static function _sendResponse( $results ) {
149 header( 'Content-type: application/json' );
150 nocache_headers();
151 echo json_encode( $results );
152 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
153 }
154
155 /**
156 * Deletes a chart from database.
157 *
158 * @since 1.0.0
159 * @uses wp_delete_post() To delete a chart.
160 *
161 * @access public
162 */
163 public function deleteChart() {
164 $is_post = $_SERVER['REQUEST_METHOD'] == 'POST';
165 $input_method = $is_post ? INPUT_POST : INPUT_GET;
166 $chart_id = $success = false;
167 $nonce = wp_verify_nonce( filter_input( $input_method, 'nonce' ) );
168 $capable = current_user_can( 'delete_posts' );
169 if ( $nonce && $capable ) {
170 $chart_id = filter_input(
171 $input_method, 'chart', FILTER_VALIDATE_INT, array(
172 'options' => array(
173 'min_range' => 1,
174 ),
175 )
176 );
177 if ( $chart_id ) {
178 $chart = get_post( $chart_id );
179 $success = $chart && $chart->post_type == Visualizer_Plugin::CPT_VISUALIZER;
180 }
181 }
182 if ( $success ) {
183 wp_delete_post( $chart_id, true );
184 }
185 if ( $is_post ) {
186 self::_sendResponse(
187 array(
188 'success' => $success,
189 )
190 );
191 }
192 wp_redirect( wp_get_referer() );
193 exit;
194 }
195
196 /**
197 * Renders appropriate page for chart builder. Creates new auto draft chart
198 * if no chart has been specified.
199 *
200 * @since 1.0.0
201 *
202 * @access public
203 */
204 public function renderChartPages() {
205 defined( 'IFRAME_REQUEST' ) || define( 'IFRAME_REQUEST', 1 );
206 // check chart, if chart not exists, will create new one and redirects to the same page with proper chart id
207 $chart_id = isset( $_GET['chart'] ) ? filter_var( $_GET['chart'], FILTER_VALIDATE_INT ) : '';
208 if ( ! $chart_id || ! ( $chart = get_post( $chart_id ) ) || $chart->post_type != Visualizer_Plugin::CPT_VISUALIZER ) {
209 $default_type = 'line';
210 $source = new Visualizer_Source_Csv( VISUALIZER_ABSPATH . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR . $default_type . '.csv' );
211 $source->fetch();
212 $chart_id = wp_insert_post(
213 array(
214 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
215 'post_title' => 'Visualization',
216 'post_author' => get_current_user_id(),
217 'post_status' => 'auto-draft',
218 'post_content' => $source->getData(),
219 )
220 );
221 if ( $chart_id && ! is_wp_error( $chart_id ) ) {
222 add_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, $default_type );
223 add_post_meta( $chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, 1 );
224 add_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
225 add_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
226 add_post_meta(
227 $chart_id, Visualizer_Plugin::CF_SETTINGS, array(
228 'focusTarget' => 'datum',
229 )
230 );
231 do_action( 'visualizer_pro_new_chart_defaults', $chart_id );
232 }
233 wp_redirect( add_query_arg( 'chart', (int) $chart_id ) );
234 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
235 }
236 // enqueue and register scripts and styles
237 wp_register_script( 'visualizer-chosen', VISUALIZER_ABSURL . 'js/lib/chosen.jquery.min.js', array( 'jquery' ), Visualizer_Plugin::VERSION );
238 wp_register_style( 'visualizer-chosen', VISUALIZER_ABSURL . 'css/lib/chosen.min.css', array(), Visualizer_Plugin::VERSION );
239
240 wp_register_style( 'visualizer-frame', VISUALIZER_ABSURL . 'css/frame.css', array( 'visualizer-chosen' ), Visualizer_Plugin::VERSION );
241 wp_register_script( 'visualizer-frame', VISUALIZER_ABSURL . 'js/frame.js', array( 'visualizer-chosen' ), Visualizer_Plugin::VERSION, true );
242 wp_register_script( 'google-jsapi-new', '//www.gstatic.com/charts/loader.js', array(), null, true );
243 wp_register_script( 'google-jsapi-old', '//www.google.com/jsapi', array( 'google-jsapi-new' ), null, true );
244 wp_register_script(
245 'visualizer-render', VISUALIZER_ABSURL . 'js/render.js', array(
246 'google-jsapi-old',
247 'google-jsapi-new',
248 'visualizer-frame',
249 ), Visualizer_Plugin::VERSION, true
250 );
251 wp_register_script(
252 'visualizer-preview', VISUALIZER_ABSURL . 'js/preview.js', array(
253 'wp-color-picker',
254 'visualizer-render',
255 ), Visualizer_Plugin::VERSION, true
256 );
257 // added by Ash/Upwork
258 if ( VISUALIZER_PRO ) {
259 global $Visualizer_Pro;
260 $Visualizer_Pro->_addScriptsAndStyles();
261 }
262 // dispatch pages
263 $this->_chart = get_post( $chart_id );
264 $tab = isset( $_GET['tab'] ) && ! empty( $_GET['tab'] ) ? $_GET['tab'] : 'visualizer';
265 switch ( $tab ) {
266 case 'settings':
267 // changed by Ash/Upwork
268 $this->_handleDataAndSettingsPage();
269 break;
270 case 'type': // fall through.
271 case 'visualizer': // fall through.
272 $this->_handleTypesPage();
273 break;
274 default:
275 do_action( 'visualizer_pro_handle_tab', $tab, $this->_chart );
276 break;
277 }
278 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
279 }
280
281 /**
282 * Handle data and settings page
283 */
284 private function _handleDataAndSettingsPage() {
285 if ( isset( $_POST['map_api_key'] ) ) {
286 update_option( 'visualizer-map-api-key', $_POST['map_api_key'] );
287 }
288 if ( $_SERVER['REQUEST_METHOD'] == 'POST' && isset( $_GET['nonce'] ) && wp_verify_nonce( $_GET['nonce'] ) ) {
289 if ( $this->_chart->post_status == 'auto-draft' ) {
290 $this->_chart->post_status = 'publish';
291 wp_update_post( $this->_chart->to_array() );
292 }
293 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SETTINGS, $_POST );
294 $render = new Visualizer_Render_Page_Send();
295 $render->text = sprintf( '[visualizer id="%d"]', $this->_chart->ID );
296 wp_iframe( array( $render, 'render' ) );
297
298 return;
299 }
300 $data = $this->_getChartArray();
301 $sidebar = '';
302 $sidebar_class = 'Visualizer_Render_Sidebar_Type_' . ucfirst( $data['type'] );
303 if ( class_exists( $sidebar_class, true ) ) {
304 $sidebar = new $sidebar_class( $data['settings'] );
305 $sidebar->__series = $data['series'];
306 $sidebar->__data = $data['data'];
307 } else {
308 $sidebar = apply_filters( 'visualizer_pro_chart_type_sidebar', '', $data );
309 if ( $sidebar != '' ) {
310 $sidebar->__series = $data['series'];
311 $sidebar->__data = $data['data'];
312 }
313 }
314 unset( $data['settings']['width'], $data['settings']['height'] );
315 wp_enqueue_style( 'visualizer-frame' );
316 wp_enqueue_style( 'wp-color-picker' );
317 wp_enqueue_style( 'visualizer-frame' );
318 wp_enqueue_script( 'visualizer-preview' );
319 wp_enqueue_script( 'visualizer-render' );
320 wp_localize_script(
321 'visualizer-render', 'visualizer', array(
322 'l10n' => array(
323 'invalid_source' => esc_html__( 'You have entered invalid URL. Please, insert proper URL.', 'visualizer' ),
324 'loading' => esc_html__( 'Loading...', 'visualizer' ),
325 ),
326 'charts' => array(
327 'canvas' => $data,
328 ),
329 'map_api_key' => get_option( 'visualizer-map-api-key' ),
330 'ajax' => array(
331 'url' => admin_url( 'admin-ajax.php' ),
332 'nonces' => array(
333 'permissions' => wp_create_nonce( Visualizer_Plugin::ACTION_FETCH_PERMISSIONS_DATA ),
334 ),
335 'actions' => array(
336 'permissions' => Visualizer_Plugin::ACTION_FETCH_PERMISSIONS_DATA,
337 ),
338 ),
339 )
340 );
341 $render = new Visualizer_Render_Page_Data();
342 $render->chart = $this->_chart;
343 $render->type = $data['type'];
344 $render->sidebar = $sidebar;
345 if ( filter_input( INPUT_GET, 'library', FILTER_VALIDATE_BOOLEAN ) ) {
346 $render->button = filter_input( INPUT_GET, 'action' ) == Visualizer_Plugin::ACTION_EDIT_CHART
347 ? esc_html__( 'Save Chart', 'visualizer' )
348 : esc_html__( 'Create Chart', 'visualizer' );
349 } else {
350 $render->button = esc_attr__( 'Insert Chart', 'visualizer' );
351 }
352 if ( VISUALIZER_PRO ) {
353 global $Visualizer_Pro;
354 $Visualizer_Pro->_enqueueScriptsAndStyles( $data );
355 }
356 $this->_addAction( 'admin_head', 'renderFlattrScript' );
357 wp_iframe( array( $render, 'render' ) );
358 }
359
360 /**
361 * Handles chart type selection page.
362 *
363 * @since 1.0.0
364 *
365 * @access private
366 */
367 private function _handleTypesPage() {
368 // process post request
369 if ( $_SERVER['REQUEST_METHOD'] == 'POST' && wp_verify_nonce( filter_input( INPUT_POST, 'nonce' ) ) ) {
370 $type = filter_input( INPUT_POST, 'type' );
371 if ( in_array( $type, Visualizer_Plugin::getChartTypes() ) ) {
372 // save new chart type
373 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_CHART_TYPE, $type );
374 // if the chart has default data, update it with appropriate default data for new type
375 if ( filter_var( get_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_DEFAULT_DATA, true ), FILTER_VALIDATE_BOOLEAN ) ) {
376 $source = new Visualizer_Source_Csv( VISUALIZER_ABSPATH . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR . $type . '.csv' );
377 $source->fetch();
378 $this->_chart->post_content = $source->getData();
379 wp_update_post( $this->_chart->to_array() );
380 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
381 }
382 // redirect to next tab
383 // changed by Ash/Upwork
384 wp_redirect( add_query_arg( 'tab', 'settings' ) );
385
386 return;
387 }
388 }
389 $render = new Visualizer_Render_Page_Types();
390 $render->type = get_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
391 $render->types = Visualizer_Module_Admin::_getChartTypesLocalized();
392 $render->chart = $this->_chart;
393 wp_enqueue_style( 'visualizer-frame' );
394 wp_enqueue_script( 'visualizer-frame' );
395 wp_iframe( array( $render, 'render' ) );
396 }
397
398 /**
399 * Renders flattr script in the iframe <head>
400 *
401 * @since 1.4.2
402 * @action admin_head
403 *
404 * @access public
405 */
406 public function renderFlattrScript() {
407 echo '';
408 }
409 // changed by Ash/Upwork
410 /**
411 * Parses uploaded CSV file and saves new data for the chart.
412 *
413 * @since 1.0.0
414 *
415 * @access public
416 */
417 public function uploadData() {
418 // validate nonce
419 // do not use filter_input as it does not work for phpunit test cases, use filter_var instead
420 if ( ! isset( $_GET['nonce'] ) || ! wp_verify_nonce( $_GET['nonce'] ) ) {
421 status_header( 403 );
422 exit;
423 }
424 // check chart, if chart exists
425 $chart_id = isset( $_GET['chart'] ) ? filter_var( $_GET['chart'], FILTER_VALIDATE_INT ) : '';
426 if ( ! $chart_id || ! ( $chart = get_post( $chart_id ) ) || $chart->post_type != Visualizer_Plugin::CPT_VISUALIZER ) {
427 status_header( 400 );
428 exit;
429 }
430 if ( ! isset( $_POST['vz-import-time'] ) ) {
431 apply_filters( 'visualizer_pro_remove_schedule', $chart_id );
432 }
433
434 if ( ! isset( $_POST['chart_data_src'] ) || Visualizer_Plugin::CF_SOURCE_FILTER !== $_POST['chart_data_src'] ) {
435 // delete the filters in case this chart is being uploaded from other data sources
436 delete_post_meta( $chart_id, 'visualizer-filter-config' );
437 }
438
439 $source = null;
440 $render = new Visualizer_Render_Page_Update();
441 if ( isset( $_POST['remote_data'] ) && filter_var( $_POST['remote_data'], FILTER_VALIDATE_URL ) ) {
442 $source = new Visualizer_Source_Csv_Remote( $_POST['remote_data'] );
443 if ( isset( $_POST['vz-import-time'] ) ) {
444 apply_filters( 'visualizer_pro_chart_schedule', $chart_id, $_POST['remote_data'], $_POST['vz-import-time'] );
445 }
446 } elseif ( isset( $_FILES['local_data'] ) && $_FILES['local_data']['error'] == 0 ) {
447 $source = new Visualizer_Source_Csv( $_FILES['local_data']['tmp_name'] );
448 // Added by Ash/Upwork
449 } elseif ( isset( $_POST['chart_data'] ) && strlen( $_POST['chart_data'] ) > 0 ) {
450 $source = apply_filters( 'visualizer_pro_handle_chart_data', $_POST['chart_data'], '' );
451 // Added by Ash/Upwork
452 } else {
453 $render->message = esc_html__( 'CSV file with chart data was not uploaded. Please, try again.', 'visualizer' );
454 }
455 if ( $source ) {
456 if ( $source->fetch() ) {
457 $chart->post_content = $source->getData();
458 wp_update_post( $chart->to_array() );
459 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
460 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
461 update_post_meta( $chart->ID, Visualizer_Plugin::CF_DEFAULT_DATA, 0 );
462 $render->data = json_encode( $source->getRawData() );
463 $render->series = json_encode( $source->getSeries() );
464 } else {
465 $render->message = esc_html__( 'CSV file is broken or invalid. Please, try again.', 'visualizer' );
466 }
467 }
468 $render->render();
469 if ( ! ( defined( 'VISUALIZER_DO_NOT_DIE' ) && VISUALIZER_DO_NOT_DIE ) ) {
470 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
471 }
472 }
473
474 /**
475 * Clones the chart.
476 *
477 * @since 1.0.0
478 *
479 * @access public
480 */
481 public function cloneChart() {
482 $chart_id = $success = false;
483 $nonce = wp_verify_nonce( filter_input( INPUT_GET, 'nonce' ), Visualizer_Plugin::ACTION_CLONE_CHART );
484 $capable = current_user_can( 'edit_posts' );
485 if ( $nonce && $capable ) {
486 $chart_id = filter_input(
487 INPUT_GET, 'chart', FILTER_VALIDATE_INT, array(
488 'options' => array(
489 'min_range' => 1,
490 ),
491 )
492 );
493 if ( $chart_id ) {
494 $chart = get_post( $chart_id );
495 $success = $chart && $chart->post_type == Visualizer_Plugin::CPT_VISUALIZER;
496 }
497 }
498 $redirect = wp_get_referer();
499 if ( $success ) {
500 $new_chart_id = wp_insert_post(
501 array(
502 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
503 'post_title' => 'Visualization',
504 'post_author' => get_current_user_id(),
505 'post_status' => $chart->post_status,
506 'post_content' => $chart->post_content,
507 )
508 );
509 if ( $new_chart_id && ! is_wp_error( $new_chart_id ) ) {
510 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_CHART_TYPE, get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true ) );
511 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, get_post_meta( $chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, true ) );
512 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_SOURCE, get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true ) );
513 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_SERIES, get_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, true ) );
514 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_SETTINGS, get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true ) );
515 $redirect = add_query_arg(
516 array(
517 'page' => 'visualizer',
518 'type' => filter_input( INPUT_GET, 'type' ),
519 ), admin_url( 'upload.php' )
520 );
521 }
522 }
523 wp_redirect( $redirect );
524 exit;
525 }
526
527 /**
528 * Exports the chart data
529 *
530 * @since 1.0.0
531 *
532 * @access public
533 */
534 public function exportData() {
535 check_ajax_referer( Visualizer_Plugin::ACTION_EXPORT_DATA . Visualizer_Plugin::VERSION, 'security' );
536 $capable = current_user_can( 'edit_posts' );
537 if ( $capable ) {
538 $chart_id = isset( $_GET['chart'] ) ? filter_var(
539 $_GET['chart'], FILTER_VALIDATE_INT, array(
540 'options' => array(
541 'min_range' => 1,
542 ),
543 )
544 ) : '';
545 if ( $chart_id ) {
546 $data = $this->_getDataAs( $chart_id, 'csv' );
547 if ( $data ) {
548 echo wp_send_json_success( $data );
549 }
550 }
551 }
552
553 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
554 }
555
556 /**
557 * Handles chart data page.
558 *
559 * @since 1.0.0
560 *
561 * @access private
562 */
563 private function _handleDataPage() {
564 $data = $this->_getChartArray();
565 $render = new Visualizer_Render_Page_Data();
566 $render->chart = $this->_chart;
567 $render->type = $data['type'];
568 unset( $data['settings']['width'], $data['settings']['height'] );
569 wp_enqueue_style( 'visualizer-frame' );
570 wp_enqueue_script( 'visualizer-render' );
571 wp_localize_script(
572 'visualizer-render', 'visualizer', array(
573 'l10n' => array(
574 'invalid_source' => esc_html__( 'You have entered invalid URL. Please, insert proper URL.', 'visualizer' ),
575 'loading' => esc_html__( 'Loading...', 'visualizer' ),
576 ),
577 'charts' => array(
578 'canvas' => $data,
579 ),
580 )
581 );
582 // Added by Ash/Upwork
583 if ( VISUALIZER_PRO ) {
584 global $Visualizer_Pro;
585 $Visualizer_Pro->_enqueueScriptsAndStyles( $data );
586 }
587 // Added by Ash/Upwork
588 $this->_addAction( 'admin_head', 'renderFlattrScript' );
589 wp_iframe( array( $render, 'render' ) );
590 }
591 }
592