PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.4.6
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.4.6
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.4.6, at classes/Visualizer/Render/Sidebar.php

514 lines 17.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 self::_renderGroupStart( esc_html__( 'Frontend Actions', 'visualizer' ) );
155 self::_renderSectionStart();
156 self::_renderSectionDescription( esc_html__( 'Configure frontend actions that need to be shown.', 'visualizer' ) );
157 self::_renderSectionEnd();
158
159 $this->_renderActionSettings();
160 self::_renderGroupEnd();
161
162 self::_renderGroupStart( esc_html__( 'Manual Configuration', 'visualizer' ) );
163 $this->_renderManualConfigDescription();
164 self::_renderTextAreaItem(
165 esc_html__( 'Configuration', 'visualizer' ),
166 'manual',
167 $this->manual,
168 sprintf(
169 esc_html__( 'One per line in valid JSON (key:value) format e.g. %s', 'visualizer' ),
170 '<br><code>' . $this->_renderManualConfigExample() . '</code>'
171 ),
172 '',
173 array( 'rows' => 5 )
174 );
175
176 self::_renderSectionEnd();
177 self::_renderGroupEnd();
178
179 }
180
181 /**
182 * Renders chart action buttons group.
183 *
184 * @access protected
185 */
186 protected function _renderActionSettings() {
187 global $wp_version;
188 $disable_actions = version_compare( $wp_version, '4.7.0', '<' );
189 // default open this section when not testing through cypress because cypress expects to click and open each section
190 // and may not like finding a section is already open.
191 self::_renderSectionStart( esc_html__( 'Actions', 'visualizer' ), ! defined( 'TI_CYPRESS_TESTING' ) );
192 self::_renderCheckboxItem(
193 esc_html__( 'Print', 'visualizer' ),
194 'actions[]',
195 isset( $this->actions ) && in_array( 'print', $this->actions, true ) ? true : false,
196 'print',
197 $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' ),
198 $disable_actions
199 );
200 self::_renderCheckboxItem(
201 esc_html__( 'CSV', 'visualizer' ),
202 'actions[]',
203 isset( $this->actions ) && in_array( 'csv;application/csv', $this->actions, true ) ? true : false,
204 'csv;application/csv',
205 $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' ),
206 $disable_actions
207 );
208
209 $disabled = ! self::is_excel_enabled();
210 self::_renderCheckboxItem(
211 esc_html__( 'Excel', 'visualizer' ),
212 'actions[]',
213 isset( $this->actions ) && in_array( 'xls;application/vnd.ms-excel', $this->actions, true ) ? true : false,
214 'xls;application/vnd.ms-excel',
215 $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' ) ),
216 $disable_actions || $disabled
217 );
218 self::_renderCheckboxItem(
219 esc_html__( 'Copy', 'visualizer' ),
220 'actions[]',
221 isset( $this->actions ) && in_array( 'copy', $this->actions, true ) ? true : false,
222 'copy',
223 $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' ),
224 $disable_actions
225 );
226
227 // not all charts support downloading as an image.
228 $disabled = ! $this->can_chart_have_action( 'image' );
229 self::_renderCheckboxItem(
230 esc_html__( 'Download Image', 'visualizer' ),
231 'actions[]',
232 isset( $this->actions ) && in_array( 'image', $this->actions, true ) ? true : false,
233 'image',
234 $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' ) ),
235 $disable_actions || $disabled
236 );
237 self::_renderSectionEnd();
238 }
239
240 /**
241 * Checks if the Excel module can be enabled.
242 */
243 private static function is_excel_enabled() {
244 $vendor_file = VISUALIZER_ABSPATH . '/vendor/autoload.php';
245 if ( is_readable( $vendor_file ) ) {
246 include_once( $vendor_file );
247 }
248
249 if ( version_compare( phpversion(), '5.6.0', '<' ) ) {
250 do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'PHP version %s not supported', phpversion() ), 'error', __FILE__, __LINE__ );
251 return false;
252 }
253
254 return class_exists( 'PhpOffice\PhpSpreadsheet\Spreadsheet' ) && extension_loaded( 'zip' ) && extension_loaded( 'xml' ) && extension_loaded( 'fileinfo' );
255 }
256
257 /**
258 * Renders select item.
259 *
260 * @since 1.0.0
261 *
262 * @static
263 * @access public
264 * @param string $title The title of the select item.
265 * @param string $name The name of the select item.
266 * @param string $value The actual value of the select item.
267 * @param array $options The array of select options.
268 * @param string $desc The description of the select item.
269 * @param bool $multiple Is this a multiple select box.
270 * @param array $classes Any additional classes.
271 * @param array $attributes Custom attributes.
272 */
273 public static function _renderSelectItem( $title, $name, $value, array $options, $desc, $multiple = false, $classes = array(), $attributes = array() ) {
274 $atts = '';
275 if ( $attributes ) {
276 foreach ( $attributes as $k => $v ) {
277 $atts .= ' data-visualizer-' . $k . '=' . esc_attr( $v );
278 }
279 }
280 echo '<div class="viz-section-item">';
281 echo '<a class="more-info" href="javascript:;">[?]</a>';
282 echo '<b>', $title, '</b>';
283 echo '<select class="control-select ', implode( ' ', $classes ) , '" name="', $name, '" ', ( $multiple ? 'multiple' : '' ), ' ' , $atts, '>';
284 foreach ( $options as $key => $label ) {
285 // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
286 $extra = $multiple && is_array( $value ) ? ( in_array( $key, $value ) ? 'selected' : '' ) : selected( $key, $value, false );
287 echo '<option value="', $key, '"', $extra, '>';
288 echo $label;
289 echo '</option>';
290 }
291 echo '</select>';
292 echo '<p class="viz-section-description">', $desc, '</p>';
293 echo '</div>';
294 }
295
296 /**
297 * Renders color picker item.
298 *
299 * @since 1.0.0
300 *
301 * @static
302 * @access protected
303 * @param string $title The title of the select item.
304 * @param string $name The name of the select item.
305 * @param string $value The actual value of the select item.
306 * @param string $default The default value of the color picker.
307 */
308 protected static function _renderColorPickerItem( $title, $name, $value, $default ) {
309 echo '<div class="viz-section-item">';
310 echo '<b>', $title, '</b>';
311 echo '<div>';
312 echo '<input type="text" class="color-picker-hex color-picker" data-alpha="true" name="', $name, '" maxlength="7" placeholder="', esc_attr__( 'Hex Value', 'visualizer' ), '" value="', is_null( $value ) ? $default : esc_attr( $value ), '" data-default-color="', $default, '">';
313 echo '</div>';
314 echo '</div>';
315 }
316
317 /**
318 * Renders text item.
319 *
320 * @since 1.0.0
321 *
322 * @static
323 * @access protected
324 * @param string $title The title of the select item.
325 * @param string $name The name of the select item.
326 * @param string $value The actual value of the select item.
327 * @param string $desc The description of the select item.
328 * @param string $placeholder The placeholder for the input.
329 * @param string $type The type for the input (out of number, email, tel etc., default is text).
330 * @param array $custom_attributes The custom attributes.
331 */
332 protected static function _renderTextItem( $title, $name, $value, $desc, $placeholder = '', $type = 'text', $custom_attributes = array() ) {
333 $attributes = '';
334 if ( $custom_attributes ) {
335 foreach ( $custom_attributes as $k => $v ) {
336 $attributes .= ' ' . $k . '="' . esc_attr( $v ) . '"';
337 }
338 }
339 echo '<div class="viz-section-item">';
340 echo '<a class="more-info" href="javascript:;">[?]</a>';
341 echo '<b>', $title, '</b>';
342 echo '<input type="', $type, '" class="control-text" ', $attributes, ' name="', $name, '" value="', esc_attr( $value ), '" placeholder="', $placeholder, '">';
343 echo '<p class="viz-section-description">', $desc, '</p>';
344 echo '</div>';
345 }
346
347 /**
348 * Renders the beginning of a group.
349 *
350 * @since 1.0.0
351 *
352 * @static
353 * @access public
354 * @param string $title The title of this group.
355 * @param string $html Any additional HTML.
356 * @param string $class Any additional classes.
357 */
358 public static function _renderGroupStart( $title, $html = '', $class = '', $id = '' ) {
359 echo '<li id="' . $id . '" class="viz-group ' . $class . '">';
360 echo '<h3 class="viz-group-title">', $title, '</h3>';
361 echo $html;
362 echo '<ul class="viz-group-content">';
363 }
364
365 /**
366 * Renders the ending of a group.
367 *
368 * @since 1.0.0
369 *
370 * @static
371 * @access public
372 */
373 public static function _renderGroupEnd() {
374 echo '</ul>';
375 echo '</li>';
376 }
377
378 /**
379 * Renders the beginning of a section.
380 *
381 * @since 1.0.0
382 *
383 * @static
384 * @access public
385 * @param string $title The title of this section. If the title is empty, no title will be displayed.
386 * @param boolean $open Determines whether the section items block has to be expanded or collapsed.
387 */
388 public static function _renderSectionStart( $title = false, $open = true ) {
389
390 if ( ! empty( $title ) ) {
391 echo '<li class="viz-subsection">';
392 echo '<span class="viz-section-title">', $title, '</span>';
393 } else {
394 echo '<li class=" ">';
395 }
396 echo '<div class="viz-section-items section-items', $open ? ' open' : '', '">';
397 }
398
399 /**
400 * Renders the ending of a section.
401 *
402 * @since 1.0.0
403 *
404 * @public
405 * @access protected
406 * @param string $html Any addition HTML to add.
407 */
408 public static function _renderSectionEnd( $html = '' ) {
409 echo '</div>';
410 echo $html;
411 echo '</li>';
412 }
413
414 /**
415 * Renders section description block.
416 *
417 * @since 1.0.0
418 *
419 * @static
420 * @access public
421 * @param string $description The description text.
422 */
423 public static function _renderSectionDescription( $description, $classes = '' ) {
424 echo '<div class="viz-section-item">';
425 echo '<div class="viz-section-description ' . $classes . '">', $description, '</div>';
426 echo '</div>';
427 }
428
429 /**
430 * Renders format field according to series type.
431 *
432 * @since 1.3.0
433 *
434 * @access protected
435 * @param int $index The index of the series.
436 */
437 protected function _renderFormatField( $index = 0 ) {
438 switch ( $this->__series[ $index + 1 ]['type'] ) {
439 case 'number':
440 self::_renderTextItem(
441 esc_html__( 'Number Format', 'visualizer' ),
442 'series[' . $index . '][format]',
443 isset( $this->series[ $index ]['format'] ) ? $this->series[ $index ]['format'] : '',
444 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>' ),
445 '#,###.##'
446 );
447 break;
448 case 'date':
449 case 'datetime':
450 case 'timeofday':
451 self::_renderTextItem(
452 esc_html__( 'Date Format', 'visualizer' ),
453 'series[' . $index . '][format]',
454 isset( $this->series[ $index ]['format'] ) ? $this->series[ $index ]['format'] : '',
455 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>' ),
456 'eeee, dd LLLL yyyy'
457 );
458 break;
459 }
460 }
461
462 /**
463 * Render a checkbox item
464 */
465 protected static function _renderCheckboxItem( $title, $name, $value, $default, $desc, $disabled = false ) {
466 echo '<div class="viz-section-item">';
467 echo '<a class="more-info" href="javascript:;">[?]</a>';
468 echo '<b>', $title, '</b>';
469 // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
470 echo '<input type="checkbox" class="control-check" value="', $default, '" name="', $name, '" ', ( $value == $default ? 'checked' : '' ), ' ', ( $disabled ? 'disabled=disabled' : '' ), '>';
471 echo '<p class="viz-section-description">', $desc, '</p>';
472 echo '</div>';
473 }
474
475 /**
476 * Render a textarea item.
477 */
478 protected static function _renderTextAreaItem( $title, $name, $value, $desc, $placeholder = '', $custom_attributes = array() ) {
479 $attributes = '';
480 if ( $custom_attributes ) {
481 foreach ( $custom_attributes as $k => $v ) {
482 $attributes .= ' ' . $k . '="' . esc_attr( $v ) . '"';
483 }
484 }
485 echo '<div class="viz-section-item">';
486 echo '<a class="more-info" href="javascript:;">[?]</a>';
487 echo '<b>', $title, '</b>';
488 echo '<textarea class="control-text" ', $attributes, ' name="', $name, '" placeholder="', $placeholder, '">', $value, '</textarea>';
489 echo '<p class="viz-section-description">', $desc, '</p>';
490 echo '</div>';
491 }
492
493 /**
494 * Returns the library this chart implements.
495 */
496 public function getLibrary() {
497 return $this->_library;
498 }
499
500 /**
501 * Loads generic libraries conditionally.
502 */
503 protected function load_dependent_assets( $libs ) {
504 if ( in_array( 'moment', $libs, true ) && ! wp_script_is( 'moment', 'registered' ) ) {
505 wp_register_script( 'moment' );
506 }
507
508 if ( in_array( 'numeral', $libs, true ) && ! wp_script_is( 'numeral', 'registered' ) ) {
509 wp_register_script( 'numeral', VISUALIZER_ABSURL . 'js/lib/numeral.min.js', array(), Visualizer_Plugin::VERSION );
510 }
511
512 }
513 }
514