PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.9
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.9
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.9, at classes/Visualizer/Module/Chart.php

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