PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.7.5
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.7.5
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 / Sidebar.php

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

564 lines 19.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // +----------------------------------------------------------------------+
4 // | Copyright 2013 Madpixels (email : visualizer@madpixels.net) |
5 // +----------------------------------------------------------------------+
6 // | This program is free software; you can redistribute it and/or modify |
7 // | it under the terms of the GNU General Public License, version 2, as |
8 // | published by the Free Software Foundation. |
9 // | |
10 // | This program is distributed in the hope that it will be useful, |
11 // | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 // | GNU General Public License for more details. |
14 // | |
15 // | You should have received a copy of the GNU General Public License |
16 // | along with this program; if not, write to the Free Software |
17 // | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, |
18 // | MA 02110-1301 USA |
19 // +----------------------------------------------------------------------+
20 // | Author: Eugene Manuilov <eugene@manuilov.org> |
21 // +----------------------------------------------------------------------+
22 /**
23 * Base class for all chart sidebar groups.
24 *
25 * @category Visualizer
26 * @package Render
27 *
28 * @since 1.0.0
29 * @abstract
30 */
31 abstract class Visualizer_Render_Sidebar extends Visualizer_Render {
32
33 /**
34 * The array of font families accepted by visualization API.
35 *
36 * @since 1.0.0
37 *
38 * @static
39 * @access protected
40 * @var array
41 */
42 protected static $_fontFamilies = array(
43 'Arial' => 'Arial',
44 'Sans Serif' => 'Sans Serif',
45 'serif' => 'Serif',
46 'Arial black' => 'Wide',
47 'Arial Narrow' => 'Narrow',
48 'Comic Sans MS' => 'Comic Sans MS',
49 'Courier New' => 'Courier New',
50 'Garamond' => 'Garamond',
51 'Georgia' => 'Georgia',
52 'Tahoma' => 'Tahoma',
53 'Verdana' => 'Verdana',
54 );
55
56 /**
57 * The Yes/No array.
58 *
59 * @since 1.0.0
60 *
61 * @access protected
62 * @var array
63 */
64 protected $_yesno;
65
66 /**
67 * Whether this chart supports animation or not.
68 *
69 * @access protected
70 * @var bool
71 */
72 protected $_supportsAnimation = true;
73
74 /**
75 * Which library does this this chart implement?
76 *
77 * @access protected
78 * @var string
79 */
80 protected $_library = null;
81
82 /**
83 * Constructor.
84 *
85 * @since 1.0.0
86 *
87 * @access public
88 * @param array $data The data what has to be associated with this render.
89 */
90 public function __construct( $data = array() ) {
91 parent::__construct( $data );
92
93 $this->_yesno = array(
94 '' => '',
95 '1' => esc_html__( 'Yes', 'visualizer' ),
96 '0' => esc_html__( 'No', 'visualizer' ),
97 );
98
99 $this->hooks();
100 }
101
102 /**
103 * Renders chart title settings.
104 *
105 * @since 1.0.0
106 *
107 * @access protected
108 */
109 protected function _renderChartTitleSettings() {
110 self::_renderTextItem(
111 esc_html__( 'Chart Title', 'visualizer' ),
112 'title',
113 $this->title,
114 esc_html__( 'Text to display above the chart.', 'visualizer' )
115 );
116
117 self::_renderColorPickerItem(
118 esc_html__( 'Chart Title Color', 'visualizer' ),
119 'titleTextStyle[color]',
120 isset( $this->titleTextStyle['color'] ) ? $this->titleTextStyle['color'] : null,
121 '#000'
122 );
123 }
124
125 /**
126 * Add the correct description for the manual configuration box.
127 */
128 protected function _renderManualConfigDescription() {
129 self::_renderSectionStart();
130 self::_renderSectionDescription( '<span class="viz-gvlink">' . sprintf( __( 'Configure the graph by providing configuration variables right from the %1$sGoogle Visualization API%2$s. You can refer to to some examples %3$shere%4$s.', 'visualizer' ), '<a href="https://developers.google.com/chart/interactive/docs/gallery/?#configuration-options" target="_blank">', '</a>', '<a href="https://docs.themeisle.com/article/728-manual-configuration" target="_blank">', '</a>' ) . '</span>' );
131 }
132
133 /**
134 * Add the correct example for the manual configuration box.
135 */
136 protected function _renderManualConfigExample() {
137 return '{
138 "vAxis": {
139 "ticks": [5, 10, 15, 20],
140 "titleTextStyle": {
141 "color": "red"
142 },
143 "textPosition": "in"
144 }
145 }';
146 }
147
148 /**
149 * Renders chart advanced settings group.
150 *
151 * @access protected
152 */
153 protected function _renderAdvancedSettings() {
154 if ( Visualizer_Module_Admin::proFeaturesLocked() ) {
155 self::_renderGroupStart( esc_html__( 'Frontend Actions', 'visualizer' ) );
156 } else {
157 self::_renderGroupStart( esc_html__( 'Frontend Actions', 'visualizer' ) . '<span class="dashicons dashicons-lock"></span>', '', apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'chart-frontend-actions' ), 'vz-frontend-actions' );
158 echo '<div style="position: relative">';
159 }
160 self::_renderSectionStart();
161 self::_renderSectionDescription( esc_html__( 'Configure frontend actions that need to be shown.', 'visualizer' ) );
162 self::_renderSectionEnd();
163
164 $this->_renderActionSettings();
165 if ( ! Visualizer_Module_Admin::proFeaturesLocked() ) {
166 echo apply_filters( 'visualizer_pro_upsell', '', 'chart-permissions' );
167 echo '</div>';
168 }
169 self::_renderGroupEnd();
170
171 self::_renderGroupStart( esc_html__( 'Manual Configuration', 'visualizer' ) );
172 $this->_renderManualConfigDescription();
173 self::_renderTextAreaItem(
174 esc_html__( 'Configuration', 'visualizer' ),
175 'manual',
176 $this->manual,
177 sprintf(
178 esc_html__( 'One per line in valid JSON (key:value) format e.g. %s', 'visualizer' ),
179 '<br><code>' . $this->_renderManualConfigExample() . '</code>'
180 ),
181 '',
182 array( 'rows' => 5 )
183 );
184
185 self::_renderSectionEnd();
186 self::_renderGroupEnd();
187
188 }
189
190 /**
191 * Renders chart action buttons group.
192 *
193 * @access protected
194 */
195 protected function _renderActionSettings() {
196 global $wp_version;
197 $disable_actions = version_compare( $wp_version, '4.7.0', '<' );
198 // default open this section when not testing through cypress because cypress expects to click and open each section
199 // and may not like finding a section is already open.
200 self::_renderSectionStart( esc_html__( 'Actions', 'visualizer' ), ! defined( 'TI_CYPRESS_TESTING' ) );
201 self::_renderCheckboxItem(
202 esc_html__( 'Print', 'visualizer' ),
203 'actions[]',
204 isset( $this->actions ) && in_array( 'print', $this->actions, true ) ? true : false,
205 'print',
206 $disable_actions ? '<span class="viz-section-error">' . esc_html__( 'Upgrade to at least WordPress 4.7 to use this.', 'visualizer' ) . '</span>' : esc_html__( 'To enable printing the chart/data.', 'visualizer' ),
207 $disable_actions
208 );
209 self::_renderCheckboxItem(
210 esc_html__( 'CSV', 'visualizer' ),
211 'actions[]',
212 isset( $this->actions ) && in_array( 'csv;application/csv', $this->actions, true ) ? true : false,
213 'csv;application/csv',
214 $disable_actions ? '<span class="viz-section-error">' . esc_html__( 'Upgrade to at least WordPress 4.7 to use this.', 'visualizer' ) . '</span>' : esc_html__( 'To enable downloading the data as a CSV.', 'visualizer' ),
215 $disable_actions
216 );
217
218 $disabled = ! self::is_excel_enabled();
219 self::_renderCheckboxItem(
220 esc_html__( 'Excel', 'visualizer' ),
221 'actions[]',
222 isset( $this->actions ) && in_array( 'xls;application/vnd.ms-excel', $this->actions, true ) ? true : false,
223 'xls;application/vnd.ms-excel',
224 $disable_actions ? '<span class="viz-section-error">' . esc_html__( 'Upgrade to at least WordPress 4.7 to use this.', 'visualizer' ) . '</span>' : ( $disabled ? '<span class="viz-section-error">' . esc_html__( 'Enable the ZIP and XML extensions to use this setting.', 'visualizer' ) . '</span>' : esc_html__( 'To enable downloading the data as an Excel spreadsheet.', 'visualizer' ) ),
225 $disable_actions || $disabled
226 );
227 self::_renderCheckboxItem(
228 esc_html__( 'Copy', 'visualizer' ),
229 'actions[]',
230 isset( $this->actions ) && in_array( 'copy', $this->actions, true ) ? true : false,
231 'copy',
232 $disable_actions ? '<span class="viz-section-error">' . esc_html__( 'Upgrade to at least WordPress 4.7 to use this.', 'visualizer' ) . '</span>' : esc_html__( 'To enable copying the data to the clipboard.', 'visualizer' ),
233 $disable_actions
234 );
235
236 // not all charts support downloading as an image.
237 $disabled = ! $this->can_chart_have_action( 'image' );
238 self::_renderCheckboxItem(
239 esc_html__( 'Download Image', 'visualizer' ),
240 'actions[]',
241 isset( $this->actions ) && in_array( 'image', $this->actions, true ) ? true : false,
242 'image',
243 $disable_actions ? '<span class="viz-section-error">' . esc_html__( 'Upgrade to at least WordPress 4.7 to use this.', 'visualizer' ) . '</span>' : ( $disabled ? '<span class="viz-section-error">' . esc_html__( 'Not supported for this chart type.', 'visualizer' ) . '</span>' : esc_html__( 'To download the chart as an image.', 'visualizer' ) ),
244 $disable_actions || $disabled
245 );
246 self::_renderSectionEnd();
247 }
248
249 /**
250 * Checks if the Excel module can be enabled.
251 */
252 private static function is_excel_enabled() {
253 $vendor_file = VISUALIZER_ABSPATH . '/vendor/autoload.php';
254 if ( is_readable( $vendor_file ) ) {
255 include_once( $vendor_file );
256 }
257
258 if ( version_compare( phpversion(), '5.6.0', '<' ) ) {
259 do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'PHP version %s not supported', phpversion() ), 'error', __FILE__, __LINE__ );
260 return false;
261 }
262
263 return class_exists( 'PhpOffice\PhpSpreadsheet\Spreadsheet' ) && extension_loaded( 'zip' ) && extension_loaded( 'xml' ) && extension_loaded( 'fileinfo' );
264 }
265
266 /**
267 * Renders select item.
268 *
269 * @since 1.0.0
270 *
271 * @static
272 * @access public
273 * @param string $title The title of the select item.
274 * @param string $name The name of the select item.
275 * @param string $value The actual value of the select item.
276 * @param array $options The array of select options.
277 * @param string $desc The description of the select item.
278 * @param bool $multiple Is this a multiple select box.
279 * @param array $classes Any additional classes.
280 * @param array $attributes Custom attributes.
281 */
282 public static function _renderSelectItem( $title, $name, $value, array $options, $desc, $multiple = false, $classes = array(), $attributes = array() ) {
283 $atts = '';
284 if ( $attributes ) {
285 foreach ( $attributes as $k => $v ) {
286 $atts .= ' data-visualizer-' . $k . '=' . esc_attr( $v );
287 }
288 }
289 echo '<div class="viz-section-item">';
290 echo '<a class="more-info" href="javascript:;">[?]</a>';
291 echo '<b>', $title, '</b>';
292 echo '<select class="control-select ', implode( ' ', $classes ) , '" name="', $name, '" ', ( $multiple ? 'multiple' : '' ), ' ' , $atts, '>';
293 foreach ( $options as $key => $label ) {
294 // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
295 $extra = $multiple && is_array( $value ) ? ( in_array( $key, $value ) ? 'selected' : '' ) : selected( $key, $value, false );
296 echo '<option value="', $key, '"', $extra, '>';
297 echo $label;
298 echo '</option>';
299 }
300 echo '</select>';
301 echo '<p class="viz-section-description">', $desc, '</p>';
302 echo '</div>';
303 }
304
305 /**
306 * Renders color picker item.
307 *
308 * @since 1.0.0
309 *
310 * @static
311 * @access protected
312 * @param string $title The title of the select item.
313 * @param string $name The name of the select item.
314 * @param string $value The actual value of the select item.
315 * @param string $default The default value of the color picker.
316 */
317 protected static function _renderColorPickerItem( $title, $name, $value, $default ) {
318 echo '<div class="viz-section-item">';
319 echo '<b>', $title, '</b>';
320 echo '<div>';
321 echo '<input type="text" class="color-picker-hex color-picker" data-alpha-enabled="true" name="', $name, '" maxlength="7" placeholder="', esc_attr__( 'Hex Value', 'visualizer' ), '" value="', is_null( $value ) ? $default : esc_attr( $value ), '" data-default-color="', $default, '">';
322 echo '</div>';
323 echo '</div>';
324 }
325
326 /**
327 * Renders text item.
328 *
329 * @since 1.0.0
330 *
331 * @static
332 * @access protected
333 * @param string $title The title of the select item.
334 * @param string $name The name of the select item.
335 * @param string $value The actual value of the select item.
336 * @param string $desc The description of the select item.
337 * @param string $placeholder The placeholder for the input.
338 * @param string $type The type for the input (out of number, email, tel etc., default is text).
339 * @param array $custom_attributes The custom attributes.
340 */
341 protected static function _renderTextItem( $title, $name, $value, $desc, $placeholder = '', $type = 'text', $custom_attributes = array() ) {
342 $attributes = '';
343 if ( $custom_attributes ) {
344 foreach ( $custom_attributes as $k => $v ) {
345 $attributes .= ' ' . $k . '="' . esc_attr( $v ) . '"';
346 }
347 }
348 echo '<div class="viz-section-item">';
349 echo '<a class="more-info" href="javascript:;">[?]</a>';
350 echo '<b>', $title, '</b>';
351 echo '<input type="', $type, '" class="control-text" ', $attributes, ' name="', $name, '" value="', esc_attr( $value ), '" placeholder="', $placeholder, '">';
352 echo '<p class="viz-section-description">', $desc, '</p>';
353 echo '</div>';
354 }
355
356 /**
357 * Renders the beginning of a group.
358 *
359 * @since 1.0.0
360 *
361 * @static
362 * @access public
363 * @param string $title The title of this group.
364 * @param string $html Any additional HTML.
365 * @param string $class Any additional classes.
366 */
367 public static function _renderGroupStart( $title, $html = '', $class = '', $id = '' ) {
368 echo '<li id="' . $id . '" class="viz-group ' . $class . '">';
369 echo '<h3 class="viz-group-title">', $title, '</h3>';
370 echo $html;
371 echo '<ul class="viz-group-content">';
372 }
373
374 /**
375 * Renders the ending of a group.
376 *
377 * @since 1.0.0
378 *
379 * @static
380 * @access public
381 */
382 public static function _renderGroupEnd() {
383 echo '</ul>';
384 echo '</li>';
385 }
386
387 /**
388 * Renders the beginning of a section.
389 *
390 * @since 1.0.0
391 *
392 * @static
393 * @access public
394 * @param string $title The title of this section. If the title is empty, no title will be displayed.
395 * @param boolean $open Determines whether the section items block has to be expanded or collapsed.
396 */
397 public static function _renderSectionStart( $title = false, $open = true ) {
398
399 if ( ! empty( $title ) ) {
400 echo '<li class="viz-subsection">';
401 echo '<span class="viz-section-title">', $title, '</span>';
402 } else {
403 echo '<li class=" ">';
404 }
405 echo '<div class="viz-section-items section-items', $open ? ' open' : '', '">';
406 }
407
408 /**
409 * Renders the ending of a section.
410 *
411 * @since 1.0.0
412 *
413 * @public
414 * @access protected
415 * @param string $html Any addition HTML to add.
416 */
417 public static function _renderSectionEnd( $html = '' ) {
418 echo '</div>';
419 echo $html;
420 echo '</li>';
421 }
422
423 /**
424 * Renders section description block.
425 *
426 * @since 1.0.0
427 *
428 * @static
429 * @access public
430 * @param string $description The description text.
431 */
432 public static function _renderSectionDescription( $description, $classes = '' ) {
433 echo '<div class="viz-section-item">';
434 echo '<div class="viz-section-description ' . $classes . '">', $description, '</div>';
435 echo '</div>';
436 }
437
438 /**
439 * Renders format field according to series type.
440 *
441 * @since 1.3.0
442 *
443 * @access protected
444 * @param int $index The index of the series.
445 */
446 protected function _renderFormatField( $index = 0 ) {
447 switch ( $this->__series[ $index + 1 ]['type'] ) {
448 case 'number':
449 self::_renderTextItem(
450 esc_html__( 'Number Format', 'visualizer' ),
451 'series[' . $index . '][format]',
452 isset( $this->series[ $index ]['format'] ) ? $this->series[ $index ]['format'] : '',
453 sprintf( esc_html__( 'Enter custom format pattern to apply to this series value, similar to the %1$sICU pattern set%2$s. Use something like #,### to get 1,234 as output, or $# to add dollar sign before digits. Pay attention that if you use &#37; percentage format then your values will be multiplied by 100.', 'visualizer' ), '<a href="http://icu-project.org/apiref/icu4c/classDecimalFormat.html#_details" target="_blank">', '</a>' ),
454 '#,###.##'
455 );
456 break;
457 case 'date':
458 case 'datetime':
459 case 'timeofday':
460 self::_renderTextItem(
461 esc_html__( 'Date Format', 'visualizer' ),
462 'series[' . $index . '][format]',
463 isset( $this->series[ $index ]['format'] ) ? $this->series[ $index ]['format'] : '',
464 sprintf( esc_html__( 'Enter custom format pattern to apply to this series value, similar to the %1$sICU date and time format%2$s.', 'visualizer' ), '<a href="http://userguide.icu-project.org/formatparse/datetime#TOC-Date-Time-Format-Syntax" target="_blank">', '</a>' ),
465 'eeee, dd LLLL yyyy'
466 );
467 break;
468 }
469 }
470
471 /**
472 * Render a checkbox item
473 */
474 protected static function _renderCheckboxItem( $title, $name, $value, $default, $desc, $disabled = false ) {
475 echo '<div class="viz-section-item">';
476 echo '<a class="more-info" href="javascript:;">[?]</a>';
477 echo '<b>', $title, '</b>';
478 // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
479 echo '<input type="checkbox" class="control-check" value="', $default, '" name="', $name, '" ', ( $value == $default ? 'checked' : '' ), ' ', ( $disabled ? 'disabled=disabled' : '' ), '>';
480 echo '<p class="viz-section-description">', $desc, '</p>';
481 echo '</div>';
482 }
483
484 /**
485 * Render a textarea item.
486 */
487 protected static function _renderTextAreaItem( $title, $name, $value, $desc, $placeholder = '', $custom_attributes = array() ) {
488 $attributes = '';
489 if ( $custom_attributes ) {
490 foreach ( $custom_attributes as $k => $v ) {
491 $attributes .= ' ' . $k . '="' . esc_attr( $v ) . '"';
492 }
493 }
494 echo '<div class="viz-section-item">';
495 echo '<a class="more-info" href="javascript:;">[?]</a>';
496 echo '<b>', $title, '</b>';
497 echo '<textarea class="control-text" ', $attributes, ' name="', $name, '" placeholder="', $placeholder, '">', $value, '</textarea>';
498 echo '<p class="viz-section-description">', $desc, '</p>';
499 echo '</div>';
500 }
501
502 /**
503 * Returns the library this chart implements.
504 */
505 public function getLibrary() {
506 return $this->_library;
507 }
508
509 /**
510 * Loads generic libraries conditionally.
511 */
512 protected function load_dependent_assets( $libs ) {
513 if ( in_array( 'moment', $libs, true ) && ! wp_script_is( 'moment', 'registered' ) ) {
514 wp_register_script( 'moment' );
515 }
516
517 if ( in_array( 'numeral', $libs, true ) && ! wp_script_is( 'numeral', 'registered' ) ) {
518 wp_register_script( 'numeral', VISUALIZER_ABSURL . 'js/lib/numeral.min.js', array(), Visualizer_Plugin::VERSION );
519 }
520
521 }
522
523 /**
524 * Renders save chart as image setting group.
525 *
526 * @access protected
527 */
528 protected function _renderChartImageSettings() {
529 // Default enable if amp is active.
530 $is_amp = function_exists( 'amp_is_enabled' ) && amp_is_enabled();
531 $this->save_chart_image = null === $this->save_chart_image && $is_amp ? true : $this->save_chart_image;
532
533 $is_create_chart = true;
534 if ( filter_input( INPUT_GET, 'library', FILTER_VALIDATE_BOOLEAN ) ) {
535 if ( filter_input( INPUT_GET, 'action' ) === Visualizer_Plugin::ACTION_EDIT_CHART ) {
536 $is_create_chart = false;
537 }
538 }
539 $this->lazy_load_chart = null === $this->lazy_load_chart && $is_create_chart ? true : $this->lazy_load_chart;
540
541 self::_renderSectionStart( esc_html__( 'Save chart as an image inside Media Library', 'visualizer' ), false );
542 self::_renderCheckboxItem(
543 esc_html__( 'Save inside media library?', 'visualizer' ),
544 'save_chart_image',
545 $this->save_chart_image ? true : false,
546 'yes',
547 esc_html__( 'To enable save the image as an inside media library.', 'visualizer' ),
548 false
549 );
550 self::_renderSectionEnd();
551
552 self::_renderSectionStart( esc_html__( 'Lazy rendering of chart', 'visualizer' ), false );
553 self::_renderCheckboxItem(
554 esc_html__( 'Enable lazy rendering of chart?', 'visualizer' ),
555 'lazy_load_chart',
556 $this->lazy_load_chart ? true : false,
557 'yes',
558 esc_html__( 'To enable lazy chart rendering.', 'visualizer' ),
559 false
560 );
561 self::_renderSectionEnd();
562 }
563 }
564