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

807 lines 27.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 * Whether this chart supports animation or not.
68 *
69 * @access protected
70 * @var bool
71 */
72 protected $_supportsAnimation = true;
73
74 /**
75 * Which library does this this chart implement?
76 *
77 * @access protected
78 * @var string
79 */
80 protected $_library = null;
81
82 /**
83 * Constructor.
84 *
85 * @since 1.0.0
86 *
87 * @access public
88 * @param array $data The data what has to be associated with this render.
89 */
90 public function __construct( $data = array() ) {
91 parent::__construct( $data );
92
93 $this->_yesno = array(
94 '' => '',
95 '1' => esc_html__( 'Yes', 'visualizer' ),
96 '0' => esc_html__( 'No', 'visualizer' ),
97 );
98
99 $this->hooks();
100 }
101
102 /**
103 * Renders chart title settings.
104 *
105 * @since 1.0.0
106 *
107 * @access protected
108 */
109 protected function _renderChartTitleSettings() {
110 self::_renderTextItem(
111 esc_html__( 'Chart Title', 'visualizer' ),
112 'title',
113 $this->title,
114 esc_html__( 'Text to display above the chart.', 'visualizer' )
115 );
116
117 self::_renderColorPickerItem(
118 esc_html__( 'Chart Title Color', 'visualizer' ),
119 'titleTextStyle[color]',
120 isset( $this->titleTextStyle['color'] ) ? $this->titleTextStyle['color'] : null,
121 '#000'
122 );
123
124 self::_renderTextAreaItem(
125 esc_html__( 'Chart Description', 'visualizer' ),
126 'description',
127 $this->description,
128 sprintf( esc_html__( 'Description to display in the structured data schema as explained %1$shere%2$s', 'visualizer' ), '<a href="https://developers.google.com/search/docs/data-types/dataset#dataset" target="_blank">', '</a>' )
129 );
130 }
131
132 /**
133 * Add the correct description for the manual configuration box.
134 */
135 protected function _renderManualConfigDescription() {
136 self::_renderSectionStart();
137 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>' );
138 }
139
140 /**
141 * Add the correct example for the manual configuration box.
142 */
143 protected function _renderManualConfigExample() {
144 return '{
145 "vAxis": {
146 "ticks": [5, 10, 15, 20],
147 "titleTextStyle": {
148 "color": "red"
149 },
150 "textPosition": "in"
151 }
152 }';
153 }
154
155 /**
156 * Renders chart advanced settings group.
157 *
158 * @access protected
159 */
160 protected function _renderAdvancedSettings() {
161 // Chart control settings.
162 $this->_renderChartControlsGroup();
163
164 if ( Visualizer_Module_Admin::proFeaturesLocked() ) {
165 self::_renderGroupStart( esc_html__( 'Frontend Actions', 'visualizer' ) );
166 } else {
167 self::_renderGroupStart( esc_html__( 'Frontend Actions', 'visualizer' ) . '<span class="dashicons dashicons-lock"></span>', '', apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'chart-frontend-actions' ), 'vz-frontend-actions' );
168 echo '<div style="position: relative">';
169 }
170 self::_renderSectionStart();
171 self::_renderSectionDescription( esc_html__( 'Configure frontend actions that need to be shown.', 'visualizer' ) );
172 self::_renderSectionEnd();
173
174 $this->_renderActionSettings();
175 if ( ! Visualizer_Module_Admin::proFeaturesLocked() ) {
176 echo apply_filters( 'visualizer_pro_upsell', '', 'chart-permissions' );
177 echo '</div>';
178 }
179 self::_renderGroupEnd();
180
181 self::_renderGroupStart( esc_html__( 'Manual Configuration', 'visualizer' ) );
182 $this->_renderManualConfigDescription();
183 self::_renderTextAreaItem(
184 esc_html__( 'Configuration', 'visualizer' ),
185 'manual',
186 $this->manual,
187 sprintf(
188 esc_html__( 'One per line in valid JSON (key:value) format e.g. %s', 'visualizer' ),
189 '<br><code>' . $this->_renderManualConfigExample() . '</code>'
190 ),
191 '',
192 array( 'rows' => 5 )
193 );
194
195 self::_renderSectionEnd();
196 self::_renderGroupEnd();
197
198 }
199
200 /**
201 * Renders chart action buttons group.
202 *
203 * @access protected
204 */
205 protected function _renderActionSettings() {
206 global $wp_version;
207 $disable_actions = version_compare( $wp_version, '4.7.0', '<' );
208 // default open this section when not testing through cypress because cypress expects to click and open each section
209 // and may not like finding a section is already open.
210 self::_renderSectionStart( esc_html__( 'Actions', 'visualizer' ), ! defined( 'TI_CYPRESS_TESTING' ) );
211 self::_renderCheckboxItem(
212 esc_html__( 'Print', 'visualizer' ),
213 'actions[]',
214 isset( $this->actions ) && in_array( 'print', $this->actions, true ) ? true : false,
215 'print',
216 $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' ),
217 $disable_actions
218 );
219 self::_renderCheckboxItem(
220 esc_html__( 'CSV', 'visualizer' ),
221 'actions[]',
222 isset( $this->actions ) && in_array( 'csv;application/csv', $this->actions, true ) ? true : false,
223 'csv;application/csv',
224 $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' ),
225 $disable_actions
226 );
227
228 $disabled = ! self::is_excel_enabled();
229 self::_renderCheckboxItem(
230 esc_html__( 'Excel', 'visualizer' ),
231 'actions[]',
232 isset( $this->actions ) && in_array( 'xls;application/vnd.ms-excel', $this->actions, true ) ? true : false,
233 'xls;application/vnd.ms-excel',
234 $disable_actions ? '<span class="viz-section-error">' . esc_html__( 'Upgrade to at least WordPress 4.7 to use this.', 'visualizer' ) . '</span>' : ( $disabled ? '<span class="viz-section-error">' . esc_html__( 'Enable the ZIP and XML extensions to use this setting.', 'visualizer' ) . '</span>' : esc_html__( 'To enable downloading the data as an Excel spreadsheet.', 'visualizer' ) ),
235 $disable_actions || $disabled
236 );
237 self::_renderCheckboxItem(
238 esc_html__( 'Copy', 'visualizer' ),
239 'actions[]',
240 isset( $this->actions ) && in_array( 'copy', $this->actions, true ) ? true : false,
241 'copy',
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 copying the data to the clipboard.', 'visualizer' ),
243 $disable_actions
244 );
245
246 // not all charts support downloading as an image.
247 $disabled = ! $this->can_chart_have_action( 'image' );
248 self::_renderCheckboxItem(
249 esc_html__( 'Download Image', 'visualizer' ),
250 'actions[]',
251 isset( $this->actions ) && in_array( 'image', $this->actions, true ) ? true : false,
252 'image',
253 $disable_actions ? '<span class="viz-section-error">' . esc_html__( 'Upgrade to at least WordPress 4.7 to use this.', 'visualizer' ) . '</span>' : ( $disabled ? '<span class="viz-section-error">' . esc_html__( 'Not supported for this chart type.', 'visualizer' ) . '</span>' : esc_html__( 'To download the chart as an image.', 'visualizer' ) ),
254 $disable_actions || $disabled
255 );
256 self::_renderSectionEnd();
257 }
258
259 /**
260 * Checks if the Excel module can be enabled.
261 */
262 private static function is_excel_enabled() {
263 $vendor_file = VISUALIZER_ABSPATH . '/vendor/autoload.php';
264 if ( is_readable( $vendor_file ) ) {
265 include_once( $vendor_file );
266 }
267
268 if ( version_compare( phpversion(), '5.6.0', '<' ) ) {
269 do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'PHP version %s not supported', phpversion() ), 'error', __FILE__, __LINE__ );
270 return false;
271 }
272
273 return class_exists( 'PhpOffice\PhpSpreadsheet\Spreadsheet' ) && extension_loaded( 'zip' ) && extension_loaded( 'xml' ) && extension_loaded( 'fileinfo' );
274 }
275
276 /**
277 * Renders select item.
278 *
279 * @since 1.0.0
280 *
281 * @static
282 * @access public
283 * @param string $title The title of the select item.
284 * @param string $name The name of the select item.
285 * @param string $value The actual value of the select item.
286 * @param array $options The array of select options.
287 * @param string $desc The description of the select item.
288 * @param bool $multiple Is this a multiple select box.
289 * @param array $classes Any additional classes.
290 * @param array $attributes Custom attributes.
291 */
292 public static function _renderSelectItem( $title, $name, $value, array $options, $desc, $multiple = false, $classes = array(), $attributes = array() ) {
293 $atts = '';
294 if ( $attributes ) {
295 foreach ( $attributes as $k => $v ) {
296 $atts .= ' data-visualizer-' . $k . '=' . esc_attr( $v );
297 }
298 }
299 echo '<div class="viz-section-item">';
300 echo '<a class="more-info" href="javascript:;">[?]</a>';
301 echo '<b>', $title, '</b>';
302 echo '<select class="control-select ', implode( ' ', $classes ) , '" name="', $name, '" ', ( $multiple ? 'multiple' : '' ), ' ' , $atts, '>';
303 foreach ( $options as $key => $label ) {
304 // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
305 $extra = $multiple && is_array( $value ) ? ( in_array( $key, $value ) ? 'selected' : '' ) : selected( $key, $value, false );
306 echo '<option value="', $key, '"', $extra, '>';
307 echo $label;
308 echo '</option>';
309 }
310 echo '</select>';
311 echo '<p class="viz-section-description">', $desc, '</p>';
312 echo '</div>';
313 }
314
315 /**
316 * Renders color picker item.
317 *
318 * @since 1.0.0
319 *
320 * @static
321 * @access protected
322 * @param string $title The title of the select item.
323 * @param string $name The name of the select item.
324 * @param string $value The actual value of the select item.
325 * @param string $default The default value of the color picker.
326 */
327 protected static function _renderColorPickerItem( $title, $name, $value, $default ) {
328 echo '<div class="viz-section-item">';
329 echo '<b>', $title, '</b>';
330 echo '<div>';
331 echo '<input type="text" class="color-picker-hex color-picker" data-alpha-enabled="true" name="', $name, '" maxlength="7" placeholder="', esc_attr__( 'Hex Value', 'visualizer' ), '" value="', is_null( $value ) ? $default : esc_attr( $value ), '" data-default-color="', $default, '">';
332 echo '</div>';
333 echo '</div>';
334 }
335
336 /**
337 * Renders text item.
338 *
339 * @since 1.0.0
340 *
341 * @static
342 * @access protected
343 * @param string $title The title of the select item.
344 * @param string $name The name of the select item.
345 * @param string $value The actual value of the select item.
346 * @param string $desc The description of the select item.
347 * @param string $placeholder The placeholder for the input.
348 * @param string $type The type for the input (out of number, email, tel etc., default is text).
349 * @param array $custom_attributes The custom attributes.
350 */
351 protected static function _renderTextItem( $title, $name, $value, $desc, $placeholder = '', $type = 'text', $custom_attributes = array(), $extra_class = array() ) {
352 $attributes = '';
353 if ( $custom_attributes ) {
354 foreach ( $custom_attributes as $k => $v ) {
355 $attributes .= ' ' . $k . '="' . esc_attr( $v ) . '"';
356 }
357 }
358 $extra_class[] = 'viz-section-item';
359 echo '<div class="' . esc_attr( implode( ' ', $extra_class ) ) . '">';
360 echo '<a class="more-info" href="javascript:;">[?]</a>';
361 echo '<b>', $title, '</b>';
362 echo '<input type="', $type, '" class="control-text" ', $attributes, ' name="', $name, '" value="', esc_attr( $value ), '" placeholder="', $placeholder, '">';
363 echo '<p class="viz-section-description">', $desc, '</p>';
364 echo '</div>';
365 }
366
367 /**
368 * Renders the beginning of a group.
369 *
370 * @since 1.0.0
371 *
372 * @static
373 * @access public
374 * @param string $title The title of this group.
375 * @param string $html Any additional HTML.
376 * @param string $class Any additional classes.
377 */
378 public static function _renderGroupStart( $title, $html = '', $class = '', $id = '' ) {
379 echo '<li id="' . $id . '" class="viz-group ' . $class . '">';
380 echo '<h3 class="viz-group-title">', $title, '</h3>';
381 echo $html;
382 echo '<ul class="viz-group-content">';
383 }
384
385 /**
386 * Renders the ending of a group.
387 *
388 * @since 1.0.0
389 *
390 * @static
391 * @access public
392 */
393 public static function _renderGroupEnd() {
394 echo '</ul>';
395 echo '</li>';
396 }
397
398 /**
399 * Renders the beginning of a section.
400 *
401 * @since 1.0.0
402 *
403 * @static
404 * @access public
405 * @param string $title The title of this section. If the title is empty, no title will be displayed.
406 * @param boolean $open Determines whether the section items block has to be expanded or collapsed.
407 */
408 public static function _renderSectionStart( $title = false, $open = true ) {
409
410 if ( ! empty( $title ) ) {
411 echo '<li class="viz-subsection">';
412 echo '<span class="viz-section-title">', $title, '</span>';
413 } else {
414 echo '<li class=" ">';
415 }
416 echo '<div class="viz-section-items section-items', $open ? ' open' : '', '">';
417 }
418
419 /**
420 * Renders the ending of a section.
421 *
422 * @since 1.0.0
423 *
424 * @public
425 * @access protected
426 * @param string $html Any addition HTML to add.
427 */
428 public static function _renderSectionEnd( $html = '' ) {
429 echo '</div>';
430 echo $html;
431 echo '</li>';
432 }
433
434 /**
435 * Renders section description block.
436 *
437 * @since 1.0.0
438 *
439 * @static
440 * @access public
441 * @param string $description The description text.
442 */
443 public static function _renderSectionDescription( $description, $classes = '' ) {
444 echo '<div class="viz-section-item">';
445 echo '<div class="viz-section-description ' . $classes . '">', $description, '</div>';
446 echo '</div>';
447 }
448
449 /**
450 * Renders format field according to series type.
451 *
452 * @since 1.3.0
453 *
454 * @access protected
455 * @param int $index The index of the series.
456 */
457 protected function _renderFormatField( $index = 0 ) {
458 switch ( $this->__series[ $index + 1 ]['type'] ) {
459 case 'number':
460 self::_renderTextItem(
461 esc_html__( 'Number Format', 'visualizer' ),
462 'series[' . $index . '][format]',
463 isset( $this->series[ $index ]['format'] ) ? $this->series[ $index ]['format'] : '',
464 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>' ),
465 '#,###.##'
466 );
467 break;
468 case 'date':
469 case 'datetime':
470 case 'timeofday':
471 self::_renderTextItem(
472 esc_html__( 'Date Format', 'visualizer' ),
473 'series[' . $index . '][format]',
474 isset( $this->series[ $index ]['format'] ) ? $this->series[ $index ]['format'] : '',
475 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="https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax" target="_blank">', '</a>' ),
476 'eeee, dd LLLL yyyy'
477 );
478 break;
479 }
480 }
481
482 /**
483 * Render a checkbox item
484 */
485 protected static function _renderCheckboxItem( $title, $name, $value, $default, $desc, $disabled = false ) {
486 echo '<div class="viz-section-item">';
487 echo '<a class="more-info" href="javascript:;">[?]</a>';
488 echo '<b>', $title, '</b>';
489 // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
490 echo '<input type="checkbox" class="control-check" value="', $default, '" name="', $name, '" ', ( $value == $default ? 'checked' : '' ), ' ', ( $disabled ? 'disabled=disabled' : '' ), '>';
491 echo '<p class="viz-section-description">', $desc, '</p>';
492 echo '</div>';
493 }
494
495 /**
496 * Render a textarea item.
497 */
498 protected static function _renderTextAreaItem( $title, $name, $value, $desc, $placeholder = '', $custom_attributes = array() ) {
499 $attributes = '';
500 if ( $custom_attributes ) {
501 foreach ( $custom_attributes as $k => $v ) {
502 $attributes .= ' ' . $k . '="' . esc_attr( $v ) . '"';
503 }
504 }
505 echo '<div class="viz-section-item">';
506 echo '<a class="more-info" href="javascript:;">[?]</a>';
507 echo '<b>', $title, '</b>';
508 echo '<textarea class="control-text" ', $attributes, ' name="', $name, '" placeholder="', $placeholder, '">', $value, '</textarea>';
509 echo '<p class="viz-section-description">', $desc, '</p>';
510 echo '</div>';
511 }
512
513 /**
514 * Returns the library this chart implements.
515 */
516 public function getLibrary() {
517 return $this->_library;
518 }
519
520 /**
521 * Loads generic libraries conditionally.
522 */
523 protected function load_dependent_assets( $libs ) {
524 if ( in_array( 'moment', $libs, true ) && ! wp_script_is( 'moment', 'registered' ) ) {
525 wp_register_script( 'moment' );
526 }
527
528 if ( in_array( 'numeral', $libs, true ) && ! wp_script_is( 'numeral', 'registered' ) ) {
529 wp_register_script( 'numeral', VISUALIZER_ABSURL . 'js/lib/numeral.min.js', array(), Visualizer_Plugin::VERSION );
530 }
531
532 }
533
534 /**
535 * Renders save chart as image setting group.
536 *
537 * @access protected
538 */
539 protected function _renderChartImageSettings() {
540 // Default enable if amp is active.
541 $is_amp = function_exists( 'amp_is_enabled' ) && amp_is_enabled();
542 $this->save_chart_image = null === $this->save_chart_image && $is_amp ? true : $this->save_chart_image;
543
544 $is_create_chart = true;
545 if ( filter_input( INPUT_GET, 'library', FILTER_VALIDATE_BOOLEAN ) ) {
546 if ( filter_input( INPUT_GET, 'action' ) === Visualizer_Plugin::ACTION_EDIT_CHART ) {
547 $is_create_chart = false;
548 }
549 }
550 $this->lazy_load_chart = null === $this->lazy_load_chart && $is_create_chart ? true : $this->lazy_load_chart;
551
552 self::_renderSectionStart( esc_html__( 'Save chart as an image inside Media Library', 'visualizer' ), false );
553 self::_renderCheckboxItem(
554 esc_html__( 'Save inside media library?', 'visualizer' ),
555 'save_chart_image',
556 $this->save_chart_image ? true : false,
557 'yes',
558 esc_html__( 'To enable save the image as an inside media library.', 'visualizer' ),
559 false
560 );
561 self::_renderSectionEnd();
562
563 self::_renderSectionStart( esc_html__( 'Lazy rendering of chart', 'visualizer' ), false );
564 self::_renderCheckboxItem(
565 esc_html__( 'Enable lazy rendering of chart?', 'visualizer' ),
566 'lazy_load_chart',
567 $this->lazy_load_chart ? true : false,
568 'yes',
569 esc_html__( 'To enable lazy chart rendering.', 'visualizer' ),
570 false
571 );
572 self::_renderSectionEnd();
573 }
574
575 /**
576 * Renders chart controls group.
577 *
578 * @access protected
579 */
580 protected function _renderChartControlsGroup() {
581 if ( 'google' !== $this->getLibrary() ) {
582 return;
583 }
584 if ( Visualizer_Module_Admin::proFeaturesLocked() ) {
585 self::_renderGroupStart( esc_html__( 'Chart Data Filter Configuration', 'visualizer' ) );
586 } else {
587 self::_renderGroupStart( esc_html__( 'Chart Data Filter Configuration', 'visualizer' ) . '<span class="dashicons dashicons-lock"></span>', '', apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'chart-filter-controls' ), 'vz-data-controls' );
588 echo '<div style="position: relative">';
589 }
590 self::_renderSectionStart();
591 self::_renderSectionDescription( '<span class="viz-gvlink">' . sprintf( __( 'Configure the data filter controls by providing configuration variables right from the %1$sChart Controls API%2$s. ', 'visualizer' ), '<a href="https://developers.google.com/chart/interactive/docs/gallery/controls#controls-gallery" target="_blank">', '</a>' ) . '</span>' );
592 self::_renderSectionEnd();
593 $this->_renderChartControlsSettings();
594 if ( ! Visualizer_Module_Admin::proFeaturesLocked() ) {
595 echo apply_filters( 'visualizer_pro_upsell', '', 'chart-permissions' );
596 echo '</div>';
597 }
598 self::_renderGroupEnd();
599 }
600
601 /**
602 * Renders chart controls setting.
603 *
604 * @access protected
605 */
606 protected function _renderChartControlsSettings() {
607
608 self::_renderSectionStart( esc_html__( 'Options', 'visualizer' ), false );
609 $control_type = ! empty( $this->controls['controlType'] ) ? $this->controls['controlType'] : '';
610
611 self::_renderSelectItem(
612 esc_html__( 'Filter Type', 'visualizer' ),
613 'controls[controlType]',
614 $control_type,
615 array(
616 '' => '',
617 'StringFilter' => esc_html__( 'String Filter', 'visualizer' ),
618 'NumberRangeFilter' => esc_html__( 'Number Range Filter', 'visualizer' ),
619 'CategoryFilter' => esc_html__( 'Category Filter', 'visualizer' ),
620 'ChartRangeFilter' => esc_html__( 'Chart Range Filter', 'visualizer' ),
621 'DateRangeFilter' => esc_html__( 'Date Range Filter', 'visualizer' ),
622 ),
623 '',
624 false,
625 array( 'vz-controls-opt' )
626 );
627
628 $column_index = [ 'false' => '' ];
629 $column_label = [ 'false' => '' ];
630 if ( ! empty( $this->__series ) ) {
631 foreach ( $this->__series as $key => $column ) {
632 $column_type = isset( $column['type'] ) ? $column['type'] : '';
633 $label = isset( $column['label'] ) ? $column['label'] : '';
634 $column_label[ $label ] = $label;
635 $column_index[ $key ] = sprintf( __( '%1$d — Column Type: %2$s ', 'visualizer' ), $key, ucfirst( $column_type ) );
636 }
637 }
638
639 self::_renderSelectItem(
640 esc_html__( 'Filter By Column Index', 'visualizer' ),
641 'controls[filterColumnIndex]',
642 isset( $this->controls['filterColumnIndex'] ) ? $this->controls['filterColumnIndex'] : '',
643 $column_index,
644 '',
645 false,
646 array( 'vz-controls-opt' )
647 );
648
649 self::_renderSelectItem(
650 esc_html__( 'Filter By Column Label', 'visualizer' ),
651 'controls[filterColumnLabel]',
652 ! empty( $this->controls['filterColumnLabel'] ) ? $this->controls['filterColumnLabel'] : '',
653 $column_label,
654 '',
655 false,
656 array( 'vz-controls-opt' )
657 );
658
659 self::_renderSelectItem(
660 esc_html__( 'Use Formatted Value', 'visualizer' ),
661 'controls[useFormattedValue]',
662 ! empty( $this->controls['useFormattedValue'] ) ? $this->controls['useFormattedValue'] : '',
663 array(
664 'false' => esc_html__( 'False', 'visualizer' ),
665 'true' => esc_html__( 'True', 'visualizer' ),
666 ),
667 '',
668 false
669 );
670
671 self::_renderTextItem(
672 esc_html__( 'Min Value', 'visualizer' ),
673 'controls[minValue]',
674 ! empty( $this->controls['minValue'] ) ? $this->controls['minValue'] : '',
675 esc_html__( 'Minimum allowed value for the range lower extent.', 'visualizer' ),
676 '',
677 'text'
678 );
679
680 self::_renderTextItem(
681 esc_html__( 'Max Value', 'visualizer' ),
682 'controls[maxValue]',
683 ! empty( $this->controls['maxValue'] ) ? $this->controls['maxValue'] : '',
684 esc_html__( 'Maximum allowed value for the range higher extent.', 'visualizer' ),
685 '',
686 'text'
687 );
688
689 self::_renderSelectItem(
690 esc_html__( 'Match Type', 'visualizer' ),
691 'controls[matchType]',
692 ! empty( $this->controls['matchType'] ) ? $this->controls['matchType'] : '',
693 array(
694 'prefix' => esc_html__( 'Prefix', 'visualizer' ),
695 'exact' => esc_html__( 'Exact', 'visualizer' ),
696 'any' => esc_html__( 'Any', 'visualizer' ),
697 ),
698 '',
699 false
700 );
701
702 self::_renderSelectItem(
703 esc_html__( 'Case Sensitive', 'visualizer' ),
704 'controls[caseSensitive]',
705 ! empty( $this->controls['caseSensitive'] ) ? $this->controls['caseSensitive'] : '',
706 array(
707 'false' => esc_html__( 'False', 'visualizer' ),
708 'true' => esc_html__( 'True', 'visualizer' ),
709 ),
710 '',
711 false
712 );
713
714 self::_renderSectionEnd();
715
716 self::_renderSectionStart( esc_html__( 'UI Options', 'visualizer' ), false );
717
718 self::_renderTextItem(
719 esc_html__( 'Label', 'visualizer' ),
720 'controls[ui][label]',
721 ! empty( $this->controls['ui']['label'] ) ? $this->controls['ui']['label'] : '',
722 '',
723 '',
724 'text'
725 );
726
727 self::_renderTextItem(
728 esc_html__( 'Label Separator', 'visualizer' ),
729 'controls[ui][labelSeparator]',
730 ! empty( $this->controls['ui']['labelSeparator'] ) ? $this->controls['ui']['labelSeparator'] : '',
731 '',
732 '',
733 'text'
734 );
735
736 self::_renderTextItem(
737 esc_html__( 'Caption', 'visualizer' ),
738 'controls[ui][caption]',
739 ! empty( $this->controls['ui']['caption'] ) ? $this->controls['ui']['caption'] : '',
740 '',
741 '',
742 'text'
743 );
744
745 self::_renderSelectItem(
746 esc_html__( 'Label Stacking', 'visualizer' ),
747 'controls[ui][labelStacking]',
748 ! empty( $this->controls['ui']['labelStacking'] ) ? $this->controls['ui']['labelStacking'] : '',
749 array(
750 'horizontal' => esc_html__( 'Horizontal', 'visualizer' ),
751 'vertical' => esc_html__( 'Vertical', 'visualizer' ),
752 ),
753 '',
754 false
755 );
756
757 self::_renderSelectItem(
758 esc_html__( 'Orientation', 'visualizer' ),
759 'controls[ui][orientation]',
760 ! empty( $this->controls['ui']['orientation'] ) ? $this->controls['ui']['orientation'] : '',
761 array(
762 'horizontal' => esc_html__( 'Horizontal', 'visualizer' ),
763 'vertical' => esc_html__( 'Vertical', 'visualizer' ),
764 ),
765 '',
766 false
767 );
768
769 self::_renderSelectItem(
770 esc_html__( 'Show Range Values', 'visualizer' ),
771 'controls[showRangeValues]',
772 ! empty( $this->controls['showRangeValues'] ) ? $this->controls['showRangeValues'] : '',
773 array(
774 'true' => esc_html__( 'True', 'visualizer' ),
775 'false' => esc_html__( 'False', 'visualizer' ),
776 ),
777 '',
778 false
779 );
780
781 self::_renderSelectItem(
782 esc_html__( 'Allow Multiple', 'visualizer' ),
783 'controls[allowMultiple]',
784 ! empty( $this->controls['allowMultiple'] ) ? $this->controls['allowMultiple'] : '',
785 array(
786 'true' => esc_html__( 'True', 'visualizer' ),
787 'false' => esc_html__( 'False', 'visualizer' ),
788 ),
789 '',
790 false
791 );
792
793 self::_renderSelectItem(
794 esc_html__( 'Allow Typing', 'visualizer' ),
795 'controls[allowTyping]',
796 ! empty( $this->controls['allowTyping'] ) ? $this->controls['allowTyping'] : '',
797 array(
798 'true' => esc_html__( 'True', 'visualizer' ),
799 'false' => esc_html__( 'False', 'visualizer' ),
800 ),
801 '',
802 false
803 );
804 self::_renderSectionEnd();
805 }
806 }
807