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

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