PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.11.10
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.11.10
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 / Render / Library.php

Library.php in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.11.10, at classes/Visualizer/Render/Library.php

478 lines 22.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 * Renders visualizer library page.
23 *
24 * @category Visualizer
25 * @package Render
26 *
27 * @since 1.0.0
28 */
29 class Visualizer_Render_Library extends Visualizer_Render {
30
31 /**
32 * Renders library page.
33 *
34 * @since 1.0.0
35 *
36 * @access protected
37 */
38 protected function _toHTML() {
39 echo '<div class="wrap">';
40 echo '<div id="visualizer-icon" class="icon32"><br></div>';
41 echo '<h2>';
42 esc_html_e( 'Visualizer Library', 'visualizer' );
43 echo ' <a href="javascript:;" class="add-new-h2 add-new-chart">', esc_html__( 'Add New', 'visualizer' ), '</a>';
44 if ( Visualizer_Module::is_pro() ) {
45 echo ' <a href="' . admin_url( 'options-general.php' ) . '" class="page-title-action">', esc_html__( 'License Settings', 'visualizer' ), '</a>';
46 }
47 echo '</h2>';
48 $this->_renderMessages();
49 $this->_renderLibrary();
50 echo '</div>';
51 }
52
53 /**
54 * Renders notification messages if need be.
55 *
56 * @since 1.4.2
57 *
58 * @access private
59 */
60 private function _renderMessages() {
61 if ( ! filter_var( ini_get( 'allow_url_fopen' ), FILTER_VALIDATE_BOOLEAN ) ) {
62 echo '<div class="updated error">';
63 echo '<p>';
64 printf( esc_html__( '%s option is disabled in your php.ini config. Please, enable it by change its value to 1. This option increases the speed of remote CSV uploading.', 'visualizer' ), '<b>allow_url_fopen</b>' );
65 echo '</p>';
66 echo '</div>';
67 }
68 }
69
70 /**
71 * Displays the search form.
72 */
73 private function getDisplayForm() {
74 echo '<div class="visualizer-library-form">
75 <form action="' . admin_url( 'admin.php' ) . '">
76 <input type="hidden" name="page" value="' . Visualizer_Plugin::NAME . '"/>
77 <select class="viz-filter" name="type">
78 ';
79
80 echo '<option value="" selected>' . __( 'All types', 'visualizer' ) . '</option>';
81
82 $type = isset( $_GET['type'] ) ? $_GET['type'] : '';
83 $enabled = array();
84 $disabled = array();
85 foreach ( $this->types as $id => $array ) {
86 if ( ! is_array( $array ) ) {
87 // support for old pro
88 $array = array( 'enabled' => true, 'name' => $array );
89 }
90 if ( ! $array['enabled'] ) {
91 $disabled[ $id ] = $array['name'];
92 continue;
93 }
94 $enabled[ $id ] = $array['name'];
95 }
96
97 asort( $enabled );
98 asort( $disabled );
99
100 foreach ( $enabled as $id => $name ) {
101 echo '<option value="' . esc_attr( $id ) . '" ' . selected( $type, $id ) . '>' . $name . '</option>';
102 }
103
104 if ( $disabled ) {
105 echo '<optgroup label="' . __( 'Not available', 'visualizer' ) . '">';
106 foreach ( $disabled as $id => $name ) {
107 echo '<option value="' . esc_attr( $id ) . '" ' . selected( $type, $id ) . ' disabled>' . $name . '</option>';
108 }
109 echo '</optgroup>';
110 }
111
112 echo '
113 </select>
114 <select class="viz-filter" name="library">
115 ';
116
117 $libraries = array( '', 'ChartJS', 'DataTable', 'GoogleCharts' );
118 $library = isset( $_GET['library'] ) ? $_GET['library'] : '';
119 foreach ( $libraries as $lib ) {
120 echo '<option value="' . esc_attr( $lib ) . '" ' . selected( $library, $lib ) . '>' . ( $lib === '' ? __( 'All libraries', 'visualizer' ) : $lib ) . '</option>';
121 }
122
123 echo '
124 </select>
125 <select class="viz-filter" name="date">
126 ';
127
128 $dates = Visualizer_Plugin::getSupportedDateFilter();
129 $date = isset( $_GET['date'] ) ? $_GET['date'] : '';
130 foreach ( Visualizer_Plugin::getSupportedDateFilter() as $dt => $label ) {
131 echo '<option value="' . esc_attr( $dt ) . '" ' . selected( $date, $dt ) . '>' . $label . '</option>';
132 }
133
134 echo '
135 </select>
136 <select class="viz-filter" name="source">
137 ';
138
139 $disabled = array();
140 $sources = array( 'json' => __( 'JSON', 'visualizer' ), 'csv' => __( 'Local CSV', 'visualizer' ), 'csv_remote' => __( 'Remote CSV', 'visualizer' ), 'query' => __( 'Database', 'visualizer' ), 'query_wp' => __( 'WordPress', 'visualizer' ) );
141 if ( ! Visualizer_Module::is_pro() ) {
142 $disabled['query'] = $sources['query'];
143 unset( $sources['query'] );
144 }
145 if ( ! apply_filters( 'visualizer_is_business', false ) ) {
146 $disabled['query_wp'] = $sources['query_wp'];
147 unset( $sources['query_wp'] );
148 }
149 $sources = array_filter( $sources );
150 uasort(
151 $sources, function( $a, $b ) {
152 if ( $a === $b ) {
153 return 0;
154 }
155 return ( $a < $b ) ? -1 : 1;
156 }
157 );
158
159 $source = isset( $_GET['source'] ) ? $_GET['source'] : '';
160 echo '<option value="">' . __( 'All sources', 'visualizer' ) . '</option>';
161 foreach ( $sources as $field => $label ) {
162 echo '<option value="' . esc_attr( $field ) . '" ' . selected( $source, $field ) . '>' . $label . '</option>';
163 }
164
165 if ( $disabled ) {
166 echo '<optgroup label="' . __( 'Not available', 'visualizer' ) . '">';
167 foreach ( $disabled as $id => $name ) {
168 echo '<option value="' . esc_attr( $id ) . '" ' . selected( $type, $id ) . ' disabled>' . $name . '</option>';
169 }
170 echo '</optgroup>';
171 }
172
173 $name = isset( $_GET['s'] ) ? $_GET['s'] : '';
174 echo '
175 </select>
176 <input class="viz-filter" type="text" name="s" placeholder="' . __( 'Enter title', 'visualizer' ) . '" value="' . esc_attr( $name ) . '">
177 ';
178
179 echo '
180 <span class="viz-filter">|</span>
181 <select class="viz-filter" name="orderby">
182 ';
183
184 $order_by_fields = apply_filters( 'visualizer_filter_order_by', array( 'date' => __( 'Date', 'visualizer' ), 's' => __( 'Title', 'visualizer' ) ) );
185 $order_by = isset( $_GET['orderby'] ) ? $_GET['orderby'] : '';
186 echo '<option value="">' . __( 'Order By', 'visualizer' ) . '</option>';
187 foreach ( $order_by_fields as $field => $label ) {
188 echo '<option value="' . esc_attr( $field ) . '" ' . selected( $order_by, $field ) . '>' . $label . '</option>';
189 }
190
191 echo '
192 </select>
193 <select class="viz-filter" name="order">
194 ';
195
196 $order_type = array( 'desc' => __( 'Descending', 'visualizer' ), 'asc' => __( 'Ascending', 'visualizer' ) );
197 $order = isset( $_GET['order'] ) ? $_GET['order'] : 'desc';
198 foreach ( $order_type as $field => $label ) {
199 echo '<option value="' . esc_attr( $field ) . '" ' . selected( $order, $field ) . '>' . $label . '</option>';
200 }
201
202 echo '
203 </select>
204 <input type="submit" class="viz-filter button button-secondary" value="' . __( 'Apply Filters', 'visualizer' ) . '">
205 <input type="button" id="viz-lib-reset" class="viz-filter button button-secondary" value="' . __( 'Clear Filters', 'visualizer' ) . '">
206 </form>
207 </div>';
208 }
209 /**
210 * Renders pro charts blocker.
211 *
212 * @access private
213 */
214 private function _renderProPopupBlocker() {
215 if ( Visualizer_Module::is_pro() ) {
216 return;
217 }
218 $license = get_option( 'visualizer_pro_license_data', 'free' );
219 $license_key = '';
220 $download_id = '';
221 if ( ! empty( $license ) && is_object( $license ) ) {
222 $license_key = $license->key;
223 $download_id = $license->download_id;
224 }
225 $admin_license_url = admin_url( 'options-general.php#visualizer_pro_license' );
226 $renew_license_url = tsdk_utmify( Visualizer_Plugin::STORE_URL . '?edd_license_key=' . $license_key . '&download_id=' . $download_id, 'visualizer_license_block' );
227 echo '
228 <div class="vizualizer-renew-notice-overlay" id="overlay-visualizer"></div>
229 <div class="vizualizer-renew-notice-popup">
230 <h1 class="vizualizer-renew-notice-heading">Alert!</h1>
231 <p class="vizualizer-renew-notice-message">' . esc_html__( 'In order to edit premium charts, benefit from updates and support for Visualizer Premium plugin, please renew your license code or activate it.', 'visualizer' ) . '</p>
232 <div class="vizualizer-renew-notice-buttons-container">
233 <a href="' . esc_url( $renew_license_url) . '" target="_blank">
234 <button class="vizualizer-renew-notice-button vizualizer-renew-notice-renew-button">
235 <span class="dashicons dashicons-cart"></span>' . esc_html__( 'Renew License', 'visualizer' ) . '
236 </button>
237 </a>
238 <a href="' . esc_url( $admin_license_url ) . '">
239 <button class="vizualizer-renew-notice-button vizualizer-renew-notice-activate-button">
240 <span class="dashicons dashicons-unlock"></span> ' . esc_html__( 'Activate License', 'visualizer' ) . '
241 </button>
242 </a>
243 <button class="vizualizer-renew-notice-button vizualizer-renew-notice-close-icon" aria-label="Close" onclick="closePopup()">
244 <i class="dashicons dashicons-no"></i>
245 </button>
246 </div>
247 </div>
248 <script>
249 function closePopup() {
250 var overlay = document.getElementById("overlay-visualizer");
251 var popup = document.querySelector(".vizualizer-renew-notice-popup");
252 overlay.style.display = "none";
253 popup.style.display = "none";
254 }
255 </script>';
256
257 }
258 /**
259 * Renders library content.
260 *
261 * @since 1.0.0
262 *
263 * @access private
264 */
265 private function _renderLibrary() {
266
267 // Added by Ash/Upwork
268 $filterBy = ! empty( $_GET['s'] ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
269
270 // Added by Ash/Upwork
271 echo $this->custom_css;
272
273 $this->_renderProPopupBlocker();
274
275 echo '<div id="visualizer-types" class="visualizer-clearfix">';
276 echo '<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><symbol id="list-icon" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8C0 12.42 3.58 16 8 16C12.42 16 16 12.42 16 8C16 3.58 12.42 0 8 0ZM7.385 12.66H6.045L2.805 8.12L4.146 6.87L6.715 9.27L11.856 3.339L13.196 4.279L7.385 12.66Z"/></symbol></svg>';
277 $this->getDisplayForm();
278 echo '</div>';
279 echo '<div id="visualizer-content-wrapper">';
280 echo '<div id="tsdk_banner" class="visualizer-banner"></div>';
281 if ( ! empty( $this->charts ) ) {
282 echo '<div id="visualizer-library" class="visualizer-clearfix">';
283 $count = 0;
284 foreach ( $this->charts as $placeholder_id => $chart ) {
285 // show the sidebar after the first 3 charts.
286 $count++;
287 $enable_controls = false;
288 $settings = isset( $chart['settings'] ) ? $chart['settings'] : array();
289 if ( ! empty( $settings['controls']['controlType'] ) ) {
290 $column_index = $settings['controls']['filterColumnIndex'];
291 $column_label = $settings['controls']['filterColumnLabel'];
292 if ( 'false' !== $column_index || 'false' !== $column_label ) {
293 $enable_controls = true;
294 }
295 }
296 if ( 3 === $count ) {
297 $this->_renderSidebar();
298 $this->_renderChartBox( $placeholder_id, $chart['id'], $enable_controls );
299 } else {
300 $this->_renderChartBox( $placeholder_id, $chart['id'], $enable_controls );
301 }
302 }
303 // show the sidebar if there are less than 3 charts.
304 if ( $count < 3 ) {
305 $this->_renderSidebar();
306 }
307 echo '</div>';
308 } else {
309 echo '<div id="visualizer-library" class="visualizer-clearfix">';
310 echo '<div class="items"><div class="visualizer-chart">';
311 echo '<div class="visualizer-chart-canvas visualizer-nochart-canvas">';
312 echo '<div class="visualizer-notfound">', esc_html__( 'No charts found', 'visualizer' ), '<p><h2><a href="javascript:;" class="add-new-h2 add-new-chart">', esc_html__( 'Add New', 'visualizer' ), '</a></h2></p></div>';
313 echo '</div>';
314 echo '<div class="visualizer-chart-footer visualizer-clearfix">';
315 echo '<div class="visualizer-action-group visualizer-nochart">';
316 echo '<span class="visualizer-chart-action visualizer-nochart-delete"><span class="dashicons dashicons-trash"></span></span>';
317 echo '<span class="visualizer-chart-action visualizer-nochart-shortcode"><span class="dashicons dashicons-shortcode"></span></span>';
318 echo '<span class="visualizer-chart-action visualizer-nochart-image"><span class="dashicons dashicons-format-image"></span></span>';
319 echo '<span class="visualizer-chart-action visualizer-nochart-export"><span class="dashicons dashicons-download"></span></span>';
320 echo '<span class="visualizer-chart-action visualizer-nochart-clone"><span class="dashicons dashicons-admin-page"></span></span>';
321 echo '<span class="visualizer-chart-action visualizer-nochart-edit"><span class="dashicons dashicons-admin-generic"></span></span>';
322 echo '</div>';
323 echo '</div>';
324 echo '</div></div>';
325 $this->_renderSidebar();
326 echo '</div>';
327 }
328 echo '</div>';
329 if ( is_array( $this->pagination ) ) {
330 echo '<ul class=" subsubsub">';
331 foreach ( $this->pagination as $page ) {
332 echo '<li class="all">', $page, '</li>';
333 }
334 echo '</ul>';
335 }
336 }
337
338 /**
339 * Renders chart's box block.
340 *
341 * @since 1.0.0
342 *
343 * @access private
344 *
345 * @param string $placeholder_id The placeholder's id for the chart.
346 * @param int $chart_id The id of the chart.
347 */
348 private function _renderChartBox( $placeholder_id, $chart_id, $with_filter = false ) {
349 $settings = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS );
350 $title = '#' . $chart_id;
351 if ( ! empty( $settings[0]['title'] ) ) {
352 $title = $settings[0]['title'];
353 }
354 // for ChartJS, title is an array.
355 if ( is_array( $title ) && isset( $title['text'] ) ) {
356 $title = $title['text'];
357 }
358 if ( ! empty( $settings[0]['backend-title'] ) ) {
359 $title = $settings[0]['backend-title'];
360 }
361 if ( empty( $title ) ) {
362 $title = '#' . $chart_id;
363 }
364
365 $ajax_url = admin_url( 'admin-ajax.php' );
366 $delete_url = esc_url(
367 add_query_arg(
368 array(
369 'action' => Visualizer_Plugin::ACTION_DELETE_CHART,
370 'nonce' => wp_create_nonce(),
371 'chart' => $chart_id,
372 ),
373 $ajax_url
374 )
375 );
376 $clone_url = esc_url(
377 add_query_arg(
378 array(
379 'action' => Visualizer_Plugin::ACTION_CLONE_CHART,
380 'nonce' => wp_create_nonce( Visualizer_Plugin::ACTION_CLONE_CHART ),
381 'chart' => $chart_id,
382 'type' => $this->type,
383 ),
384 $ajax_url
385 )
386 );
387 $export_link = esc_url(
388 add_query_arg(
389 array(
390 'action' => Visualizer_Plugin::ACTION_EXPORT_DATA,
391 'chart' => $chart_id,
392 'security' => wp_create_nonce( Visualizer_Plugin::ACTION_EXPORT_DATA . Visualizer_Plugin::VERSION ),
393 ),
394 admin_url( 'admin-ajax.php' )
395 )
396 );
397 $chart_type = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true );
398
399 $types = ['area', 'geo', 'column', 'bubble', 'scatter', 'gauge', 'candlestick', 'timeline', 'combo', 'polarArea', 'radar' ];
400
401 $pro_class = '';
402
403 if ( ! empty( $chart_type ) && in_array( $chart_type, $types, true ) ) {
404 $pro_class = 'viz-is-pro-chart';
405 }
406
407 $chart_status = array( 'date' => get_the_modified_date( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $chart_id ), 'error' => get_post_meta( $chart_id, Visualizer_Plugin::CF_ERROR, true ), 'icon' => 'dashicons-yes-alt', 'title' => 'A-OK!' );
408 if ( ! empty( $chart_status['error'] ) ) {
409 $chart_status['icon'] = 'error dashicons-dismiss';
410 $chart_status['title'] = __( 'Click to view the error', 'visualizer' );
411 }
412 $shortcode = sprintf( '[visualizer id="%s" class=""]', $chart_id );
413 echo '<div class="items"><div class="visualizer-chart"><div class="visualizer-chart-title">', esc_html( $title ), '</div>';
414 if ( Visualizer_Module::is_pro() && $with_filter ) {
415 echo '<div id="chart_wrapper_' . $placeholder_id . '">';
416 echo '<div id="control_wrapper_' . $placeholder_id . '" class="vz-library-chart-filter"></div>';
417 }
418 echo '<div id="', $placeholder_id, '" class="visualizer-chart-canvas">';
419 echo '<img src="', VISUALIZER_ABSURL, 'images/ajax-loader.gif" class="loader">';
420 echo '</div>';
421 if ( Visualizer_Module::is_pro() && $with_filter ) {
422 echo '</div>';
423 }
424 echo '<div class="visualizer-chart-footer visualizer-clearfix">';
425 echo '<div class="visualizer-action-group">';
426 echo '<a class="visualizer-chart-action visualizer-chart-delete" href="', $delete_url, '" onclick="return showNotice.warn();"><span class="dashicons dashicons-trash"></span><span class="tooltip-text">' . esc_attr__( 'Delete', 'visualizer' ) . '</span></a>';
427 echo '<a class="visualizer-chart-action visualizer-chart-shortcode ' . esc_attr( $pro_class ) . '" href="javascript:;" data-clipboard-text="', esc_attr( $shortcode ), '"><span class="dashicons dashicons-shortcode ' . esc_attr( $pro_class ) . '"></span><span class="tooltip-text">' . esc_attr__( 'Copy Shortcode', 'visualizer' ) . '</span></a>';
428 if ( $this->can_chart_have_action( 'image', $chart_id ) ) {
429 echo '<a class="visualizer-chart-action visualizer-chart-image ' . esc_attr( $pro_class ) . '" href="javascript:;" data-chart="visualizer-', $chart_id, '" data-chart-title="', $title, '"><span class="dashicons dashicons-format-image ' . esc_attr( $pro_class ) . '"></span><span class="tooltip-text">' . esc_attr__( 'Download PNG', 'visualizer' ) . '</span></a>';
430 }
431 echo '<a class="visualizer-chart-action visualizer-chart-export ' . esc_attr( $pro_class ) . '" href="javascript:;" data-chart="', $export_link, '"><span class="dashicons dashicons-download ' . esc_attr( $pro_class ) . '"></span><span class="tooltip-text">' . esc_attr__( 'Export CSV', 'visualizer' ) . '</span></a>';
432 echo '<a class="visualizer-chart-action visualizer-chart-clone ' . esc_attr( $pro_class ) . '" href="', $clone_url, '"><span class="dashicons dashicons-admin-page ' . esc_attr( $pro_class ) . '"></span><span class="tooltip-text">' . esc_attr__( 'Duplicate', 'visualizer' ) . '</span></a>';
433 echo '<a class="visualizer-chart-action visualizer-chart-edit ' . esc_attr( $pro_class ) . '" href="javascript:;" data-chart="', $chart_id, '"><span class="dashicons dashicons-admin-generic ' . esc_attr( $pro_class ) . '"></span><span class="tooltip-text">' . esc_attr__( 'Edit', 'visualizer' ) . '</span></a>';
434 echo '</div>';
435 do_action( 'visualizer_chart_languages', $chart_id );
436 echo '<hr><div class="visualizer-chart-status"><span title="' . __( 'Chart ID', 'visualizer' ) . '">(' . $chart_id . '):</span> <span class="visualizer-date" title="' . __( 'Last Updated', 'visualizer' ) . '">' . $chart_status['date'] . '</span><span class="visualizer-error"><i class="dashicons ' . $chart_status['icon'] . '" data-viz-error="' . esc_attr( str_replace( '"', "'", $chart_status['error'] ) ) . '" title="' . esc_attr( $chart_status['title'] ) . '"></i></span></div>';
437 echo '</div>';
438 echo '</div></div>';
439 }
440
441 /**
442 * Render 2-col sidebar
443 */
444 private function _renderSidebar() {
445 if ( ! Visualizer_Module::is_pro() ) {
446 echo '<div class="items">';
447 echo '<div class="viz-pro">';
448 echo '<div id="visualizer-sidebar" class="one-columns">';
449 echo '<div class="visualizer-sidebar-box">';
450 echo '<h3>' . __( 'Discover the power of PRO!', 'visualizer' ) . '</h3><ul>';
451 if ( Visualizer_Module_Admin::proFeaturesLocked() ) {
452 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( '6 more chart types', 'visualizer' );
453 } else {
454 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( '11 more chart types', 'visualizer' ) . '</li>';
455 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Synchronize Data Periodically', 'visualizer' ) . '</li>';
456 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'ChartJS Charts', 'visualizer' ) . '</li>';
457 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Table Google chart', 'visualizer' ) . '</li>';
458 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Frontend Actions(Print, Export, Copy, Download)', 'visualizer' ) . '</li>';
459 }
460 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Spreadsheet like editor', 'visualizer' ) . '</li>';
461 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Import from other charts', 'visualizer' ) . '</li>';
462 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Use database query to create charts', 'visualizer' ) . '</li>';
463 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Create charts from WordPress tables', 'visualizer' ) . '</li>';
464 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Frontend editor', 'visualizer' ) . '</li>';
465 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Private charts', 'visualizer' ) . '</li>';
466 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'WPML support for translating charts', 'visualizer' ) . '</li>';
467 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Integration with Woocommerce Data endpoints', 'visualizer' ) . '</li>';
468 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Auto-sync with online files', 'visualizer' ) . '</li></ul>';
469 echo '<p class="vz-sidebar-box-action"><a href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'sidebarMenuUpgrade', 'index' ) . '#pro-features" target="_blank" class="button button-secondary">' . __( 'View more features', 'visualizer' ) . '</a><a href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'sidebarMenuUpgrade', 'index' ) . '#pricing" target="_blank" class="button button-primary">' . __( 'Upgrade Now', 'visualizer' ) . '</a></p>';
470 echo '</div>';
471 echo '</div>';
472 echo '</div>';
473 echo '</div>';
474 }
475 }
476
477 }
478