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

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