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

785 lines 22.8 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', 'renderTemplates' );
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
217 // Load all the assets for the different libraries we support.
218 $deps = array(
219 Visualizer_Render_Sidebar_Google::enqueue_assets( array( 'media-editor' ) ),
220 Visualizer_Render_Sidebar_Type_DataTable::enqueue_assets( array( 'media-editor' ) ),
221 );
222
223 wp_enqueue_script( 'visualizer-media-model', VISUALIZER_ABSURL . 'js/media/model.js', $deps, Visualizer_Plugin::VERSION, true );
224 wp_enqueue_script( 'visualizer-media-collection', VISUALIZER_ABSURL . 'js/media/collection.js', array( 'visualizer-media-model' ), Visualizer_Plugin::VERSION, true );
225 wp_enqueue_script( 'visualizer-media-controller', VISUALIZER_ABSURL . 'js/media/controller.js', array( 'visualizer-media-collection' ), Visualizer_Plugin::VERSION, true );
226 wp_enqueue_script( 'visualizer-media-view', VISUALIZER_ABSURL . 'js/media/view.js', array( 'visualizer-media-controller' ), Visualizer_Plugin::VERSION, true );
227 wp_localize_script(
228 'visualizer-media-view',
229 'visualizer',
230 array(
231 'i10n' => array(
232 'insert' => __( 'Insert', 'visualizer' ),
233 ),
234 )
235 );
236 wp_enqueue_script( 'visualizer-media-toolbar', VISUALIZER_ABSURL . 'js/media/toolbar.js', array( 'visualizer-media-view' ), Visualizer_Plugin::VERSION, true );
237 wp_enqueue_script( 'visualizer-media', VISUALIZER_ABSURL . 'js/media.js', array( 'visualizer-media-toolbar' ), Visualizer_Plugin::VERSION, true );
238 }
239 }
240
241 /**
242 * Extends media view strings with visualizer strings.
243 *
244 * @since 1.0.0
245 *
246 * @access public
247 *
248 * @param array $strings The array of media view strings.
249 *
250 * @return array The extended array of media view strings.
251 */
252 public function setupMediaViewStrings( $strings ) {
253 $chart_types = self::_getChartTypesLocalized( true, true, true );
254 $strings['visualizer'] = array(
255 'actions' => array(
256 'get_charts' => Visualizer_Plugin::ACTION_GET_CHARTS,
257 'delete_chart' => Visualizer_Plugin::ACTION_DELETE_CHART,
258 ),
259 'controller' => array(
260 'title' => esc_html__( 'Visualizations', 'visualizer' ),
261 ),
262 'routers' => array(
263 'library' => esc_html__( 'From Library', 'visualizer' ),
264 'create' => esc_html__( 'Create New', 'visualizer' ),
265 ),
266 'library' => array(
267 'filters' => $chart_types,
268 'types' => array_keys( $chart_types ),
269 ),
270 'nonce' => wp_create_nonce(),
271 'buildurl' => add_query_arg( 'action', Visualizer_Plugin::ACTION_CREATE_CHART, admin_url( 'admin-ajax.php' ) ),
272 );
273
274 return $strings;
275 }
276
277 /**
278 * Returns associated array of chart types and localized names.
279 *
280 * @since 1.0.0
281 *
282 * @static
283 * @access private
284 * @return array The associated array of chart types with localized names.
285 */
286 public static function _getChartTypesLocalized( $enabledOnly = false, $get2Darray = false, $add_select = false, $where = null ) {
287 $additional = array();
288 if ( $add_select ) {
289 $additional['select'] = array(
290 'name' => esc_html__( 'All', 'visualizer' ),
291 'enabled' => true,
292 );
293 }
294
295 $types = array_merge(
296 $additional,
297 array(
298 'dataTable' => array(
299 'name' => esc_html__( 'Table (New)', 'visualizer' ),
300 'enabled' => true,
301 ),
302 'pie' => array(
303 'name' => esc_html__( 'Pie', 'visualizer' ),
304 'enabled' => true,
305 ),
306 'line' => array(
307 'name' => esc_html__( 'Line', 'visualizer' ),
308 'enabled' => true,
309 ),
310 'area' => array(
311 'name' => esc_html__( 'Area', 'visualizer' ),
312 'enabled' => true,
313 ),
314 'geo' => array(
315 'name' => esc_html__( 'Geo', 'visualizer' ),
316 'enabled' => true,
317 ),
318 'bar' => array(
319 'name' => esc_html__( 'Bar', 'visualizer' ),
320 'enabled' => true,
321 ),
322 'column' => array(
323 'name' => esc_html__( 'Column', 'visualizer' ),
324 'enabled' => true,
325 ),
326 'scatter' => array(
327 'name' => esc_html__( 'Scatter', 'visualizer' ),
328 'enabled' => true,
329 ),
330 'gauge' => array(
331 'name' => esc_html__( 'Gauge', 'visualizer' ),
332 'enabled' => true,
333 ),
334 'candlestick' => array(
335 'name' => esc_html__( 'Candlestick', 'visualizer' ),
336 'enabled' => true,
337 ),
338 // pro types
339 'table' => array(
340 'name' => esc_html__( 'Table (Deprecated)', 'visualizer' ),
341 'enabled' => false,
342 ),
343 'timeline' => array(
344 'name' => esc_html__( 'Timeline', 'visualizer' ),
345 'enabled' => false,
346 ),
347 'combo' => array(
348 'name' => esc_html__( 'Combo', 'visualizer' ),
349 'enabled' => false,
350 ),
351 )
352 );
353 $types = apply_filters( 'visualizer_pro_chart_types', $types );
354 if ( $enabledOnly ) {
355 $filtered = array();
356 foreach ( $types as $type => $array ) {
357 if ( ! is_array( $array ) ) {
358 // support for old pro
359 $array = array( 'enabled' => true, 'name' => $array );
360 }
361 if ( ! $array['enabled'] ) {
362 continue;
363 }
364 $filtered[ $type ] = $array;
365 }
366 $types = $filtered;
367 }
368 if ( $get2Darray ) {
369 $doubleD = array();
370 foreach ( $types as $type => $array ) {
371 if ( ! is_array( $array ) ) {
372 // support for old pro
373 $array = array( 'enabled' => true, 'name' => $array );
374 }
375 $doubleD[ $type ] = $array['name'];
376 }
377 $types = $doubleD;
378 }
379
380 return self::handleDeprecatedCharts( $types, $enabledOnly, $get2Darray, $where );
381 }
382
383 /**
384 * Handle (soon-to-be) deprecated charts.
385 */
386 private static function handleDeprecatedCharts( $types, $enabledOnly, $get2Darray, $where ) {
387 $deprecated = array();
388
389 switch ( $where ) {
390 case 'library':
391 // if the user has a Google Table chart, show it as deprecated otherwise remove the option from the library.
392 if ( ! self::hasChartType( 'table' ) ) {
393 $deprecated[] = 'table';
394 if ( $get2Darray ) {
395 $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
396 } else {
397 $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
398 }
399 }
400
401 // if a user has a Gauge/Candlestick chart, then let them keep using it.
402 if ( ! VISUALIZER_PRO ) {
403 if ( ! self::hasChartType( 'gauge' ) ) {
404 if ( $get2Darray ) {
405 $deprecated[] = 'gauge';
406 } else {
407 $types['gauge']['enabled'] = false;
408 }
409 }
410 if ( ! self::hasChartType( 'candlestick' ) ) {
411 if ( $get2Darray ) {
412 $deprecated[] = 'candlestick';
413 } else {
414 $types['candlestick']['enabled'] = false;
415 }
416 }
417 }
418 break;
419 default:
420 // remove the option to create a Google Table chart.
421 $deprecated[] = 'table';
422
423 // rename the new table chart type.
424 if ( $get2Darray ) {
425 $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
426 } else {
427 $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
428 }
429
430 // if a user has a Gauge/Candlestick chart, then let them keep using it.
431 if ( ! VISUALIZER_PRO ) {
432 if ( ! self::hasChartType( 'gauge' ) ) {
433 if ( $get2Darray ) {
434 $deprecated[] = 'gauge';
435 } else {
436 $types['gauge']['enabled'] = false;
437 }
438 }
439 if ( ! self::hasChartType( 'candlestick' ) ) {
440 if ( $get2Darray ) {
441 $deprecated[] = 'candlestick';
442 } else {
443 $types['candlestick']['enabled'] = false;
444 }
445 }
446 }
447 }
448
449 if ( $deprecated ) {
450 foreach ( $deprecated as $type ) {
451 unset( $types[ $type ] );
452 }
453 }
454
455 return $types;
456 }
457
458 /**
459 * Renders templates to use in media popup.
460 *
461 * @since 1.0.0
462 * @global string $pagenow The name of the current page.
463 *
464 * @access public
465 */
466 public function renderTemplates() {
467 global $pagenow;
468 if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
469 return;
470 }
471 $render = new Visualizer_Render_Templates();
472 $render->render();
473 }
474
475 /**
476 * Enqueues library scripts and styles.
477 *
478 * @since 1.0.0
479 * @uses wp_enqueue_style() To enqueue library stylesheet.
480 * @uses wp_enqueue_script() To enqueue javascript file.
481 * @uses wp_enqueue_media() To enqueue media stuff.
482 *
483 * @access public
484 *
485 * @param string $suffix The current page suffix.
486 */
487 public function enqueueLibraryScripts( $suffix ) {
488 if ( $suffix == $this->_libraryPage ) {
489 wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
490 $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
491 wp_enqueue_media();
492 wp_enqueue_script(
493 'visualizer-library',
494 VISUALIZER_ABSURL . 'js/library.js',
495 array(
496 'jquery',
497 'media-views',
498 ),
499 Visualizer_Plugin::VERSION,
500 true
501 );
502
503 wp_enqueue_script( 'visualizer-customization', $this->get_user_customization_js(), array(), null, true );
504
505 $query = $this->getQuery();
506 while ( $query->have_posts() ) {
507 $chart = $query->next_post();
508 $library = $this->load_chart_type( $chart->ID );
509 if ( is_null( $library ) ) {
510 continue;
511 }
512 wp_enqueue_script(
513 "visualizer-render-$library",
514 VISUALIZER_ABSURL . 'js/render-facade.js',
515 apply_filters( 'visualizer_assets_render', array( 'visualizer-library', 'visualizer-customization' ), true ),
516 Visualizer_Plugin::VERSION,
517 true
518 );
519 }
520 }
521 }
522
523 /**
524 * Adds visualizer tab for media upload tabs array.
525 *
526 * @since 1.0.0
527 *
528 * @access public
529 *
530 * @param array $tabs The array of media upload tabs.
531 *
532 * @return array Extended array of media upload tabs.
533 */
534 public function setupVisualizerTab( $tabs ) {
535 $tabs['visualizer'] = 'Visualizer';
536
537 return $tabs;
538 }
539
540 /**
541 * Registers admin menu for visualizer library.
542 *
543 * @since 1.0.0
544 *
545 * @access public
546 */
547 public function registerAdminMenu() {
548 $title = esc_html__( 'Visualizer Library', 'visualizer' );
549 $callback = array( $this, 'renderLibraryPage' );
550 $this->_libraryPage = add_submenu_page( 'upload.php', $title, $title, 'edit_posts', Visualizer_Plugin::NAME, $callback );
551 }
552
553 /**
554 * Get the instance of WP_Query that fetches the charts as per the given criteria.
555 */
556 private function getQuery() {
557 static $q;
558 if ( ! is_null( $q ) ) {
559 return $q;
560 }
561
562 // get current page
563 $page = filter_input(
564 INPUT_GET,
565 'vpage',
566 FILTER_VALIDATE_INT,
567 array(
568 'options' => array(
569 'min_range' => 1,
570 'default' => 1,
571 ),
572 )
573 );
574 // the initial query arguments to fetch charts
575 $query_args = array(
576 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
577 'posts_per_page' => 6,
578 'paged' => $page,
579 );
580 // add chart type filter to the query arguments
581 $filter = filter_input( INPUT_GET, 'type' );
582 if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
583 $query_args['meta_query'] = array(
584 array(
585 'key' => Visualizer_Plugin::CF_CHART_TYPE,
586 'value' => $filter,
587 'compare' => '=',
588 ),
589 );
590 } else {
591 $filter = 'all';
592 }
593 // Added by Ash/Upwork
594 $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
595 if ( $filterByMeta ) {
596 $query = array(
597 'key' => Visualizer_Plugin::CF_SETTINGS,
598 'value' => $filterByMeta,
599 'compare' => 'LIKE',
600 );
601 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
602 $meta[] = $query;
603 $query_args['meta_query'] = $meta;
604 }
605 $q = new WP_Query( $query_args );
606 return $q;
607 }
608
609 /**
610 * Renders visualizer library page.
611 *
612 * @since 1.0.0
613 *
614 * @access public
615 */
616 public function renderLibraryPage() {
617 $charts = array();
618 $query = $this->getQuery();
619
620 // get current page
621 $page = filter_input(
622 INPUT_GET,
623 'vpage',
624 FILTER_VALIDATE_INT,
625 array(
626 'options' => array(
627 'min_range' => 1,
628 'default' => 1,
629 ),
630 )
631 );
632 // add chart type filter to the query arguments
633 $filter = filter_input( INPUT_GET, 'type' );
634 if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) ) {
635 $filter = 'all';
636 }
637
638 $css = '';
639 while ( $query->have_posts() ) {
640 $chart = $query->next_post();
641
642 // 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.
643 $chart = $this->handleExistingRevisions( $chart->ID, $chart );
644 // refresh a "live" db query chart.
645 $chart = apply_filters( 'visualizer_schedule_refresh_chart', $chart, $chart->ID, false );
646
647 $type = get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
648
649 // fetch and update settings
650 $settings = get_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, true );
651
652 $settings = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SETTINGS, $settings, $chart->ID, $type );
653 if ( ! empty( $atts['settings'] ) ) {
654 $settings = apply_filters( $atts['settings'], $settings, $chart->ID, $type );
655 }
656
657 unset( $settings['height'], $settings['width'] );
658 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
659 $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
660
661 $library = $this->load_chart_type( $chart->ID );
662
663 $id = 'visualizer-' . $chart->ID;
664 $arguments = $this->get_inline_custom_css( $id, $settings );
665 if ( ! empty( $arguments ) ) {
666 $css .= $arguments[0];
667 $settings = $arguments[1];
668 }
669
670 // add chart to the array
671 $charts[ $id ] = array(
672 'id' => $chart->ID,
673 'type' => $type,
674 'series' => $series,
675 'settings' => $settings,
676 'data' => $data,
677 'library' => $library,
678 );
679 }
680 // enqueue charts array
681 $ajaxurl = admin_url( 'admin-ajax.php' );
682 wp_localize_script(
683 'visualizer-library',
684 'visualizer',
685 array(
686 'language' => $this->get_language(),
687 'map_api_key' => get_option( 'visualizer-map-api-key' ),
688 'charts' => $charts,
689 'urls' => array(
690 'base' => add_query_arg( 'vpage', false ),
691 'create' => add_query_arg(
692 array(
693 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
694 'library' => 'yes',
695 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
696 ),
697 $ajaxurl
698 ),
699 'edit' => add_query_arg(
700 array(
701 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
702 'library' => 'yes',
703 ),
704 $ajaxurl
705 ),
706 ),
707 'page_type' => 'library',
708 )
709 );
710 // render library page
711 $render = new Visualizer_Render_Library();
712 $render->charts = $charts;
713 $render->type = $filter;
714 $render->types = self::_getChartTypesLocalized( false, false, false, true );
715 $render->custom_css = $css;
716 $render->pagination = paginate_links(
717 array(
718 'base' => add_query_arg( 'vpage', '%#%' ),
719 'format' => '',
720 'current' => $page,
721 'total' => $query->max_num_pages,
722 'type' => 'array',
723 )
724 );
725 $render->render();
726 }
727
728 /**
729 * Updates the plugin's action links, which will be rendered at the plugins table.
730 *
731 * @since 1.0.0
732 *
733 * @access public
734 *
735 * @param array $links The array of original action links.
736 * @param string $file The plugin basename.
737 *
738 * @return array Updated array of action links.
739 */
740 public function getPluginActionLinks( $links, $file ) {
741 if ( $file == plugin_basename( VISUALIZER_BASEFILE ) ) {
742 array_unshift(
743 $links,
744 sprintf(
745 '<a href="%s">%s</a>',
746 admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ),
747 esc_html__( 'Library', 'visualizer' )
748 )
749 );
750 }
751
752 return $links;
753 }
754
755 /**
756 * Updates the plugin's meta links, which will be rendered at the plugins table.
757 *
758 * @since 1.0.0
759 *
760 * @access public
761 *
762 * @param array $plugin_meta The array of a plugin meta links.
763 * @param string $plugin_file The plugin's basename.
764 *
765 * @return array Updated array of plugin meta links.
766 */
767 public function getPluginMetaLinks( $plugin_meta, $plugin_file ) {
768 if ( $plugin_file == plugin_basename( VISUALIZER_BASEFILE ) ) {
769 // knowledge base link
770 $plugin_meta[] = sprintf(
771 '<a href="https://github.com/codeinwp/visualizer/wiki" target="_blank">%s</a>',
772 esc_html__( 'Knowledge Base', 'visualizer' )
773 );
774 // flattr link
775 $plugin_meta[] = sprintf(
776 '<a style="color:red" href="https://themeisle.com/plugins/visualizer-charts-and-graphs-pro-addon/" target="_blank">%s</a>',
777 esc_html__( 'Pro Addon', 'visualizer' )
778 );
779 }
780
781 return $plugin_meta;
782 }
783
784 }
785