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

812 lines 28.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 * 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 self::_renderGroupEnd();
364 }
365
366 /**
367 * Renders animation settings section.
368 *
369 * @access protected
370 */
371 protected function _renderAnimationSettings() {
372 if ( ! $this->_supportsAnimation ) {
373 return;
374 }
375
376 self::_renderSectionStart( esc_html__( 'Animation', 'visualizer' ), false );
377
378 self::_renderCheckboxItem(
379 esc_html__( 'Animate on startup', 'visualizer' ),
380 'animation[startup]',
381 isset( $this->animation['startup'] ) ? $this->animation['startup'] : 0,
382 true,
383 esc_html__( 'Determines if the chart will animate on the initial draw.', 'visualizer' )
384 );
385
386 self::_renderTextItem(
387 esc_html__( 'Duration', 'visualizer' ),
388 'animation[duration]',
389 isset( $this->animation['duration'] ) ? $this->animation['duration'] : 0,
390 esc_html__( 'The duration of the animation, in milliseconds', 'visualizer' ),
391 0,
392 'number'
393 );
394
395 self::_renderSelectItem(
396 esc_html__( 'Easing', 'visualizer' ),
397 'animation[easing]',
398 isset( $this->animation['easing'] ) ? $this->animation['easing'] : null,
399 array(
400 'linear' => esc_html__( 'Constant speed', 'visualizer' ),
401 'in' => esc_html__( 'Start slow and speed up', 'visualizer' ),
402 'out' => esc_html__( 'Start fast and slow down', 'visualizer' ),
403 'inAndOut' => esc_html__( 'Start slow, speed up, then slow down', 'visualizer' ),
404 ),
405 esc_html__( 'The easing function applied to the animation.', 'visualizer' )
406 );
407
408 self::_renderSectionEnd();
409
410 }
411
412 /**
413 * Renders tooltip settings section.
414 *
415 * @since 1.4.0
416 *
417 * @access protected
418 */
419 protected function _renderTooltipSettigns() {
420 self::_renderSelectItem(
421 esc_html__( 'Trigger', 'visualizer' ),
422 'tooltip[trigger]',
423 isset( $this->tooltip['trigger'] ) ? $this->tooltip['trigger'] : null,
424 array(
425 '' => '',
426 'focus' => esc_html__( 'The tooltip will be displayed when the user hovers over an element', 'visualizer' ),
427 'selection' => esc_html__( 'The tooltip will be displayed when the user selects an element', 'visualizer' ),
428 'none' => esc_html__( 'The tooltip will not be displayed', 'visualizer' ),
429 ),
430 esc_html__( 'Determines the user interaction that causes the tooltip to be displayed.', 'visualizer' )
431 );
432
433 self::_renderSelectItem(
434 esc_html__( 'Show Color Code', 'visualizer' ),
435 'tooltip[showColorCode]',
436 isset( $this->tooltip['showColorCode'] ) ? $this->tooltip['showColorCode'] : null,
437 $this->_yesno,
438 esc_html__( 'If set to yes, will show colored squares next to the slice information in the tooltip.', 'visualizer' )
439 );
440 }
441
442 /**
443 * Renders chart view settings group.
444 *
445 * @since 1.0.0
446 *
447 * @access protected
448 */
449 protected function _renderViewSettings() {
450 self::_renderGroupStart( esc_html__( 'Chart Size & Placement', 'visualizer' ) );
451 self::_renderSectionStart( esc_html__( 'Chart Size/Layout', 'visualizer' ), false );
452 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' ) );
453
454 echo '<div class="viz-section-item">';
455 echo '<a class="more-info" href="javascript:;">[?]</a>';
456 echo '<b>', esc_html__( 'Width And Height Of Chart', 'visualizer' ), '</b>';
457
458 echo '<table class="viz-section-table" cellspacing="0" cellpadding="0" border="0">';
459 echo '<tr>';
460 echo '<td class="viz-section-table-column">';
461 echo '<input type="text" name="width" class="control-text" value="', esc_attr( $this->width ), '" placeholder="100%">';
462 echo '</td>';
463 echo '<td class="viz-section-table-column">';
464 echo '<input type="text" name="height" class="control-text" value="', esc_attr( $this->height ), '" placeholder="400">';
465 echo '</td>';
466 echo '</tr>';
467 echo '</table>';
468
469 echo '<p class="viz-section-description">';
470 esc_html_e( 'Determines the total width and height of the chart. This will only show in the front-end.', 'visualizer' );
471 echo '</p>';
472 echo '</div>';
473
474 echo '<div class="viz-section-delimiter"></div>';
475
476 self::_renderSectionDescription( esc_html__( 'Configure the background color for the main area of the chart and the chart border width and color.', 'visualizer' ) );
477
478 self::_renderTextItem(
479 esc_html__( 'Stroke Width', 'visualizer' ),
480 'backgroundColor[strokeWidth]',
481 isset( $this->backgroundColor['strokeWidth'] ) ? $this->backgroundColor['strokeWidth'] : null,
482 esc_html__( 'The chart border width in pixels.', 'visualizer' ),
483 '0'
484 );
485
486 self::_renderColorPickerItem(
487 esc_html__( 'Stroke Color', 'visualizer' ),
488 'backgroundColor[stroke]',
489 ! empty( $this->backgroundColor['stroke'] ) ? $this->backgroundColor['stroke'] : null,
490 '#666'
491 );
492
493 $background_color = ! empty( $this->backgroundColor['fill'] ) ? $this->backgroundColor['fill'] : null;
494 self::_renderColorPickerItem(
495 esc_html__( 'Background Color', 'visualizer' ),
496 'backgroundColor[fill]',
497 $background_color,
498 '#fff'
499 );
500
501 echo '<div class="viz-section-item">';
502 echo '<label>';
503 echo '<input type="checkbox" class="control-checkbox" name="backgroundColor[fill]" value="transparent"', checked( $background_color, 'transparent', false ), '> ';
504 esc_html_e( 'Transparent background', 'visualizer' );
505 echo '</label>';
506 echo '</div>';
507 self::_renderSectionEnd();
508
509 self::_renderSectionStart( esc_html__( 'Placement', 'visualizer' ), false );
510 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' ) );
511
512 echo '<div class="viz-section-item">';
513 echo '<a class="more-info" href="javascript:;">[?]</a>';
514 echo '<b>', esc_html__( 'Left And Top Margins', 'visualizer' ), '</b>';
515
516 echo '<table class="viz-section-table" cellspacing="0" cellpadding="0" border="0">';
517 echo '<tr>';
518 echo '<td class="viz-section-table-column">';
519 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%">';
520 echo '</td>';
521 echo '<td class="viz-section-table-column">';
522 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%">';
523 echo '</td>';
524 echo '</tr>';
525 echo '</table>';
526
527 echo '<p class="viz-section-description">';
528 esc_html_e( 'Determines how far to draw the chart from the left and top borders.', 'visualizer' );
529 echo '</p>';
530 echo '</div>';
531
532 echo '<div class="viz-section-item">';
533 echo '<a class="more-info" href="javascript:;">[?]</a>';
534 echo '<b>', esc_html__( 'Width And Height Of Chart Area', 'visualizer' ), '</b>';
535
536 echo '<table class="viz-section-table" cellspacing="0" cellpadding="0" border="0">';
537 echo '<tr>';
538 echo '<td class="viz-section-table-column">';
539 echo '<input type="text" name="chartArea[width]" class="control-text" value="', ! empty( $this->chartArea['width'] ) ? esc_attr( $this->chartArea['width'] ) : '', '" placeholder="60%">';
540 echo '</td>';
541 echo '<td class="viz-section-table-column">';
542 echo '<input type="text" name="chartArea[height]" class="control-text" value="', ! empty( $this->chartArea['height'] ) ? esc_attr( $this->chartArea['height'] ) : '', '" placeholder="60%">';
543 echo '</td>';
544 echo '</tr>';
545 echo '</table>';
546
547 echo '<p class="viz-section-description">';
548 esc_html_e( 'Determines the width and hight of the chart area.', 'visualizer' );
549 echo '</p>';
550 echo '</div>';
551 self::_renderSectionEnd();
552 self::_renderGroupEnd();
553 }
554
555 /**
556 * Renders select item.
557 *
558 * @since 1.0.0
559 *
560 * @static
561 * @access public
562 * @param string $title The title of the select item.
563 * @param string $name The name of the select item.
564 * @param string $value The actual value of the select item.
565 * @param array $options The array of select options.
566 * @param string $desc The description of the select item.
567 * @param bool $multiple Is this a multiple select box.
568 * @param array $classes Any additional classes.
569 * @param array $attributes Custom attributes.
570 */
571 public static function _renderSelectItem( $title, $name, $value, array $options, $desc, $multiple = false, $classes = array(), $attributes = array() ) {
572 $atts = '';
573 if ( $attributes ) {
574 foreach ( $attributes as $k => $v ) {
575 $atts .= ' data-visualizer-' . $k . '=' . esc_attr( $v );
576 }
577 }
578 echo '<div class="viz-section-item">';
579 echo '<a class="more-info" href="javascript:;">[?]</a>';
580 echo '<b>', $title, '</b>';
581 echo '<select class="control-select ', implode( ' ', $classes ) , '" name="', $name, '" ', ( $multiple ? 'multiple' : '' ), ' ' , $atts, '>';
582 foreach ( $options as $key => $label ) {
583 // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
584 $extra = $multiple && is_array( $value ) ? ( in_array( $key, $value ) ? 'selected' : '' ) : selected( $key, $value, false );
585 echo '<option value="', $key, '"', $extra, '>';
586 echo $label;
587 echo '</option>';
588 }
589 echo '</select>';
590 echo '<p class="viz-section-description">', $desc, '</p>';
591 echo '</div>';
592 }
593
594 /**
595 * Renders color picker item.
596 *
597 * @since 1.0.0
598 *
599 * @static
600 * @access protected
601 * @param string $title The title of the select item.
602 * @param string $name The name of the select item.
603 * @param string $value The actual value of the select item.
604 * @param string $default The default value of the color picker.
605 */
606 protected static function _renderColorPickerItem( $title, $name, $value, $default ) {
607 echo '<div class="viz-section-item">';
608 echo '<b>', $title, '</b>';
609 echo '<div>';
610 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, '">';
611 echo '</div>';
612 echo '</div>';
613 }
614
615 /**
616 * Renders text item.
617 *
618 * @since 1.0.0
619 *
620 * @static
621 * @access protected
622 * @param string $title The title of the select item.
623 * @param string $name The name of the select item.
624 * @param string $value The actual value of the select item.
625 * @param string $desc The description of the select item.
626 * @param string $placeholder The placeholder for the input.
627 * @param string $type The type for the input (out of number, email, tel etc., default is text).
628 * @param array $custom_attributes The custom attributes.
629 */
630 protected static function _renderTextItem( $title, $name, $value, $desc, $placeholder = '', $type = 'text', $custom_attributes = array() ) {
631 $attributes = '';
632 if ( $custom_attributes ) {
633 foreach ( $custom_attributes as $k => $v ) {
634 $attributes .= ' ' . $k . '="' . esc_attr( $v ) . '"';
635 }
636 }
637 echo '<div class="viz-section-item">';
638 echo '<a class="more-info" href="javascript:;">[?]</a>';
639 echo '<b>', $title, '</b>';
640 echo '<input type="', $type, '" class="control-text" ', $attributes, ' name="', $name, '" value="', esc_attr( $value ), '" placeholder="', $placeholder, '">';
641 echo '<p class="viz-section-description">', $desc, '</p>';
642 echo '</div>';
643 }
644
645 /**
646 * Renders the beginning of a group.
647 *
648 * @since 1.0.0
649 *
650 * @static
651 * @access public
652 * @param string $title The title of this group.
653 * @param string $html Any additional HTML.
654 * @param string $class Any additional classes.
655 */
656 public static function _renderGroupStart( $title, $html = '', $class = '' ) {
657 echo '<li class="viz-group ' . $class . '">';
658 echo '<h3 class="viz-group-title">', $title, '</h3>';
659 echo $html;
660 echo '<ul class="viz-group-content">';
661 }
662
663 /**
664 * Renders the ending of a group.
665 *
666 * @since 1.0.0
667 *
668 * @static
669 * @access public
670 */
671 public static function _renderGroupEnd() {
672 echo '</ul>';
673 echo '</li>';
674 }
675
676 /**
677 * Renders the beginning of a section.
678 *
679 * @since 1.0.0
680 *
681 * @static
682 * @access public
683 * @param string $title The title of this section. If the title is empty, no title will be displayed.
684 * @param boolean $open Determines whether the section items block has to be expanded or collapsed.
685 */
686 public static function _renderSectionStart( $title = false, $open = true ) {
687
688 if ( ! empty( $title ) ) {
689 echo '<li class="viz-subsection">';
690 echo '<span class="viz-section-title">', $title, '</span>';
691 } else {
692 echo '<li class=" ">';
693 }
694 echo '<div class="viz-section-items section-items', $open ? ' open' : '', '">';
695 }
696
697 /**
698 * Renders the ending of a section.
699 *
700 * @since 1.0.0
701 *
702 * @public
703 * @access protected
704 * @param string $html Any addition HTML to add.
705 */
706 public static function _renderSectionEnd( $html = '' ) {
707 echo '</div>';
708 echo $html;
709 echo '</li>';
710 }
711
712 /**
713 * Renders section description block.
714 *
715 * @since 1.0.0
716 *
717 * @static
718 * @access public
719 * @param string $description The description text.
720 */
721 public static function _renderSectionDescription( $description, $classes = '' ) {
722 echo '<div class="viz-section-item">';
723 echo '<div class="viz-section-description ' . $classes . '">', $description, '</div>';
724 echo '</div>';
725 }
726
727 /**
728 * Renders format field according to series type.
729 *
730 * @since 1.3.0
731 *
732 * @access protected
733 * @param int $index The index of the series.
734 */
735 protected function _renderFormatField( $index = 0 ) {
736 switch ( $this->__series[ $index + 1 ]['type'] ) {
737 case 'number':
738 self::_renderTextItem(
739 esc_html__( 'Number Format', 'visualizer' ),
740 'series[' . $index . '][format]',
741 isset( $this->series[ $index ]['format'] ) ? $this->series[ $index ]['format'] : '',
742 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>' ),
743 '#,###.##'
744 );
745 break;
746 case 'date':
747 case 'datetime':
748 case 'timeofday':
749 self::_renderTextItem(
750 esc_html__( 'Date Format', 'visualizer' ),
751 'series[' . $index . '][format]',
752 isset( $this->series[ $index ]['format'] ) ? $this->series[ $index ]['format'] : '',
753 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>' ),
754 'eeee, dd LLLL yyyy'
755 );
756 break;
757 }
758 }
759
760 /**
761 * Render a checkbox item
762 */
763 protected static function _renderCheckboxItem( $title, $name, $value, $default, $desc, $disabled = false ) {
764 echo '<div class="viz-section-item">';
765 echo '<a class="more-info" href="javascript:;">[?]</a>';
766 echo '<b>', $title, '</b>';
767 // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
768 echo '<input type="checkbox" class="control-check" value="', $default, '" name="', $name, '" ', ( $value == $default ? 'checked' : '' ), ' ', ( $disabled ? 'disabled=disabled' : '' ), '>';
769 echo '<p class="viz-section-description">', $desc, '</p>';
770 echo '</div>';
771 }
772
773 /**
774 * Render a textarea item.
775 */
776 protected static function _renderTextAreaItem( $title, $name, $value, $desc, $placeholder = '', $custom_attributes = array() ) {
777 $attributes = '';
778 if ( $custom_attributes ) {
779 foreach ( $custom_attributes as $k => $v ) {
780 $attributes .= ' ' . $k . '="' . esc_attr( $v ) . '"';
781 }
782 }
783 echo '<div class="viz-section-item">';
784 echo '<a class="more-info" href="javascript:;">[?]</a>';
785 echo '<b>', $title, '</b>';
786 echo '<textarea class="control-text" ', $attributes, ' name="', $name, '" placeholder="', $placeholder, '">', $value, '</textarea>';
787 echo '<p class="viz-section-description">', $desc, '</p>';
788 echo '</div>';
789 }
790
791 /**
792 * Returns the library this chart implements.
793 */
794 public function getLibrary() {
795 return $this->_library;
796 }
797
798 /**
799 * Loads generic libraries conditionally.
800 */
801 protected function load_dependent_assets( $libs ) {
802 if ( in_array( 'moment', $libs, true ) && ! wp_script_is( 'moment', 'registered' ) ) {
803 wp_register_script( 'moment', VISUALIZER_ABSURL . 'js/lib/moment.min.js', array(), Visualizer_Plugin::VERSION );
804 }
805
806 if ( in_array( 'numeral', $libs, true ) && ! wp_script_is( 'numeral', 'registered' ) ) {
807 wp_register_script( 'numeral', VISUALIZER_ABSURL . 'js/lib/numeral.min.js', array(), Visualizer_Plugin::VERSION );
808 }
809
810 }
811 }
812