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

814 lines 29.0 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 * The array of available legend positions.
68 *
69 * @since 1.0.0
70 *
71 * @access protected
72 * @var array
73 */
74 protected $_legendPositions;
75
76 /**
77 * The array of available alignments.
78 *
79 * @since 1.0.0
80 *
81 * @access protected
82 * @var array
83 */
84 protected $_alignments;
85
86 /**
87 * Whether this chart supports animation or not.
88 *
89 * @access protected
90 * @var bool
91 */
92 protected $_supportsAnimation = true;
93
94 /**
95 * Which library does this this chart implement?
96 *
97 * @access protected
98 * @var string
99 */
100 protected $_library = null;
101
102 /**
103 * Constructor.
104 *
105 * @since 1.0.0
106 *
107 * @access public
108 * @param array $data The data what has to be associated with this render.
109 */
110 public function __construct( $data = array() ) {
111 parent::__construct( $data );
112
113 $this->_legendPositions = array(
114 '' => '',
115 'left' => esc_html__( 'Left of the chart', 'visualizer' ),
116 'right' => esc_html__( 'Right of the chart', 'visualizer' ),
117 'top' => esc_html__( 'Above the chart', 'visualizer' ),
118 'bottom' => esc_html__( 'Below the chart', 'visualizer' ),
119 'in' => esc_html__( 'Inside the chart', 'visualizer' ),
120 'none' => esc_html__( 'Omit the legend', 'visualizer' ),
121 );
122
123 $this->_alignments = array(
124 '' => '',
125 'start' => esc_html__( 'Aligned to the start of the allocated area', 'visualizer' ),
126 'center' => esc_html__( 'Centered in the allocated area', 'visualizer' ),
127 'end' => esc_html__( 'Aligned to the end of the allocated area', 'visualizer' ),
128 );
129
130 $this->_yesno = array(
131 '' => '',
132 '1' => esc_html__( 'Yes', 'visualizer' ),
133 '0' => esc_html__( 'No', 'visualizer' ),
134 );
135
136 $this->hooks();
137 }
138
139 /**
140 * Renders chart title settings.
141 *
142 * @since 1.0.0
143 *
144 * @access protected
145 */
146 protected function _renderChartTitleSettings() {
147 self::_renderTextItem(
148 esc_html__( 'Chart Title', 'visualizer' ),
149 'title',
150 $this->title,
151 esc_html__( 'Text to display above the chart.', 'visualizer' )
152 );
153
154 self::_renderColorPickerItem(
155 esc_html__( 'Chart Title Color', 'visualizer' ),
156 'titleTextStyle[color]',
157 isset( $this->titleTextStyle['color'] ) ? $this->titleTextStyle['color'] : null,
158 '#000'
159 );
160 }
161
162 /**
163 * Add the correct description for the manual configuration box.
164 */
165 protected function _renderManualConfigDescription() {
166 self::_renderSectionStart();
167 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>' );
168 }
169
170 /**
171 * Add the correct example for the manual configuration box.
172 */
173 protected function _renderManualConfigExample() {
174 return '{
175 "vAxis": {
176 "ticks": [5, 10, 15, 20],
177 "titleTextStyle": {
178 "color": "red"
179 },
180 "textPosition": "in"
181 }
182 }';
183 }
184
185 /**
186 * Renders chart advanced settings group.
187 *
188 * @access protected
189 */
190 protected function _renderAdvancedSettings() {
191 self::_renderGroupStart( esc_html__( 'Frontend Actions', 'visualizer' ) );
192 self::_renderSectionStart();
193 self::_renderSectionDescription( esc_html__( 'Configure frontend actions that need to be shown.', 'visualizer' ) );
194 self::_renderSectionEnd();
195
196 $this->_renderActionSettings();
197 self::_renderGroupEnd();
198
199 self::_renderGroupStart( esc_html__( 'Manual Configuration', 'visualizer' ) );
200 $this->_renderManualConfigDescription();
201 self::_renderTextAreaItem(
202 esc_html__( 'Configuration', 'visualizer' ),
203 'manual',
204 $this->manual,
205 sprintf(
206 esc_html__( 'One per line in valid JSON (key:value) format e.g. %s', 'visualizer' ),
207 '<br><code>' . $this->_renderManualConfigExample() . '</code>'
208 ),
209 '',
210 array( 'rows' => 5 )
211 );
212
213 self::_renderSectionEnd();
214 self::_renderGroupEnd();
215
216 }
217
218 /**
219 * Renders chart action buttons group.
220 *
221 * @access protected
222 */
223 protected function _renderActionSettings() {
224 global $wp_version;
225 $disable_actions = version_compare( $wp_version, '4.7.0', '<' );
226 self::_renderSectionStart( esc_html__( 'Actions', 'visualizer' ), false );
227 self::_renderCheckboxItem(
228 esc_html__( 'Print', 'visualizer' ),
229 'actions[]',
230 isset( $this->actions ) && in_array( 'print', $this->actions, true ) ? true : false,
231 'print',
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 printing the chart/data.', 'visualizer' ),
233 $disable_actions
234 );
235 self::_renderCheckboxItem(
236 esc_html__( 'CSV', 'visualizer' ),
237 'actions[]',
238 isset( $this->actions ) && in_array( 'csv;application/csv', $this->actions, true ) ? true : false,
239 'csv;application/csv',
240 $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' ),
241 $disable_actions
242 );
243
244 $disabled = ! self::is_excel_enabled();
245 self::_renderCheckboxItem(
246 esc_html__( 'Excel', 'visualizer' ),
247 'actions[]',
248 isset( $this->actions ) && in_array( 'xls;application/vnd.ms-excel', $this->actions, true ) ? true : false,
249 'xls;application/vnd.ms-excel',
250 $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' ) ),
251 $disable_actions || $disabled
252 );
253 self::_renderCheckboxItem(
254 esc_html__( 'Copy', 'visualizer' ),
255 'actions[]',
256 isset( $this->actions ) && in_array( 'copy', $this->actions, true ) ? true : false,
257 'copy',
258 $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' ),
259 $disable_actions
260 );
261 self::_renderSectionEnd();
262 }
263
264 /**
265 * Checks if the Excel module can be enabled.
266 */
267 private static function is_excel_enabled() {
268 $vendor_file = VISUALIZER_ABSPATH . '/vendor/autoload.php';
269 if ( is_readable( $vendor_file ) ) {
270 include_once( $vendor_file );
271 }
272
273 if ( version_compare( phpversion(), '5.6.0', '<' ) ) {
274 do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'PHP version %s not supported', phpversion() ), 'error', __FILE__, __LINE__ );
275 return false;
276 }
277
278 return class_exists( 'PhpOffice\PhpSpreadsheet\Spreadsheet' ) && extension_loaded( 'zip' ) && extension_loaded( 'xml' ) && extension_loaded( 'fileinfo' );
279 }
280
281 /**
282 * Renders chart general settings group.
283 *
284 * @since 1.0.0
285 *
286 * @access protected
287 */
288 protected function _renderGeneralSettings() {
289 self::_renderGroupStart( esc_html__( 'General Settings', 'visualizer' ) );
290 self::_renderSectionStart();
291 self::_renderSectionDescription( esc_html__( 'Configure title, font styles, tooltip, legend and else settings for the chart.', 'visualizer' ) );
292 self::_renderSectionEnd();
293
294 self::_renderSectionStart( esc_html__( 'Title', 'visualizer' ), false );
295 $this->_renderChartTitleSettings();
296 self::_renderSectionEnd();
297
298 self::_renderSectionStart( esc_html__( 'Font Styles', 'visualizer' ), false );
299 echo '<div class="viz-section-item">';
300 echo '<a class="more-info" href="javascript:;">[?]</a>';
301 echo '<b>', esc_html__( 'Family And Size', 'visualizer' ), '</b>';
302
303 echo '<table class="viz-section-table" cellspacing="0" cellpadding="0" border="0">';
304 echo '<tr>';
305 echo '<td class="viz-section-table-column">';
306 echo '<select name="fontName" class="control-select">';
307 echo '<option></option>';
308 foreach ( self::$_fontFamilies as $font => $label ) {
309 echo '<option value="', $font, '"', selected( $font, $this->fontName, false ), '>';
310 echo $label;
311 echo '</option>';
312 }
313 echo '</select>';
314 echo '</td>';
315 echo '<td class="viz-section-table-column">';
316 echo '<select name="fontSize" class="control-select">';
317 echo '<option></option>';
318 for ( $i = 7; $i <= 20; $i++ ) {
319 echo '<option value="', $i, '"', selected( $i, $this->fontSize, false ), '>', $i, '</option>';
320 }
321 echo '</select>';
322 echo '</td>';
323 echo '</tr>';
324 echo '</table>';
325
326 echo '<p class="viz-section-description">';
327 esc_html_e( 'The default font family and size for all text in the chart.', 'visualizer' );
328 echo '</p>';
329 echo '</div>';
330 self::_renderSectionEnd();
331
332 self::_renderSectionStart( esc_html__( 'Legend', 'visualizer' ), false );
333 self::_renderSelectItem(
334 esc_html__( 'Position', 'visualizer' ),
335 'legend[position]',
336 $this->legend['position'],
337 $this->_legendPositions,
338 esc_html__( 'Determines where to place the legend, compared to the chart area.', 'visualizer' )
339 );
340
341 self::_renderSelectItem(
342 esc_html__( 'Alignment', 'visualizer' ),
343 'legend[alignment]',
344 $this->legend['alignment'],
345 $this->_alignments,
346 esc_html__( 'Determines the alignment of the legend.', 'visualizer' )
347 );
348
349 self::_renderColorPickerItem(
350 esc_html__( 'Font Color', 'visualizer' ),
351 'legend[textStyle][color]',
352 isset( $this->legend['textStyle']['color'] ) ? $this->legend['textStyle']['color'] : null,
353 '#000'
354 );
355 self::_renderSectionEnd();
356
357 self::_renderSectionStart( esc_html__( 'Tooltip', 'visualizer' ), false );
358 $this->_renderTooltipSettigns();
359 self::_renderSectionEnd();
360
361 $this->_renderAnimationSettings();
362
363 do_action( 'visualizer_chart_settings', get_class( $this ), $this->_data, 'general', array( 'generic' => true ) );
364
365 self::_renderGroupEnd();
366 }
367
368 /**
369 * Renders animation settings section.
370 *
371 * @access protected
372 */
373 protected function _renderAnimationSettings() {
374 if ( ! $this->_supportsAnimation ) {
375 return;
376 }
377
378 self::_renderSectionStart( esc_html__( 'Animation', 'visualizer' ), false );
379
380 self::_renderCheckboxItem(
381 esc_html__( 'Animate on startup', 'visualizer' ),
382 'animation[startup]',
383 isset( $this->animation['startup'] ) ? $this->animation['startup'] : 0,
384 true,
385 esc_html__( 'Determines if the chart will animate on the initial draw.', 'visualizer' )
386 );
387
388 self::_renderTextItem(
389 esc_html__( 'Duration', 'visualizer' ),
390 'animation[duration]',
391 isset( $this->animation['duration'] ) ? $this->animation['duration'] : 0,
392 esc_html__( 'The duration of the animation, in milliseconds', 'visualizer' ),
393 0,
394 'number'
395 );
396
397 self::_renderSelectItem(
398 esc_html__( 'Easing', 'visualizer' ),
399 'animation[easing]',
400 isset( $this->animation['easing'] ) ? $this->animation['easing'] : null,
401 array(
402 'linear' => esc_html__( 'Constant speed', 'visualizer' ),
403 'in' => esc_html__( 'Start slow and speed up', 'visualizer' ),
404 'out' => esc_html__( 'Start fast and slow down', 'visualizer' ),
405 'inAndOut' => esc_html__( 'Start slow, speed up, then slow down', 'visualizer' ),
406 ),
407 esc_html__( 'The easing function applied to the animation.', 'visualizer' )
408 );
409
410 self::_renderSectionEnd();
411
412 }
413
414 /**
415 * Renders tooltip settings section.
416 *
417 * @since 1.4.0
418 *
419 * @access protected
420 */
421 protected function _renderTooltipSettigns() {
422 self::_renderSelectItem(
423 esc_html__( 'Trigger', 'visualizer' ),
424 'tooltip[trigger]',
425 isset( $this->tooltip['trigger'] ) ? $this->tooltip['trigger'] : null,
426 array(
427 '' => '',
428 'focus' => esc_html__( 'The tooltip will be displayed when the user hovers over an element', 'visualizer' ),
429 'selection' => esc_html__( 'The tooltip will be displayed when the user selects an element', 'visualizer' ),
430 'none' => esc_html__( 'The tooltip will not be displayed', 'visualizer' ),
431 ),
432 esc_html__( 'Determines the user interaction that causes the tooltip to be displayed.', 'visualizer' )
433 );
434
435 self::_renderSelectItem(
436 esc_html__( 'Show Color Code', 'visualizer' ),
437 'tooltip[showColorCode]',
438 isset( $this->tooltip['showColorCode'] ) ? $this->tooltip['showColorCode'] : null,
439 $this->_yesno,
440 esc_html__( 'If set to yes, will show colored squares next to the slice information in the tooltip.', 'visualizer' )
441 );
442 }
443
444 /**
445 * Renders chart view settings group.
446 *
447 * @since 1.0.0
448 *
449 * @access protected
450 */
451 protected function _renderViewSettings() {
452 self::_renderGroupStart( esc_html__( 'Chart Size & Placement', 'visualizer' ) );
453 self::_renderSectionStart( esc_html__( 'Chart Size/Layout', 'visualizer' ), false );
454 self::_renderSectionDescription( esc_html__( 'Configure the total size of the chart. Two formats are supported: a number, or a number followed by %. A simple number is a value in pixels; a number followed by % is a percentage.', 'visualizer' ) );
455
456 echo '<div class="viz-section-item">';
457 echo '<a class="more-info" href="javascript:;">[?]</a>';
458 echo '<b>', esc_html__( 'Width And Height Of Chart', 'visualizer' ), '</b>';
459
460 echo '<table class="viz-section-table" cellspacing="0" cellpadding="0" border="0">';
461 echo '<tr>';
462 echo '<td class="viz-section-table-column">';
463 echo '<input type="text" name="width" class="control-text" value="', esc_attr( $this->width ), '" placeholder="100%">';
464 echo '</td>';
465 echo '<td class="viz-section-table-column">';
466 echo '<input type="text" name="height" class="control-text" value="', esc_attr( $this->height ), '" placeholder="400">';
467 echo '</td>';
468 echo '</tr>';
469 echo '</table>';
470
471 echo '<p class="viz-section-description">';
472 esc_html_e( 'Determines the total width and height of the chart. This will only show in the front-end.', 'visualizer' );
473 echo '</p>';
474 echo '</div>';
475
476 echo '<div class="viz-section-delimiter"></div>';
477
478 self::_renderSectionDescription( esc_html__( 'Configure the background color for the main area of the chart and the chart border width and color.', 'visualizer' ) );
479
480 self::_renderTextItem(
481 esc_html__( 'Stroke Width', 'visualizer' ),
482 'backgroundColor[strokeWidth]',
483 isset( $this->backgroundColor['strokeWidth'] ) ? $this->backgroundColor['strokeWidth'] : null,
484 esc_html__( 'The chart border width in pixels.', 'visualizer' ),
485 '0'
486 );
487
488 self::_renderColorPickerItem(
489 esc_html__( 'Stroke Color', 'visualizer' ),
490 'backgroundColor[stroke]',
491 ! empty( $this->backgroundColor['stroke'] ) ? $this->backgroundColor['stroke'] : null,
492 '#666'
493 );
494
495 $background_color = ! empty( $this->backgroundColor['fill'] ) ? $this->backgroundColor['fill'] : null;
496 self::_renderColorPickerItem(
497 esc_html__( 'Background Color', 'visualizer' ),
498 'backgroundColor[fill]',
499 $background_color,
500 '#fff'
501 );
502
503 echo '<div class="viz-section-item">';
504 echo '<label>';
505 echo '<input type="checkbox" class="control-checkbox" name="backgroundColor[fill]" value="transparent"', checked( $background_color, 'transparent', false ), '> ';
506 esc_html_e( 'Transparent background', 'visualizer' );
507 echo '</label>';
508 echo '</div>';
509 self::_renderSectionEnd();
510
511 self::_renderSectionStart( esc_html__( 'Placement', 'visualizer' ), false );
512 self::_renderSectionDescription( esc_html__( 'Configure the placement and size of the chart area (where the chart itself is drawn, excluding axis and legends). Two formats are supported: a number, or a number followed by %. A simple number is a value in pixels; a number followed by % is a percentage.', 'visualizer' ) );
513
514 echo '<div class="viz-section-item">';
515 echo '<a class="more-info" href="javascript:;">[?]</a>';
516 echo '<b>', esc_html__( 'Left And Top Margins', 'visualizer' ), '</b>';
517
518 echo '<table class="viz-section-table" cellspacing="0" cellpadding="0" border="0">';
519 echo '<tr>';
520 echo '<td class="viz-section-table-column">';
521 echo '<input type="text" name="chartArea[left]" class="control-text" value="', $this->chartArea['left'] || $this->chartArea['left'] === '0' ? esc_attr( $this->chartArea['left'] ) : '', '" placeholder="20%">';
522 echo '</td>';
523 echo '<td class="viz-section-table-column">';
524 echo '<input type="text" name="chartArea[top]" class="control-text" value="', $this->chartArea['top'] || $this->chartArea['top'] === '0' ? esc_attr( $this->chartArea['top'] ) : '', '" placeholder="20%">';
525 echo '</td>';
526 echo '</tr>';
527 echo '</table>';
528
529 echo '<p class="viz-section-description">';
530 esc_html_e( 'Determines how far to draw the chart from the left and top borders.', 'visualizer' );
531 echo '</p>';
532 echo '</div>';
533
534 echo '<div class="viz-section-item">';
535 echo '<a class="more-info" href="javascript:;">[?]</a>';
536 echo '<b>', esc_html__( 'Width And Height Of Chart Area', 'visualizer' ), '</b>';
537
538 echo '<table class="viz-section-table" cellspacing="0" cellpadding="0" border="0">';
539 echo '<tr>';
540 echo '<td class="viz-section-table-column">';
541 echo '<input type="text" name="chartArea[width]" class="control-text" value="', ! empty( $this->chartArea['width'] ) ? esc_attr( $this->chartArea['width'] ) : '', '" placeholder="60%">';
542 echo '</td>';
543 echo '<td class="viz-section-table-column">';
544 echo '<input type="text" name="chartArea[height]" class="control-text" value="', ! empty( $this->chartArea['height'] ) ? esc_attr( $this->chartArea['height'] ) : '', '" placeholder="60%">';
545 echo '</td>';
546 echo '</tr>';
547 echo '</table>';
548
549 echo '<p class="viz-section-description">';
550 esc_html_e( 'Determines the width and hight of the chart area.', 'visualizer' );
551 echo '</p>';
552 echo '</div>';
553 self::_renderSectionEnd();
554 self::_renderGroupEnd();
555 }
556
557 /**
558 * Renders select item.
559 *
560 * @since 1.0.0
561 *
562 * @static
563 * @access public
564 * @param string $title The title of the select item.
565 * @param string $name The name of the select item.
566 * @param string $value The actual value of the select item.
567 * @param array $options The array of select options.
568 * @param string $desc The description of the select item.
569 * @param bool $multiple Is this a multiple select box.
570 * @param array $classes Any additional classes.
571 * @param array $attributes Custom attributes.
572 */
573 public static function _renderSelectItem( $title, $name, $value, array $options, $desc, $multiple = false, $classes = array(), $attributes = array() ) {
574 $atts = '';
575 if ( $attributes ) {
576 foreach ( $attributes as $k => $v ) {
577 $atts .= ' data-visualizer-' . $k . '=' . esc_attr( $v );
578 }
579 }
580 echo '<div class="viz-section-item">';
581 echo '<a class="more-info" href="javascript:;">[?]</a>';
582 echo '<b>', $title, '</b>';
583 echo '<select class="control-select ', implode( ' ', $classes ) , '" name="', $name, '" ', ( $multiple ? 'multiple' : '' ), ' ' , $atts, '>';
584 foreach ( $options as $key => $label ) {
585 // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
586 $extra = $multiple && is_array( $value ) ? ( in_array( $key, $value ) ? 'selected' : '' ) : selected( $key, $value, false );
587 echo '<option value="', $key, '"', $extra, '>';
588 echo $label;
589 echo '</option>';
590 }
591 echo '</select>';
592 echo '<p class="viz-section-description">', $desc, '</p>';
593 echo '</div>';
594 }
595
596 /**
597 * Renders color picker item.
598 *
599 * @since 1.0.0
600 *
601 * @static
602 * @access protected
603 * @param string $title The title of the select item.
604 * @param string $name The name of the select item.
605 * @param string $value The actual value of the select item.
606 * @param string $default The default value of the color picker.
607 */
608 protected static function _renderColorPickerItem( $title, $name, $value, $default ) {
609 echo '<div class="viz-section-item">';
610 echo '<b>', $title, '</b>';
611 echo '<div>';
612 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, '">';
613 echo '</div>';
614 echo '</div>';
615 }
616
617 /**
618 * Renders text item.
619 *
620 * @since 1.0.0
621 *
622 * @static
623 * @access protected
624 * @param string $title The title of the select item.
625 * @param string $name The name of the select item.
626 * @param string $value The actual value of the select item.
627 * @param string $desc The description of the select item.
628 * @param string $placeholder The placeholder for the input.
629 * @param string $type The type for the input (out of number, email, tel etc., default is text).
630 * @param array $custom_attributes The custom attributes.
631 */
632 protected static function _renderTextItem( $title, $name, $value, $desc, $placeholder = '', $type = 'text', $custom_attributes = array() ) {
633 $attributes = '';
634 if ( $custom_attributes ) {
635 foreach ( $custom_attributes as $k => $v ) {
636 $attributes .= ' ' . $k . '="' . esc_attr( $v ) . '"';
637 }
638 }
639 echo '<div class="viz-section-item">';
640 echo '<a class="more-info" href="javascript:;">[?]</a>';
641 echo '<b>', $title, '</b>';
642 echo '<input type="', $type, '" class="control-text" ', $attributes, ' name="', $name, '" value="', esc_attr( $value ), '" placeholder="', $placeholder, '">';
643 echo '<p class="viz-section-description">', $desc, '</p>';
644 echo '</div>';
645 }
646
647 /**
648 * Renders the beginning of a group.
649 *
650 * @since 1.0.0
651 *
652 * @static
653 * @access public
654 * @param string $title The title of this group.
655 * @param string $html Any additional HTML.
656 * @param string $class Any additional classes.
657 */
658 public static function _renderGroupStart( $title, $html = '', $class = '' ) {
659 echo '<li class="viz-group ' . $class . '">';
660 echo '<h3 class="viz-group-title">', $title, '</h3>';
661 echo $html;
662 echo '<ul class="viz-group-content">';
663 }
664
665 /**
666 * Renders the ending of a group.
667 *
668 * @since 1.0.0
669 *
670 * @static
671 * @access public
672 */
673 public static function _renderGroupEnd() {
674 echo '</ul>';
675 echo '</li>';
676 }
677
678 /**
679 * Renders the beginning of a section.
680 *
681 * @since 1.0.0
682 *
683 * @static
684 * @access public
685 * @param string $title The title of this section. If the title is empty, no title will be displayed.
686 * @param boolean $open Determines whether the section items block has to be expanded or collapsed.
687 */
688 public static function _renderSectionStart( $title = false, $open = true ) {
689
690 if ( ! empty( $title ) ) {
691 echo '<li class="viz-subsection">';
692 echo '<span class="viz-section-title">', $title, '</span>';
693 } else {
694 echo '<li class=" ">';
695 }
696 echo '<div class="viz-section-items section-items', $open ? ' open' : '', '">';
697 }
698
699 /**
700 * Renders the ending of a section.
701 *
702 * @since 1.0.0
703 *
704 * @public
705 * @access protected
706 * @param string $html Any addition HTML to add.
707 */
708 public static function _renderSectionEnd( $html = '' ) {
709 echo '</div>';
710 echo $html;
711 echo '</li>';
712 }
713
714 /**
715 * Renders section description block.
716 *
717 * @since 1.0.0
718 *
719 * @static
720 * @access public
721 * @param string $description The description text.
722 */
723 public static function _renderSectionDescription( $description, $classes = '' ) {
724 echo '<div class="viz-section-item">';
725 echo '<div class="viz-section-description ' . $classes . '">', $description, '</div>';
726 echo '</div>';
727 }
728
729 /**
730 * Renders format field according to series type.
731 *
732 * @since 1.3.0
733 *
734 * @access protected
735 * @param int $index The index of the series.
736 */
737 protected function _renderFormatField( $index = 0 ) {
738 switch ( $this->__series[ $index + 1 ]['type'] ) {
739 case 'number':
740 self::_renderTextItem(
741 esc_html__( 'Number Format', 'visualizer' ),
742 'series[' . $index . '][format]',
743 isset( $this->series[ $index ]['format'] ) ? $this->series[ $index ]['format'] : '',
744 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>' ),
745 '#,###.##'
746 );
747 break;
748 case 'date':
749 case 'datetime':
750 case 'timeofday':
751 self::_renderTextItem(
752 esc_html__( 'Date Format', 'visualizer' ),
753 'series[' . $index . '][format]',
754 isset( $this->series[ $index ]['format'] ) ? $this->series[ $index ]['format'] : '',
755 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>' ),
756 'eeee, dd LLLL yyyy'
757 );
758 break;
759 }
760 }
761
762 /**
763 * Render a checkbox item
764 */
765 protected static function _renderCheckboxItem( $title, $name, $value, $default, $desc, $disabled = false ) {
766 echo '<div class="viz-section-item">';
767 echo '<a class="more-info" href="javascript:;">[?]</a>';
768 echo '<b>', $title, '</b>';
769 // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
770 echo '<input type="checkbox" class="control-check" value="', $default, '" name="', $name, '" ', ( $value == $default ? 'checked' : '' ), ' ', ( $disabled ? 'disabled=disabled' : '' ), '>';
771 echo '<p class="viz-section-description">', $desc, '</p>';
772 echo '</div>';
773 }
774
775 /**
776 * Render a textarea item.
777 */
778 protected static function _renderTextAreaItem( $title, $name, $value, $desc, $placeholder = '', $custom_attributes = array() ) {
779 $attributes = '';
780 if ( $custom_attributes ) {
781 foreach ( $custom_attributes as $k => $v ) {
782 $attributes .= ' ' . $k . '="' . esc_attr( $v ) . '"';
783 }
784 }
785 echo '<div class="viz-section-item">';
786 echo '<a class="more-info" href="javascript:;">[?]</a>';
787 echo '<b>', $title, '</b>';
788 echo '<textarea class="control-text" ', $attributes, ' name="', $name, '" placeholder="', $placeholder, '">', $value, '</textarea>';
789 echo '<p class="viz-section-description">', $desc, '</p>';
790 echo '</div>';
791 }
792
793 /**
794 * Returns the library this chart implements.
795 */
796 public function getLibrary() {
797 return $this->_library;
798 }
799
800 /**
801 * Loads generic libraries conditionally.
802 */
803 protected function load_dependent_assets( $libs ) {
804 if ( in_array( 'moment', $libs, true ) && ! wp_script_is( 'moment', 'registered' ) ) {
805 wp_register_script( 'moment', VISUALIZER_ABSURL . 'js/lib/moment.min.js', array(), Visualizer_Plugin::VERSION );
806 }
807
808 if ( in_array( 'numeral', $libs, true ) && ! wp_script_is( 'numeral', 'registered' ) ) {
809 wp_register_script( 'numeral', VISUALIZER_ABSURL . 'js/lib/numeral.min.js', array(), Visualizer_Plugin::VERSION );
810 }
811
812 }
813 }
814