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

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

424 lines 19.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 * 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 /**
211 * Renders library content.
212 *
213 * @since 1.0.0
214 *
215 * @access private
216 */
217 private function _renderLibrary() {
218 // Added by Ash/Upwork
219 $filterBy = ! empty( $_GET['s'] ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : null; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
220 // Added by Ash/Upwork
221 echo $this->custom_css;
222 echo '<div id="visualizer-types" class="visualizer-clearfix">';
223 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>';
224 $this->getDisplayForm();
225 echo '</div>';
226 echo '<div id="visualizer-content-wrapper">';
227 if ( ! empty( $this->charts ) ) {
228 echo '<div id="visualizer-library" class="visualizer-clearfix">';
229 $count = 0;
230 foreach ( $this->charts as $placeholder_id => $chart ) {
231 // show the sidebar after the first 3 charts.
232 $count++;
233 $enable_controls = false;
234 $settings = isset( $chart['settings'] ) ? $chart['settings'] : array();
235 if ( ! empty( $settings['controls']['controlType'] ) ) {
236 $column_index = $settings['controls']['filterColumnIndex'];
237 $column_label = $settings['controls']['filterColumnLabel'];
238 if ( 'false' !== $column_index || 'false' !== $column_label ) {
239 $enable_controls = true;
240 }
241 }
242 if ( 3 === $count ) {
243 $this->_renderSidebar();
244 $this->_renderChartBox( $placeholder_id, $chart['id'], $enable_controls );
245 } else {
246 $this->_renderChartBox( $placeholder_id, $chart['id'], $enable_controls );
247 }
248 }
249 // show the sidebar if there are less than 3 charts.
250 if ( $count < 3 ) {
251 $this->_renderSidebar();
252 }
253 echo '</div>';
254 } else {
255 echo '<div id="visualizer-library" class="visualizer-clearfix">';
256 echo '<div class="items"><div class="visualizer-chart">';
257 echo '<div class="visualizer-chart-canvas visualizer-nochart-canvas">';
258 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>';
259 echo '</div>';
260 echo '<div class="visualizer-chart-footer visualizer-clearfix">';
261 echo '<div class="visualizer-action-group visualizer-nochart">';
262 echo '<span class="visualizer-chart-action visualizer-nochart-delete"><span class="dashicons dashicons-trash"></span></span>';
263 echo '<span class="visualizer-chart-action visualizer-nochart-shortcode"><span class="dashicons dashicons-shortcode"></span></span>';
264 echo '<span class="visualizer-chart-action visualizer-nochart-image"><span class="dashicons dashicons-format-image"></span></span>';
265 echo '<span class="visualizer-chart-action visualizer-nochart-export"><span class="dashicons dashicons-download"></span></span>';
266 echo '<span class="visualizer-chart-action visualizer-nochart-clone"><span class="dashicons dashicons-admin-page"></span></span>';
267 echo '<span class="visualizer-chart-action visualizer-nochart-edit"><span class="dashicons dashicons-admin-generic"></span></span>';
268 echo '</div>';
269 echo '</div>';
270 echo '</div></div>';
271 $this->_renderSidebar();
272 echo '</div>';
273 }
274 echo '</div>';
275 if ( is_array( $this->pagination ) ) {
276 echo '<ul class=" subsubsub">';
277 foreach ( $this->pagination as $page ) {
278 echo '<li class="all">', $page, '</li>';
279 }
280 echo '</ul>';
281 }
282 }
283
284 /**
285 * Renders chart's box block.
286 *
287 * @since 1.0.0
288 *
289 * @access private
290 *
291 * @param string $placeholder_id The placeholder's id for the chart.
292 * @param int $chart_id The id of the chart.
293 */
294 private function _renderChartBox( $placeholder_id, $chart_id, $with_filter = false ) {
295 $settings = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS );
296 $title = '#' . $chart_id;
297 if ( ! empty( $settings[0]['title'] ) ) {
298 $title = $settings[0]['title'];
299 }
300 // for ChartJS, title is an array.
301 if ( is_array( $title ) && isset( $title['text'] ) ) {
302 $title = $title['text'];
303 }
304 if ( ! empty( $settings[0]['backend-title'] ) ) {
305 $title = $settings[0]['backend-title'];
306 }
307 if ( empty( $title ) ) {
308 $title = '#' . $chart_id;
309 }
310
311 $ajax_url = admin_url( 'admin-ajax.php' );
312 $delete_url = esc_url(
313 add_query_arg(
314 array(
315 'action' => Visualizer_Plugin::ACTION_DELETE_CHART,
316 'nonce' => wp_create_nonce(),
317 'chart' => $chart_id,
318 ),
319 $ajax_url
320 )
321 );
322 $clone_url = esc_url(
323 add_query_arg(
324 array(
325 'action' => Visualizer_Plugin::ACTION_CLONE_CHART,
326 'nonce' => wp_create_nonce( Visualizer_Plugin::ACTION_CLONE_CHART ),
327 'chart' => $chart_id,
328 'type' => $this->type,
329 ),
330 $ajax_url
331 )
332 );
333 $export_link = esc_url(
334 add_query_arg(
335 array(
336 'action' => Visualizer_Plugin::ACTION_EXPORT_DATA,
337 'chart' => $chart_id,
338 'security' => wp_create_nonce( Visualizer_Plugin::ACTION_EXPORT_DATA . Visualizer_Plugin::VERSION ),
339 ),
340 admin_url( 'admin-ajax.php' )
341 )
342 );
343 $chart_type = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true );
344
345 $types = ['area', 'geo', 'column', 'bubble', 'scatter', 'gauge', 'candlestick', 'timeline', 'combo', 'polarArea', 'radar' ];
346
347 $pro_class = '';
348
349 if ( ! empty( $chart_type ) && in_array( $chart_type, $types, true ) ) {
350 $pro_class = 'viz-is-pro-chart';
351 }
352
353 $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!' );
354 if ( ! empty( $chart_status['error'] ) ) {
355 $chart_status['icon'] = 'error dashicons-dismiss';
356 $chart_status['title'] = __( 'Click to view the error', 'visualizer' );
357 }
358 $shortcode = sprintf( '[visualizer id="%s" class=""]', $chart_id );
359 echo '<div class="items"><div class="visualizer-chart"><div class="visualizer-chart-title">', esc_html( $title ), '</div>';
360 if ( Visualizer_Module::is_pro() && $with_filter ) {
361 echo '<div id="chart_wrapper_' . $placeholder_id . '">';
362 echo '<div id="control_wrapper_' . $placeholder_id . '" class="vz-library-chart-filter"></div>';
363 }
364 echo '<div id="', $placeholder_id, '" class="visualizer-chart-canvas">';
365 echo '<img src="', VISUALIZER_ABSURL, 'images/ajax-loader.gif" class="loader">';
366 echo '</div>';
367 if ( Visualizer_Module::is_pro() && $with_filter ) {
368 echo '</div>';
369 }
370 echo '<div class="visualizer-chart-footer visualizer-clearfix">';
371 echo '<div class="visualizer-action-group">';
372 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>';
373 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>';
374 if ( $this->can_chart_have_action( 'image', $chart_id ) ) {
375 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>';
376 }
377 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>';
378 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>';
379 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>';
380 echo '</div>';
381 do_action( 'visualizer_chart_languages', $chart_id );
382 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>';
383 echo '</div>';
384 echo '</div></div>';
385 }
386
387 /**
388 * Render 2-col sidebar
389 */
390 private function _renderSidebar() {
391 if ( ! Visualizer_Module::is_pro() ) {
392 echo '<div class="items">';
393 echo '<div class="viz-pro">';
394 echo '<div id="visualizer-sidebar" class="one-columns">';
395 echo '<div class="visualizer-sidebar-box">';
396 echo '<h3>' . __( 'Discover the power of PRO!', 'visualizer' ) . '</h3><ul>';
397 if ( Visualizer_Module_Admin::proFeaturesLocked() ) {
398 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( '6 more chart types', 'visualizer' );
399 } else {
400 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( '11 more chart types', 'visualizer' ) . '</li>';
401 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Manual Data Editor', 'visualizer' ) . '</li>';
402 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'ChartJS Charts', 'visualizer' ) . '</li>';
403 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Table Google chart', 'visualizer' ) . '</li>';
404 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Frontend Actions(Print, Export, Copy, Download)', 'visualizer' ) . '</li>';
405 }
406 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Spreadsheet like editor', 'visualizer' ) . '</li>';
407 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Import from other charts', 'visualizer' ) . '</li>';
408 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Use database query to create charts', 'visualizer' ) . '</li>';
409 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Create charts from WordPress tables', 'visualizer' ) . '</li>';
410 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Frontend editor', 'visualizer' ) . '</li>';
411 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Private charts', 'visualizer' ) . '</li>';
412 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'WPML support for translating charts', 'visualizer' ) . '</li>';
413 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Integration with Woocommerce Data endpoints', 'visualizer' ) . '</li>';
414 echo '<li><svg class="icon list-icon"><use xlink:href="#list-icon"></use></svg>' . __( 'Auto-sync with online files', 'visualizer' ) . '</li></ul>';
415 echo '<p><a href="' . tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'sidebarupsell' ) . '" target="_blank" class="button button-primary">' . __( 'View more features', 'visualizer' ) . '</a></p>';
416 echo '</div>';
417 echo '</div>';
418 echo '</div>';
419 echo '</div>';
420 }
421 }
422
423 }
424