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

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