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

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

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