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

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