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

783 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 = 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 'scatter' => array(
325 'name' => esc_html__( 'Scatter', 'visualizer' ),
326 'enabled' => true,
327 ),
328 'gauge' => array(
329 'name' => esc_html__( 'Gauge', '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 if ( $get2Darray ) {
403 $deprecated[] = 'gauge';
404 } else {
405 $types['gauge']['enabled'] = false;
406 }
407 }
408 if ( ! self::hasChartType( 'candlestick' ) ) {
409 if ( $get2Darray ) {
410 $deprecated[] = 'candlestick';
411 } else {
412 $types['candlestick']['enabled'] = false;
413 }
414 }
415 }
416 break;
417 default:
418 // remove the option to create a Google Table chart.
419 $deprecated[] = 'table';
420
421 // rename the new table chart type.
422 if ( $get2Darray ) {
423 $types['dataTable'] = esc_html__( 'Table', 'visualizer' );
424 } else {
425 $types['dataTable']['name'] = esc_html__( 'Table', 'visualizer' );
426 }
427
428 // if a user has a Gauge/Candlestick chart, then let them keep using it.
429 if ( ! VISUALIZER_PRO ) {
430 if ( ! self::hasChartType( 'gauge' ) ) {
431 if ( $get2Darray ) {
432 $deprecated[] = 'gauge';
433 } else {
434 $types['gauge']['enabled'] = false;
435 }
436 }
437 if ( ! self::hasChartType( 'candlestick' ) ) {
438 if ( $get2Darray ) {
439 $deprecated[] = 'candlestick';
440 } else {
441 $types['candlestick']['enabled'] = false;
442 }
443 }
444 }
445 }
446
447 if ( $deprecated ) {
448 foreach ( $deprecated as $type ) {
449 unset( $types[ $type ] );
450 }
451 }
452
453 return $types;
454 }
455
456 /**
457 * Renders templates to use in media popup.
458 *
459 * @since 1.0.0
460 * @global string $pagenow The name of the current page.
461 *
462 * @access public
463 */
464 public function renderTemplates() {
465 global $pagenow;
466 if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
467 return;
468 }
469 $render = new Visualizer_Render_Templates();
470 $render->render();
471 }
472
473 /**
474 * Enqueues library scripts and styles.
475 *
476 * @since 1.0.0
477 * @uses wp_enqueue_style() To enqueue library stylesheet.
478 * @uses wp_enqueue_script() To enqueue javascript file.
479 * @uses wp_enqueue_media() To enqueue media stuff.
480 *
481 * @access public
482 *
483 * @param string $suffix The current page suffix.
484 */
485 public function enqueueLibraryScripts( $suffix ) {
486 if ( $suffix == $this->_libraryPage ) {
487 wp_enqueue_style( 'visualizer-library', VISUALIZER_ABSURL . 'css/library.css', array(), Visualizer_Plugin::VERSION );
488 $this->_addFilter( 'media_upload_tabs', 'setupVisualizerTab' );
489 wp_enqueue_media();
490 wp_enqueue_script(
491 'visualizer-library',
492 VISUALIZER_ABSURL . 'js/library.js',
493 array(
494 'jquery',
495 'media-views',
496 ),
497 Visualizer_Plugin::VERSION,
498 true
499 );
500
501 wp_enqueue_script( 'visualizer-customization', $this->get_user_customization_js(), array(), null, true );
502
503 $query = $this->getQuery();
504 while ( $query->have_posts() ) {
505 $chart = $query->next_post();
506 $library = $this->load_chart_type( $chart->ID );
507 if ( is_null( $library ) ) {
508 continue;
509 }
510 wp_enqueue_script(
511 "visualizer-render-$library",
512 VISUALIZER_ABSURL . 'js/render-facade.js',
513 apply_filters( 'visualizer_assets_render', array( 'visualizer-library', 'visualizer-customization' ), true ),
514 Visualizer_Plugin::VERSION,
515 true
516 );
517 }
518 }
519 }
520
521 /**
522 * Adds visualizer tab for media upload tabs array.
523 *
524 * @since 1.0.0
525 *
526 * @access public
527 *
528 * @param array $tabs The array of media upload tabs.
529 *
530 * @return array Extended array of media upload tabs.
531 */
532 public function setupVisualizerTab( $tabs ) {
533 $tabs['visualizer'] = 'Visualizer';
534
535 return $tabs;
536 }
537
538 /**
539 * Registers admin menu for visualizer library.
540 *
541 * @since 1.0.0
542 *
543 * @access public
544 */
545 public function registerAdminMenu() {
546 $title = esc_html__( 'Visualizer Library', 'visualizer' );
547 $callback = array( $this, 'renderLibraryPage' );
548 $this->_libraryPage = add_submenu_page( 'upload.php', $title, $title, 'edit_posts', Visualizer_Plugin::NAME, $callback );
549 }
550
551 /**
552 * Get the instance of WP_Query that fetches the charts as per the given criteria.
553 */
554 private function getQuery() {
555 static $q;
556 if ( ! is_null( $q ) ) {
557 return $q;
558 }
559
560 // get current page
561 $page = filter_input(
562 INPUT_GET,
563 'vpage',
564 FILTER_VALIDATE_INT,
565 array(
566 'options' => array(
567 'min_range' => 1,
568 'default' => 1,
569 ),
570 )
571 );
572 // the initial query arguments to fetch charts
573 $query_args = array(
574 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
575 'posts_per_page' => 6,
576 'paged' => $page,
577 );
578 // add chart type filter to the query arguments
579 $filter = filter_input( INPUT_GET, 'type' );
580 if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
581 $query_args['meta_query'] = array(
582 array(
583 'key' => Visualizer_Plugin::CF_CHART_TYPE,
584 'value' => $filter,
585 'compare' => '=',
586 ),
587 );
588 } else {
589 $filter = 'all';
590 }
591 // Added by Ash/Upwork
592 $filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
593 if ( $filterByMeta ) {
594 $query = array(
595 'key' => Visualizer_Plugin::CF_SETTINGS,
596 'value' => $filterByMeta,
597 'compare' => 'LIKE',
598 );
599 $meta = isset( $query_args['meta_query'] ) ? $query_args['meta_query'] : array();
600 $meta[] = $query;
601 $query_args['meta_query'] = $meta;
602 }
603 $q = new WP_Query( $query_args );
604 return $q;
605 }
606
607 /**
608 * Renders visualizer library page.
609 *
610 * @since 1.0.0
611 *
612 * @access public
613 */
614 public function renderLibraryPage() {
615 $charts = array();
616 $query = $this->getQuery();
617
618 // get current page
619 $page = filter_input(
620 INPUT_GET,
621 'vpage',
622 FILTER_VALIDATE_INT,
623 array(
624 'options' => array(
625 'min_range' => 1,
626 'default' => 1,
627 ),
628 )
629 );
630 // add chart type filter to the query arguments
631 $filter = filter_input( INPUT_GET, 'type' );
632 if ( ! ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) ) {
633 $filter = 'all';
634 }
635
636 $css = '';
637 while ( $query->have_posts() ) {
638 $chart = $query->next_post();
639
640 // 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.
641 $chart = $this->handleExistingRevisions( $chart->ID, $chart );
642 // refresh a "live" db query chart.
643 $chart = apply_filters( 'visualizer_schedule_refresh_chart', $chart, $chart->ID, false );
644
645 $type = get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
646
647 // fetch and update settings
648 $settings = get_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, true );
649
650 $settings = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SETTINGS, $settings, $chart->ID, $type );
651 if ( ! empty( $atts['settings'] ) ) {
652 $settings = apply_filters( $atts['settings'], $settings, $chart->ID, $type );
653 }
654
655 unset( $settings['height'], $settings['width'] );
656 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
657 $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( $chart->post_content ) ), $chart->ID, $type );
658
659 $library = $this->load_chart_type( $chart->ID );
660
661 $id = 'visualizer-' . $chart->ID;
662 $arguments = $this->get_inline_custom_css( $id, $settings );
663 if ( ! empty( $arguments ) ) {
664 $css .= $arguments[0];
665 $settings = $arguments[1];
666 }
667
668 // add chart to the array
669 $charts[ $id ] = array(
670 'id' => $chart->ID,
671 'type' => $type,
672 'series' => $series,
673 'settings' => $settings,
674 'data' => $data,
675 'library' => $library,
676 );
677 }
678 // enqueue charts array
679 $ajaxurl = admin_url( 'admin-ajax.php' );
680 wp_localize_script(
681 'visualizer-library',
682 'visualizer',
683 array(
684 'language' => $this->get_language(),
685 'map_api_key' => get_option( 'visualizer-map-api-key' ),
686 'charts' => $charts,
687 'urls' => array(
688 'base' => add_query_arg( 'vpage', false ),
689 'create' => add_query_arg(
690 array(
691 'action' => Visualizer_Plugin::ACTION_CREATE_CHART,
692 'library' => 'yes',
693 'type' => isset( $_GET['type'] ) ? $_GET['type'] : '',
694 ),
695 $ajaxurl
696 ),
697 'edit' => add_query_arg(
698 array(
699 'action' => Visualizer_Plugin::ACTION_EDIT_CHART,
700 'library' => 'yes',
701 ),
702 $ajaxurl
703 ),
704 ),
705 'page_type' => 'library',
706 )
707 );
708 // render library page
709 $render = new Visualizer_Render_Library();
710 $render->charts = $charts;
711 $render->type = $filter;
712 $render->types = self::_getChartTypesLocalized( false, false, false, true );
713 $render->custom_css = $css;
714 $render->pagination = paginate_links(
715 array(
716 'base' => add_query_arg( 'vpage', '%#%' ),
717 'format' => '',
718 'current' => $page,
719 'total' => $query->max_num_pages,
720 'type' => 'array',
721 )
722 );
723 $render->render();
724 }
725
726 /**
727 * Updates the plugin's action links, which will be rendered at the plugins table.
728 *
729 * @since 1.0.0
730 *
731 * @access public
732 *
733 * @param array $links The array of original action links.
734 * @param string $file The plugin basename.
735 *
736 * @return array Updated array of action links.
737 */
738 public function getPluginActionLinks( $links, $file ) {
739 if ( $file == plugin_basename( VISUALIZER_BASEFILE ) ) {
740 array_unshift(
741 $links,
742 sprintf(
743 '<a href="%s">%s</a>',
744 admin_url( 'upload.php?page=' . Visualizer_Plugin::NAME ),
745 esc_html__( 'Library', 'visualizer' )
746 )
747 );
748 }
749
750 return $links;
751 }
752
753 /**
754 * Updates the plugin's meta links, which will be rendered at the plugins table.
755 *
756 * @since 1.0.0
757 *
758 * @access public
759 *
760 * @param array $plugin_meta The array of a plugin meta links.
761 * @param string $plugin_file The plugin's basename.
762 *
763 * @return array Updated array of plugin meta links.
764 */
765 public function getPluginMetaLinks( $plugin_meta, $plugin_file ) {
766 if ( $plugin_file == plugin_basename( VISUALIZER_BASEFILE ) ) {
767 // knowledge base link
768 $plugin_meta[] = sprintf(
769 '<a href="https://github.com/codeinwp/visualizer/wiki" target="_blank">%s</a>',
770 esc_html__( 'Knowledge Base', 'visualizer' )
771 );
772 // flattr link
773 $plugin_meta[] = sprintf(
774 '<a style="color:red" href="https://themeisle.com/plugins/visualizer-charts-and-graphs-pro-addon/" target="_blank">%s</a>',
775 esc_html__( 'Pro Addon', 'visualizer' )
776 );
777 }
778
779 return $plugin_meta;
780 }
781
782 }
783