PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.12
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.12
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 / Admin.php

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

644 lines 19.3 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 admin stuff.
23 *
24 * @category Visualizer
25 * @package Module
26 *
27 * @since 1.0.0
28 */
29 class Visualizer_Module_Admin extends Visualizer_Module {
30
31 const NAME = __CLASS__;
32
33 /**
34 * Library page suffix.
35 *
36 * @since 1.0.0
37 *
38 * @access private
39 * @var string
40 */
41 private $_libraryPage;
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->_addAction( 'load-post.php', 'enqueueMediaScripts' );
55 $this->_addAction( 'load-post-new.php', 'enqueueMediaScripts' );
56 $this->_addAction( 'admin_footer', 'renderTempaltes' );
57 $this->_addAction( 'admin_enqueue_scripts', 'enqueueLibraryScripts', null, 8 );
58 $this->_addAction( 'admin_menu', 'registerAdminMenu' );
59 $this->_addFilter( 'media_view_strings', 'setupMediaViewStrings' );
60 $this->_addFilter( 'plugin_action_links', 'getPluginActionLinks', 10, 2 );
61 $this->_addFilter( 'visualizer_logger_data', 'getLoggerData' );
62 $this->_addFilter( 'visualizer_get_chart_counts', 'getChartCountsByTypeAndMeta' );
63 $this->_addFilter( 'visualizer_feedback_review_trigger', 'feedbackReviewTrigger' );
64
65 // revision support.
66 $this->_addFilter( 'wp_revisions_to_keep', 'limitRevisions', null, 10, 2 );
67 $this->_addAction( '_wp_put_post_revision', 'addRevision', null, 10, 1 );
68 $this->_addAction( 'wp_restore_post_revision', 'restoreRevision', null, 10, 2 );
69
70 $this->_addAction( 'admin_init', 'init' );
71 }
72
73 /**
74 * No limits on revisions.
75 */
76 public function limitRevisions( $num, $post ) {
77 if ( Visualizer_Plugin::CPT_VISUALIZER === $post->post_type ) {
78 return -1;
79 }
80 return $num;
81 }
82
83 /**
84 * Add a revision.
85 */
86 public function addRevision( $revision_id ) {
87 $parent_id = wp_is_post_revision( $revision_id );
88 if ( Visualizer_Plugin::CPT_VISUALIZER === get_post_type( $parent_id ) ) {
89 // add the meta data to this revision.
90 $meta = get_post_meta( $parent_id, '', true );
91
92 if ( $meta ) {
93 foreach ( $meta as $key => $value ) {
94 if ( 0 === strpos( $key, 'visualizer' ) ) {
95 add_metadata( 'post', $revision_id, $key, maybe_unserialize( $value[0] ) );
96 }
97 }
98 }
99 }
100 }
101
102 /**
103 * Restore a revision.
104 */
105 public function restoreRevision( $post_id, $revision_id ) {
106 if ( Visualizer_Plugin::CPT_VISUALIZER === get_post_type( $post_id ) ) {
107 // get the meta information from the revision.
108 $meta = get_metadata( 'post', $revision_id, '', true );
109
110 // delete all meta information from the post before adding.
111 $post_meta = get_post_meta( $post_id, '', true );
112 if ( $post_meta ) {
113 foreach ( $meta as $key => $value ) {
114 if ( 0 === strpos( $key, 'visualizer' ) ) {
115 delete_post_meta( $post_id, $key );
116 }
117 }
118 }
119
120 if ( $meta ) {
121 foreach ( $meta as $key => $value ) {
122 if ( 0 === strpos( $key, 'visualizer' ) ) {
123 add_post_meta( $post_id, $key, maybe_unserialize( $value[0] ) );
124 }
125 }
126 }
127 }
128 }
129
130 /**
131 * Admin init.
132 *
133 * @access public
134 */
135 public function init() {
136 if ( current_user_can( 'edit_posts' ) && current_user_can( 'edit_pages' ) && 'true' == get_user_option( 'rich_editing' ) ) {
137 $this->_addFilter( 'mce_external_languages', 'add_tinymce_lang', 10, 1 );
138 $this->_addFilter( 'mce_external_plugins', 'tinymce_plugin', 10, 1 );
139 $this->_addFilter( 'mce_buttons', 'register_mce_button', 10, 1 );
140 }
141 }
142
143 /**
144 * Load plugin translation for - TinyMCE API
145 *
146 * @access public
147 * @param array $arr The tinymce_lang array.
148 * @return array
149 */
150 public function add_tinymce_lang( $arr ) {
151 $ui_lang = VISUALIZER_ABSPATH . '/classes/Visualizer/Module/Language.php';
152 $ui_lang = apply_filters( 'visualizer_ui_lang_filter', $ui_lang );
153 $arr[] = $ui_lang;
154 return $arr;
155 }
156
157 /**
158 * Load custom js options - TinyMCE API
159 *
160 * @access public
161 * @param array $plugin_array The tinymce plugin array.
162 * @return array
163 */
164 public function tinymce_plugin( $plugin_array ) {
165 $plugin_array['visualizer_mce_button'] = VISUALIZER_ABSURL . 'js/mce.js';
166 return $plugin_array;
167 }
168
169 /**
170 * Register new button in the editor
171 *
172 * @access public
173 * @param array $buttons The tinymce buttons array.
174 * @return array
175 */
176 public function register_mce_button( $buttons ) {
177 array_push( $buttons, 'visualizer_mce_button' );
178 return $buttons;
179 }
180
181 /**
182 * Whether to show the feedback review or not.
183 *
184 * @access public
185 */
186 public function feedbackReviewTrigger( $dumb ) {
187 $query = new WP_Query(
188 array(
189 'posts_per_page' => 50,
190 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
191 'fields' => 'ids',
192 'update_post_meta_cache' => false,
193 'update_post_term_cache' => false,
194 )
195 );
196
197 if ( $query->have_posts() && $query->post_count > 0 ) {
198 return true;
199 }
200 return false;
201 }
202
203 /**
204 * Enqueues media scripts and styles.
205 *
206 * @since 1.0.0
207 * @uses wp_enqueue_style To enqueue style file.
208 * @uses wp_enqueue_script To enqueue script file.
209 *
210 * @access public
211 */
212 public function enqueueMediaScripts() {
213 global $typenow;
214 if ( post_type_supports( $typenow, 'editor' ) ) {
215 wp_enqueue_style( 'visualizer-media', VISUALIZER_ABSURL . 'css/media.css', array( 'media-views' ), Visualizer_Plugin::VERSION );
216 wp_enqueue_script( 'visualizer-google-jsapi-new', '//www.gstatic.com/charts/loader.js', array( 'media-editor' ), null, true );
217 wp_enqueue_script( 'visualizer-google-jsapi-old', '//www.google.com/jsapi', array( 'visualizer-google-jsapi-new' ), null, true );
218 wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', array( 'visualizer-google-jsapi-old' ), Visualizer_Plugin::VERSION, true );
219 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
220 wp_enqueue_script( 'visualizer-media-controller', VISUALIZER_ABSURL . 'js/media/controller.js', array( 'visualizer-media-collection' ), Visualizer_Plugin::VERSION, true );
221 wp_enqueue_script( 'visualizer-media-view', VISUALIZER_ABSURL . 'js/media/view.js', array( 'visualizer-media-controller' ), Visualizer_Plugin::VERSION, true );
222 wp_localize_script(
223 'visualizer-media-view',
224 'visualizer',
225 array(
226 'i10n' => array(
227 'insert' => __( 'Insert', 'visualizer' ),
228 ),
229 )
230 );
231 wp_enqueue_script( 'visualizer-media-toolbar', VISUALIZER_ABSURL . 'js/media/toolbar.js', array( 'visualizer-media-view' ), Visualizer_Plugin::VERSION, true );
232 wp_enqueue_script( 'visualizer-media', VISUALIZER_ABSURL . 'js/media.js', array( 'visualizer-media-toolbar' ), Visualizer_Plugin::VERSION, true );
233 }
234 }
235
236 /**
237 * Extends media view strings with visualizer strings.
238 *
239 * @since 1.0.0
240 *
241 * @access public
242 *
243 * @param array $strings The array of media view strings.
244 *
245 * @return array The extended array of media view strings.
246 */
247 public function setupMediaViewStrings( $strings ) {
248 $chart_types = self::_getChartTypesLocalized( true, true, true );
249 $strings['visualizer'] = array(
250 'actions' => array(
251 'get_charts' => Visualizer_Plugin::ACTION_GET_CHARTS,
252 'delete_chart' => Visualizer_Plugin::ACTION_DELETE_CHART,
253 ),
254 'controller' => array(
255 'title' => esc_html__( 'Visualizations', 'visualizer' ),
256 ),
257 'routers' => array(
258 'library' => esc_html__( 'From Library', 'visualizer' ),
259 'create' => esc_html__( 'Create New', 'visualizer' ),
260 ),
261 'library' => array(
262 'filters' => $chart_types,
263 'types' => array_keys( $chart_types ),
264 ),
265 'nonce' => wp_create_nonce(),
266 'buildurl' => add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ),
267 );
268
269 return $strings;
270 }
271
272 /**
273 * Returns associated array of chart types and localized names.
274 *
275 * @since 1.0.0
276 *
277 * @static
278 * @access private
279 * @return array The associated array of chart types with localized names.
280 */
281 public static function _getChartTypesLocalized( $enabledOnly = false, $get2Darray = false, $add_select = false ) {
282 $additional = array();
283 if ( $add_select ) {
284 $additional['select'] = array(
285 'name' => esc_html__( 'All', 'visualizer' ),
286 'enabled' => true,
287 );
288 }
289
290 $types = array_merge(
291 $additional,
292 array(
293 'pie' => array(
294 'name' => esc_html__( 'Pie', 'visualizer' ),
295 'enabled' => true,
296 ),
297 'line' => array(
298 'name' => esc_html__( 'Line', 'visualizer' ),
299 'enabled' => true,
300 ),
301 'area' => array(
302 'name' => esc_html__( 'Area', 'visualizer' ),
303 'enabled' => true,
304 ),
305 'geo' => array(
306 'name' => esc_html__( 'Geo', 'visualizer' ),
307 'enabled' => true,
308 ),
309 'bar' => array(
310 'name' => esc_html__( 'Bar', 'visualizer' ),
311 'enabled' => true,
312 ),
313 'column' => array(
314 'name' => esc_html__( 'Column', 'visualizer' ),
315 'enabled' => true,
316 ),
317 'gauge' => array(
318 'name' => esc_html__( 'Gauge', 'visualizer' ),
319 'enabled' => true,
320 ),
321 'scatter' => array(
322 'name' => esc_html__( 'Scatter', 'visualizer' ),
323 'enabled' => true,
324 ),
325 'candlestick' => array(
326 'name' => esc_html__( 'Candlestick', 'visualizer' ),
327 'enabled' => true,
328 ),
329 // pro types
330 'table' => array(
331 'name' => esc_html__( 'Table', 'visualizer' ),
332 'enabled' => false,
333 ),
334 'timeline' => array(
335 'name' => esc_html__( 'Timeline', 'visualizer' ),
336 'enabled' => false,
337 ),
338 'combo' => array(
339 'name' => esc_html__( 'Combo', 'visualizer' ),
340 'enabled' => false,
341 ),
342 )
343 );
344 $types = apply_filters( 'visualizer_pro_chart_types', $types );
345 if ( $enabledOnly ) {
346 $filtered = array();
347 foreach ( $types as $type => $array ) {
348 if ( ! is_array( $array ) ) {
349 // support for old pro
350 $array = array( 'enabled' => true, 'name' => $array );
351 }
352 if ( ! $array['enabled'] ) {
353 continue;
354 }
355 $filtered[ $type ] = $array;
356 }
357 $types = $filtered;
358 }
359 if ( $get2Darray ) {
360 $doubleD = array();
361 foreach ( $types as $type => $array ) {
362 if ( ! is_array( $array ) ) {
363 // support for old pro
364 $array = array( 'enabled' => true, 'name' => $array );
365 }
366 $doubleD[ $type ] = $array['name'];
367 }
368 $types = $doubleD;
369 }
370
371 return $types;
372 }
373
374 /**
375 * Renders templates to use in media popup.
376 *
377 * @since 1.0.0
378 * @global string $pagenow The name of the current page.
379 *
380 * @access public
381 */
382 public function renderTempaltes() {
383 global $pagenow;
384 if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
385 return;
386 }
387 $render = new Visualizer_Render_Templates();
388 $render->render();
389 }
390
391 /**
392 * Enqueues library scripts and styles.
393 *
394 * @since 1.0.0
395 * @uses wp_enqueue_style() To enqueue library stylesheet.
396 * @uses wp_enqueue_script() To enqueue javascript file.
397 * @uses wp_enqueue_media() To enqueue media stuff.
398 *
399 * @access public
400 *
401 * @param string $suffix The current page suffix.
402 */
403 public function enqueueLibraryScripts( $suffix ) {
404 if ( $suffix == $this->_libraryPage ) {
405 wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
406 $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
407 wp_enqueue_media();
408 wp_enqueue_script(
409 'visualizer-library',
410 VISUALIZER_ABSURL . 'js/library.js',
411 array(
412 'jquery',
413 'media-views',
414 ),
415 Visualizer_Plugin::VERSION,
416 true
417 );
418 wp_enqueue_script( 'google-jsapi-new', '//www.gstatic.com/charts/loader.js', array(), null, true );
419 wp_enqueue_script( 'google-jsapi-old', '//www.google.com/jsapi', array( 'google-jsapi-new' ), null, true );
420 wp_enqueue_script( 'visualizer-customization', $this->get_user_customization_js(), array(), null, true );
421 wp_enqueue_script(
422 'visualizer-render',
423 VISUALIZER_ABSURL . 'js/render.js',
424 array(
425 'google-jsapi-old',
426 'visualizer-library',
427 'visualizer-customization',
428 ),
429 Visualizer_Plugin::VERSION,
430 true
431 );
432 }
433 }
434
435 /**
436 * Adds visualizer tab for media upload tabs array.
437 *
438 * @since 1.0.0
439 *
440 * @access public
441 *
442 * @param array $tabs The array of media upload tabs.
443 *
444 * @return array Extended array of media upload tabs.
445 */
446 public function setupVisualizerTab( $tabs ) {
447 $tabs['visualizer'] = 'Visualizer';
448
449 return $tabs;
450 }
451
452 /**
453 * Registers admin menu for visualizer library.
454 *
455 * @since 1.0.0
456 *
457 * @access public
458 */
459 public function registerAdminMenu() {
460 $title = esc_html__( 'Visualizer Library', 'visualizer' );
461 $callback = array( $this, 'renderLibraryPage' );
462 $this->_libraryPage = add_submenu_page( 'upload.php', $title, $title, 'edit_posts', Visualizer_Plugin::NAME, $callback );
463 }
464
465 /**
466 * Renders visualizer library page.
467 *
468 * @since 1.0.0
469 *
470 * @access public
471 */
472 public function renderLibraryPage() {
473 // get current page
474 $page = filter_input(
475 INPUT_GET,
476 'vpage',
477 FILTER_VALIDATE_INT,
478 array(
479 'options' => array(
480 'min_range' => 1,
481 'default' => 1,
482 ),
483 )
484 );
485 // the initial query arguments to fetch charts
486 $query_args = array(
487 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
488 'posts_per_page' => 6,
489 'paged' => $page,
490 );
491 // add chart type filter to the query arguments
492 $filter = filter_input( INPUT_GET, 'type' );
493 if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
494 $query_args['meta_query'] = array(
495 array(
496 'key' => Visualizer_Plugin::CF_CHART_TYPE,
497 'value' => $filter,
498 'compare' => '=',
499 ),
500 );
501 } else {
502 $filter = 'all';
503 }
504 // Added by Ash/Upwork
505 $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
506 if ( $filterByMeta ) {
507 $query = array(
508 'key' => Visualizer_Plugin::CF_SETTINGS,
509 'value' => $filterByMeta,
510 'compare' => 'LIKE',
511 );
512 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
513 $meta[] = $query;
514 $query_args['meta_query'] = $meta;
515 }
516 // Added by Ash/Upwork
517 // fetch charts
518 $charts = array();
519 $query = new WP_Query( $query_args );
520 while ( $query->have_posts() ) {
521 $chart = $query->next_post();
522
523 // if the user has updated a chart and instead of saving it, has closed the modal. If the user refreshes, they should get the original chart.
524 $chart = $this->handleExistingRevisions( $chart->ID, $chart );
525
526 // fetch and update settings
527 $settings = get_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, true );
528 unset( $settings['height'], $settings['width'] );
529 $type = get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
530 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
531 $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
532 // add chart to the array
533 $charts[ 'visualizer-' . $chart->ID ] = array(
534 'id' => $chart->ID,
535 'type' => $type,
536 'series' => $series,
537 'settings' => $settings,
538 'data' => $data,
539 );
540 }
541 // enqueue charts array
542 $ajaxurl = admin_url( 'admin-ajax.php' );
543 wp_localize_script(
544 'visualizer-library',
545 'visualizer',
546 array(
547 'language' => $this->get_language(),
548 'map_api_key' => get_option( 'visualizer-map-api-key' ),
549 'charts' => $charts,
550 'urls' => array(
551 'base' => add_query_arg( 'vpage', false ),
552 'create' => add_query_arg(
553 array(
554 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
555 'library' => 'yes',
556 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
557 ),
558 $ajaxurl
559 ),
560 'edit' => add_query_arg(
561 array(
562 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
563 'library' => 'yes',
564 ),
565 $ajaxurl
566 ),
567 ),
568 )
569 );
570 // render library page
571 $render = new Visualizer_Render_Library();
572 $render->charts = $charts;
573 $render->type = $filter;
574 $render->types = self::_getChartTypesLocalized();
575 $render->pagination = paginate_links(
576 array(
577 'base' => add_query_arg( 'vpage', '%#%' ),
578 'format' => '',
579 'current' => $page,
580 'total' => $query->max_num_pages,
581 'type' => 'array',
582 )
583 );
584 $render->render();
585 }
586
587 /**
588 * Updates the plugin's action links, which will be rendered at the plugins table.
589 *
590 * @since 1.0.0
591 *
592 * @access public
593 *
594 * @param array $links The array of original action links.
595 * @param string $file The plugin basename.
596 *
597 * @return array Updated array of action links.
598 */
599 public function getPluginActionLinks( $links, $file ) {
600 if ( $file == plugin_basename( VISUALIZER_BASEFILE ) ) {
601 array_unshift(
602 $links,
603 sprintf(
604 '<a href="%s">%s</a>',
605 admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ),
606 esc_html__( 'Library', 'visualizer' )
607 )
608 );
609 }
610
611 return $links;
612 }
613
614 /**
615 * Updates the plugin's meta links, which will be rendered at the plugins table.
616 *
617 * @since 1.0.0
618 *
619 * @access public
620 *
621 * @param array $plugin_meta The array of a plugin meta links.
622 * @param string $plugin_file The plugin's basename.
623 *
624 * @return array Updated array of plugin meta links.
625 */
626 public function getPluginMetaLinks( $plugin_meta, $plugin_file ) {
627 if ( $plugin_file == plugin_basename( VISUALIZER_BASEFILE ) ) {
628 // knowledge base link
629 $plugin_meta[] = sprintf(
630 '<a href="https://github.com/codeinwp/visualizer/wiki" target="_blank">%s</a>',
631 esc_html__( 'Knowledge Base', 'visualizer' )
632 );
633 // flattr link
634 $plugin_meta[] = sprintf(
635 '<a style="color:red" href="https://themeisle.com/plugins/visualizer-charts-and-graphs-pro-addon/" target="_blank">%s</a>',
636 esc_html__( 'Pro Addon', 'visualizer' )
637 );
638 }
639
640 return $plugin_meta;
641 }
642
643 }
644