WordPress Charts and Graphs Lite - Version 3.8.0

Version Description

Download this release

Release Info

Developer themeisle
Plugin Icon WordPress Charts and Graphs Lite
Version 3.8.0
Comparing to
See all releases

Code changes from version 3.7.12 to 3.8.0

CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
 
 
 
 
1
  ##### [Version 3.7.12](https://github.com/Codeinwp/visualizer/compare/v3.7.11...v3.7.12) (2022-09-07)
2
 
3
  - Fixed compatibility issue with some themes and plugins [#933](https://github.com/Codeinwp/visualizer/issues/933)
1
+ #### [Version 3.8.0](https://github.com/Codeinwp/visualizer/compare/v3.7.12...v3.8.0) (2022-09-21)
2
+
3
+ - Add data filter support for the charts
4
+
5
  ##### [Version 3.7.12](https://github.com/Codeinwp/visualizer/compare/v3.7.11...v3.7.12) (2022-09-07)
6
 
7
  - Fixed compatibility issue with some themes and plugins [#933](https://github.com/Codeinwp/visualizer/issues/933)
classes/Visualizer/Module/Chart.php CHANGED
@@ -737,7 +737,7 @@ class Visualizer_Module_Chart extends Visualizer_Module {
737
  $title = $this->_chart->ID;
738
  }
739
  $settings['internal_title'] = $title;
740
- $settings_label = $settings['pieResidueSliceLabel'];
741
  if ( empty( $settings_label ) ) {
742
  $settings['pieResidueSliceLabel'] = esc_html__( 'Other', 'visualizer' );
743
  } else {
737
  $title = $this->_chart->ID;
738
  }
739
  $settings['internal_title'] = $title;
740
+ $settings_label = isset( $settings['pieResidueSliceLabel'] ) ? $settings['pieResidueSliceLabel'] : '';
741
  if ( empty( $settings_label ) ) {
742
  $settings['pieResidueSliceLabel'] = esc_html__( 'Other', 'visualizer' );
743
  } else {
classes/Visualizer/Module/Frontend.php CHANGED
@@ -395,6 +395,19 @@ class Visualizer_Module_Frontend extends Visualizer_Module {
395
  unset( $settings['chart-img'] );
396
  }
397
 
 
 
 
 
 
 
 
 
 
 
 
 
 
398
  // add chart to the array
399
  $this->_charts[ $id ] = array(
400
  'type' => $type,
@@ -478,8 +491,11 @@ class Visualizer_Module_Frontend extends Visualizer_Module {
478
  if ( $type === 'tabular' ) {
479
  $prefix = 'T' . 'a' . 'bl' . 'e';
480
  }
 
 
 
481
  // return placeholder div
482
- return '<div class="' . $container_class . '">' . $actions_div . '<div id="' . $id . '"' . $this->getHtmlAttributes( $attributes ) . '></div>' . $this->addSchema( $chart->ID ) . ( ! Visualizer_Module::is_pro() ? ( '<' . 'di' . 'v st' . 'yl' . 'e="' . 'op' . 'a' . 'ci' . 't' . 'y:' . '0' . '.7' . ';t' . 'ex' . 't-a' . 'li' . 'gn:' . 'ri' . 'gh' . 't;b' . 'o' . 'tto' . 'm: 1' . '0px; z-i' . 'nd' . 'ex:1' . '00' . '0; ' . 'le' . 'ft' . ':2' . '0px' . '; fo' . 'nt-si' . 'ze: 1' . '4px">' . $prefix . ' b' . 'y' . ' <a ' . 'h' . 're' . 'f="ht' . 'tp' . 's:/' . '/t' . 'he' . 'me' . 'i' . 'sl' . 'e' . '.c' . 'om' . '/p' . 'lu' . 'gi' . 'ns' . '/v' . 'i' . 'su' . 'al' . 'iz' . 'er' . '-c' . 'ha' . 'rts' . '-a' . 'nd' . '-gr' . 'ap' . 'hs' . '/" t' . 'arg' . 'et="' . '_bl' . 'an' . 'k" re' . 'l=' . '"no' . 'fol' . 'l' . 'ow"' . '>V' . 'is' . 'u' . 'a' . 'l' . 'i' . 'z' . 'e' . 'r' . '</' . 'a' . '>' . '<' . '/' . 'd' . 'i' . 'v' . '>' ) : '' ) . '</div>';
483
  }
484
 
485
  /**
395
  unset( $settings['chart-img'] );
396
  }
397
 
398
+ $enable_controls = false;
399
+ if ( isset( $settings['controls'] ) && ! empty( $settings['controls']['controlType'] ) ) {
400
+ $column_index = $settings['controls']['filterColumnIndex'];
401
+ $column_label = $settings['controls']['filterColumnLabel'];
402
+ if ( 'false' !== $column_index || 'false' !== $column_label ) {
403
+ $enable_controls = true;
404
+ }
405
+ }
406
+
407
+ if ( ! $enable_controls ) {
408
+ unset( $settings['controls'] );
409
+ }
410
+
411
  // add chart to the array
412
  $this->_charts[ $id ] = array(
413
  'type' => $type,
491
  if ( $type === 'tabular' ) {
492
  $prefix = 'T' . 'a' . 'bl' . 'e';
493
  }
494
+ if ( Visualizer_Module::is_pro() && $enable_controls ) {
495
+ $actions_div .= '<div id="control_wrapper_' . $id . '"></div>';
496
+ }
497
  // return placeholder div
498
+ return '<div class="' . $container_class . '" id="chart_wrapper_' . $id . '">' . $actions_div . '<div id="' . $id . '"' . $this->getHtmlAttributes( $attributes ) . '></div>' . $this->addSchema( $chart->ID ) . ( ! Visualizer_Module::is_pro() ? ( '<' . 'di' . 'v st' . 'yl' . 'e="' . 'op' . 'a' . 'ci' . 't' . 'y:' . '0' . '.7' . ';t' . 'ex' . 't-a' . 'li' . 'gn:' . 'ri' . 'gh' . 't;b' . 'o' . 'tto' . 'm: 1' . '0px; z-i' . 'nd' . 'ex:1' . '00' . '0; ' . 'le' . 'ft' . ':2' . '0px' . '; fo' . 'nt-si' . 'ze: 1' . '4px">' . $prefix . ' b' . 'y' . ' <a ' . 'h' . 're' . 'f="ht' . 'tp' . 's:/' . '/t' . 'he' . 'me' . 'i' . 'sl' . 'e' . '.c' . 'om' . '/p' . 'lu' . 'gi' . 'ns' . '/v' . 'i' . 'su' . 'al' . 'iz' . 'er' . '-c' . 'ha' . 'rts' . '-a' . 'nd' . '-gr' . 'ap' . 'hs' . '/" t' . 'arg' . 'et="' . '_bl' . 'an' . 'k" re' . 'l=' . '"no' . 'fol' . 'l' . 'ow"' . '>V' . 'is' . 'u' . 'a' . 'l' . 'i' . 'z' . 'e' . 'r' . '</' . 'a' . '>' . '<' . '/' . 'd' . 'i' . 'v' . '>' ) : '' ) . '</div>';
499
  }
500
 
501
  /**
classes/Visualizer/Plugin.php CHANGED
@@ -28,7 +28,7 @@
28
  class Visualizer_Plugin {
29
 
30
  const NAME = 'visualizer';
31
- const VERSION = '3.7.12';
32
 
33
  // custom post types
34
  const CPT_VISUALIZER = 'visualizer';
28
  class Visualizer_Plugin {
29
 
30
  const NAME = 'visualizer';
31
+ const VERSION = '3.8.0';
32
 
33
  // custom post types
34
  const CPT_VISUALIZER = 'visualizer';
classes/Visualizer/Render/Library.php CHANGED
@@ -233,11 +233,20 @@ class Visualizer_Render_Library extends Visualizer_Render {
233
  foreach ( $this->charts as $placeholder_id => $chart ) {
234
  // show the sidebar after the first 3 charts.
235
  $count++;
 
 
 
 
 
 
 
 
 
236
  if ( 3 === $count ) {
237
  $this->_renderSidebar();
238
- $this->_renderChartBox( $placeholder_id, $chart['id'] );
239
  } else {
240
- $this->_renderChartBox( $placeholder_id, $chart['id'] );
241
  }
242
  }
243
  // show the sidebar if there are less than 3 charts.
@@ -282,7 +291,7 @@ class Visualizer_Render_Library extends Visualizer_Render {
282
  * @param string $placeholder_id The placeholder's id for the chart.
283
  * @param int $chart_id The id of the chart.
284
  */
285
- private function _renderChartBox( $placeholder_id, $chart_id ) {
286
  $settings = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS );
287
  $title = '#' . $chart_id;
288
  if ( ! empty( $settings[0]['title'] ) ) {
@@ -336,9 +345,16 @@ class Visualizer_Render_Library extends Visualizer_Render {
336
  }
337
  $shortcode = sprintf( '[visualizer id="%s" lazy="no" class=""]', $chart_id );
338
  echo '<div class="items"><div class="visualizer-chart"><div class="visualizer-chart-title">', esc_html( $title ), '</div>';
 
 
 
 
339
  echo '<div id="', $placeholder_id, '" class="visualizer-chart-canvas">';
340
  echo '<img src="', VISUALIZER_ABSURL, 'images/ajax-loader.gif" class="loader">';
341
  echo '</div>';
 
 
 
342
  echo '<div class="visualizer-chart-footer visualizer-clearfix">';
343
  echo '<a class="visualizer-chart-action visualizer-chart-delete" href="', $delete_url, '" title="', esc_attr__( 'Delete', 'visualizer' ), '" onclick="return showNotice.warn();"></a>';
344
  echo '<a class="visualizer-chart-action visualizer-chart-clone" href="', $clone_url, '" title="', esc_attr__( 'Clone', 'visualizer' ), '"></a>';
233
  foreach ( $this->charts as $placeholder_id => $chart ) {
234
  // show the sidebar after the first 3 charts.
235
  $count++;
236
+ $enable_controls = false;
237
+ $settings = isset( $chart['settings'] ) ? $chart['settings'] : array();
238
+ if ( ! empty( $settings['controls']['controlType'] ) ) {
239
+ $column_index = $settings['controls']['filterColumnIndex'];
240
+ $column_label = $settings['controls']['filterColumnLabel'];
241
+ if ( 'false' !== $column_index || 'false' !== $column_label ) {
242
+ $enable_controls = true;
243
+ }
244
+ }
245
  if ( 3 === $count ) {
246
  $this->_renderSidebar();
247
+ $this->_renderChartBox( $placeholder_id, $chart['id'], $enable_controls );
248
  } else {
249
+ $this->_renderChartBox( $placeholder_id, $chart['id'], $enable_controls );
250
  }
251
  }
252
  // show the sidebar if there are less than 3 charts.
291
  * @param string $placeholder_id The placeholder's id for the chart.
292
  * @param int $chart_id The id of the chart.
293
  */
294
+ private function _renderChartBox( $placeholder_id, $chart_id, $with_filter = false ) {
295
  $settings = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS );
296
  $title = '#' . $chart_id;
297
  if ( ! empty( $settings[0]['title'] ) ) {
345
  }
346
  $shortcode = sprintf( '[visualizer id="%s" lazy="no" class=""]', $chart_id );
347
  echo '<div class="items"><div class="visualizer-chart"><div class="visualizer-chart-title">', esc_html( $title ), '</div>';
348
+ if ( Visualizer_Module::is_pro() && $with_filter ) {
349
+ echo '<div id="chart_wrapper_' . $placeholder_id . '">';
350
+ echo '<div id="control_wrapper_' . $placeholder_id . '" class="vz-library-chart-filter"></div>';
351
+ }
352
  echo '<div id="', $placeholder_id, '" class="visualizer-chart-canvas">';
353
  echo '<img src="', VISUALIZER_ABSURL, 'images/ajax-loader.gif" class="loader">';
354
  echo '</div>';
355
+ if ( Visualizer_Module::is_pro() && $with_filter ) {
356
+ echo '</div>';
357
+ }
358
  echo '<div class="visualizer-chart-footer visualizer-clearfix">';
359
  echo '<a class="visualizer-chart-action visualizer-chart-delete" href="', $delete_url, '" title="', esc_attr__( 'Delete', 'visualizer' ), '" onclick="return showNotice.warn();"></a>';
360
  echo '<a class="visualizer-chart-action visualizer-chart-clone" href="', $clone_url, '" title="', esc_attr__( 'Clone', 'visualizer' ), '"></a>';
classes/Visualizer/Render/Page/Data.php CHANGED
@@ -57,9 +57,16 @@ class Visualizer_Render_Page_Data extends Visualizer_Render_Page {
57
  $this->add_additional_content();
58
 
59
  // Added by Ash/Upwork
 
 
 
 
60
  echo '<div id="canvas">';
61
  echo '<img src="', VISUALIZER_ABSURL, 'images/ajax-loader.gif" class="loader">';
62
  echo '</div>';
 
 
 
63
  echo $this->custom_css;
64
  }
65
 
57
  $this->add_additional_content();
58
 
59
  // Added by Ash/Upwork
60
+ if ( Visualizer_Module::is_pro() ) {
61
+ echo '<div id="chart_wrapper_canvas">';
62
+ echo '<div id="control_wrapper_canvas"></div>';
63
+ }
64
  echo '<div id="canvas">';
65
  echo '<img src="', VISUALIZER_ABSURL, 'images/ajax-loader.gif" class="loader">';
66
  echo '</div>';
67
+ if ( Visualizer_Module::is_pro() ) {
68
+ echo '</div>';
69
+ }
70
  echo $this->custom_css;
71
  }
72
 
classes/Visualizer/Render/Sidebar.php CHANGED
@@ -158,6 +158,9 @@ abstract class Visualizer_Render_Sidebar extends Visualizer_Render {
158
  * @access protected
159
  */
160
  protected function _renderAdvancedSettings() {
 
 
 
161
  if ( Visualizer_Module_Admin::proFeaturesLocked() ) {
162
  self::_renderGroupStart( esc_html__( 'Frontend Actions', 'visualizer' ) );
163
  } else {
@@ -345,14 +348,15 @@ abstract class Visualizer_Render_Sidebar extends Visualizer_Render {
345
  * @param string $type The type for the input (out of number, email, tel etc., default is text).
346
  * @param array $custom_attributes The custom attributes.
347
  */
348
- protected static function _renderTextItem( $title, $name, $value, $desc, $placeholder = '', $type = 'text', $custom_attributes = array() ) {
349
  $attributes = '';
350
  if ( $custom_attributes ) {
351
  foreach ( $custom_attributes as $k => $v ) {
352
  $attributes .= ' ' . $k . '="' . esc_attr( $v ) . '"';
353
  }
354
  }
355
- echo '<div class="viz-section-item">';
 
356
  echo '<a class="more-info" href="javascript:;">[?]</a>';
357
  echo '<b>', $title, '</b>';
358
  echo '<input type="', $type, '" class="control-text" ', $attributes, ' name="', $name, '" value="', esc_attr( $value ), '" placeholder="', $placeholder, '">';
@@ -567,4 +571,236 @@ abstract class Visualizer_Render_Sidebar extends Visualizer_Render {
567
  );
568
  self::_renderSectionEnd();
569
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
570
  }
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 {
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, '">';
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
  }
css/frame.css CHANGED
@@ -17,7 +17,16 @@
17
  bottom: 10px;
18
  left: 10px;
19
  }
20
-
 
 
 
 
 
 
 
 
 
21
  .loader {
22
  position: absolute;
23
  top: 50%;
@@ -1528,6 +1537,6 @@ canvas.chartjs-render-monitor {
1528
  /******************************************************************************/
1529
  /******************************** Frontend Actions ***********************************/
1530
  /******************************************************************************/
1531
- #vz-frontend-actions .only-pro-inner {
1532
  text-align: center;
1533
  }
17
  bottom: 10px;
18
  left: 10px;
19
  }
20
+ #control_wrapper_canvas:not(:empty) {
21
+ margin: 15px 0 0 5px;
22
+ }
23
+ #control_wrapper_canvas:not(:empty) + #canvas {
24
+ top: 55px;
25
+ left: 50px;
26
+ }
27
+ .goog-combobox input {
28
+ min-height: auto;
29
+ }
30
  .loader {
31
  position: absolute;
32
  top: 50%;
1537
  /******************************************************************************/
1538
  /******************************** Frontend Actions ***********************************/
1539
  /******************************************************************************/
1540
+ #vz-frontend-actions .only-pro-inner, #vz-data-controls .only-pro-inner {
1541
  text-align: center;
1542
  }
css/library.css CHANGED
@@ -424,6 +424,17 @@ div#visualizer-types ul, div#visualizer-types form p {
424
  color: red;
425
  cursor: pointer;
426
  }
 
 
 
 
 
 
 
 
 
 
 
427
  @media (-webkit-min-device-pixel-ratio: 2) and (min-width: 1000px) and (max-width: 1600px) {
428
  #visualizer-sidebar.one-columns .visualizer-sidebar-box ul li:nth-child(+n+7) {
429
  display: none;
424
  color: red;
425
  cursor: pointer;
426
  }
427
+ .goog-combobox input {
428
+ min-height: auto;
429
+ }
430
+ .vz-library-chart-filter:not(:empty) {
431
+ background-color: #ffffff;
432
+ padding: 5px 0 5px 5px;
433
+ border: 1px solid #ddd;
434
+ }
435
+ .google-visualization-controls-rangefilter {
436
+ white-space: inherit !important;
437
+ }
438
  @media (-webkit-min-device-pixel-ratio: 2) and (min-width: 1000px) and (max-width: 1600px) {
439
  #visualizer-sidebar.one-columns .visualizer-sidebar-box ul li:nth-child(+n+7) {
440
  display: none;
css/media.css CHANGED
@@ -1,5 +1,5 @@
1
  /*
2
- Version: 3.7.12
3
  */
4
  #visualizer-library-view {
5
  padding: 30px 10px 10px 30px;
1
  /*
2
+ Version: 3.8.0
3
  */
4
  #visualizer-library-view {
5
  padding: 30px 10px 10px 30px;
index.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Visualizer: Tables and Charts for WordPress
4
  Plugin URI: https://themeisle.com/plugins/visualizer-charts-and-graphs-lite/
5
  Description: A simple, easy to use and quite powerful tool to create, manage and embed interactive charts into your WordPress posts and pages. The plugin uses Google Visualization API to render charts, which supports cross-browser compatibility (adopting VML for older IE versions) and cross-platform portability to iOS and new Android releases.
6
- Version: 3.7.12
7
  Author: Themeisle
8
  Author URI: http://themeisle.com
9
  Requires at least: 3.5
3
  Plugin Name: Visualizer: Tables and Charts for WordPress
4
  Plugin URI: https://themeisle.com/plugins/visualizer-charts-and-graphs-lite/
5
  Description: A simple, easy to use and quite powerful tool to create, manage and embed interactive charts into your WordPress posts and pages. The plugin uses Google Visualization API to render charts, which supports cross-browser compatibility (adopting VML for older IE versions) and cross-platform portability to iOS and new Android releases.
6
+ Version: 3.8.0
7
  Author: Themeisle
8
  Author URI: http://themeisle.com
9
  Requires at least: 3.5
js/preview.js CHANGED
@@ -25,6 +25,21 @@
25
  vizSettingsHaveChanged(false);
26
  };
27
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  $('#settings-button').click(function() {
29
  $('#settings-form').submit();
30
  });
@@ -42,6 +57,7 @@
42
  // this portion captures if the settings have changed so that tabs can handle that information.
43
 
44
  function updateChart() {
 
45
  clearTimeout(timeout);
46
  timeout = setTimeout(function() {
47
  var settings = $('#settings-form').serializeObject();
@@ -52,7 +68,7 @@
52
  v.charts.canvas.settings = settings;
53
  $('body').trigger('visualizer:render:currentchart:update', {visualizer: v});
54
  vizSettingsHaveChanged(true);
55
- }, 1000);
56
  }
57
 
58
  function validateJSON() {
25
  vizSettingsHaveChanged(false);
26
  };
27
 
28
+ // Update google chart filter control.
29
+ window.vizUpdateFilterControl = function() {
30
+ $( '#control_wrapper_canvas' ).removeClass( 'no-filter' );
31
+ var controlsOpt = $( '.vz-controls-opt' ).map(
32
+ function() {
33
+ var val = $(this).val();
34
+ return '' !== val && 'false' !== val ? val : false ;
35
+ }
36
+ ).get();
37
+ controlsOpt = controlsOpt.filter( function(el) { return el; } );
38
+ if ( controlsOpt.length === 0 ) {
39
+ $( '#control_wrapper_canvas' ).addClass( 'no-filter' ).html('');
40
+ }
41
+ }
42
+
43
  $('#settings-button').click(function() {
44
  $('#settings-form').submit();
45
  });
57
  // this portion captures if the settings have changed so that tabs can handle that information.
58
 
59
  function updateChart() {
60
+ vizUpdateFilterControl();
61
  clearTimeout(timeout);
62
  timeout = setTimeout(function() {
63
  var settings = $('#settings-form').serializeObject();
68
  v.charts.canvas.settings = settings;
69
  $('body').trigger('visualizer:render:currentchart:update', {visualizer: v});
70
  vizSettingsHaveChanged(true);
71
+ }, 1500);
72
  }
73
 
74
  function validateJSON() {
js/render-facade.js CHANGED
@@ -136,7 +136,7 @@ var vizClipboard1=null;
136
 
137
  function displayChartsOnFrontEnd() {
138
  // display all charts that are NOT to be lazy-loaded.
139
- $( 'div.viz-facade-loaded:not(.visualizer-lazy):empty' ).removeClass( 'viz-facade-loaded' );
140
  $('div.visualizer-front:not(.visualizer-lazy):not(.viz-facade-loaded)').each(function(index, element){
141
  if ( $(element).is(':visible') ) {
142
  var id = $(element).addClass('viz-facade-loaded').attr('id');
136
 
137
  function displayChartsOnFrontEnd() {
138
  // display all charts that are NOT to be lazy-loaded.
139
+ $( 'div.viz-facade-loaded:not(.visualizer-lazy):not(.visualizer-cw-error):empty' ).removeClass( 'viz-facade-loaded' );
140
  $('div.visualizer-front:not(.visualizer-lazy):not(.viz-facade-loaded)').each(function(index, element){
141
  if ( $(element).is(':visible') ) {
142
  var id = $(element).addClass('viz-facade-loaded').attr('id');
js/render-google.js CHANGED
@@ -4,6 +4,7 @@
4
 
5
  // this will store the images for each chart rendered.
6
  var __visualizer_chart_images = [];
 
7
 
8
  (function($) {
9
  var gv;
@@ -74,7 +75,41 @@ var __visualizer_chart_images = [];
74
  break;
75
  }
76
 
77
- render = new gv[render](container);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  }
79
 
80
  if (settings['animation'] && parseInt(settings['animation']['startup']) === 1)
@@ -329,6 +364,7 @@ var __visualizer_chart_images = [];
329
 
330
  gv.events.addListener(render, 'ready', function () {
331
  var arr = id.split('-');
 
332
  __visualizer_chart_images[ arr[0] + '-' + arr[1] ] = '';
333
 
334
  if (render.container && $(render.container).is(':visible')) {
@@ -362,8 +398,22 @@ var __visualizer_chart_images = [];
362
  }
363
  });
364
 
365
- $('body').trigger('visualizer:chart:settings:extend', {id: id, chart: chart, settings: settings, data: table});
366
- render.draw(table, settings);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
367
  }
368
 
369
  function format_data(id, table, type, format, index) {
@@ -509,6 +559,7 @@ var __visualizer_chart_images = [];
509
 
510
  objects = {};
511
  if ( 'object' === typeof google ) {
 
512
  google.load( 'visualization', 'current', {packages: $chart_types, mapsApiKey: v.map_api_key, 'language' : v.language,
513
  callback: function () {
514
  gv = google.visualization;
4
 
5
  // this will store the images for each chart rendered.
6
  var __visualizer_chart_images = [];
7
+ var chartWrapperError = [];
8
 
9
  (function($) {
10
  var gv;
75
  break;
76
  }
77
 
78
+ var controlWrapperElement = document.getElementById( "control_wrapper_" + id ) || null;
79
+ var withControlMode = typeof settings.controls !== 'undefined' && controlWrapperElement ? true : false;
80
+
81
+ if ( $( controlWrapperElement ).hasClass( 'no-filter' ) ) {
82
+ withControlMode = false;
83
+ }
84
+ if ( withControlMode ) {
85
+ // Chart wrapper.
86
+ render = new gv.ChartWrapper({
87
+ 'chartType': render,
88
+ 'containerId': id,
89
+ });
90
+ // Chart dashboard wrapper.
91
+ var chartWrapperElement = document.getElementById( "chart_wrapper_" + id ) || null;
92
+ var chartWrapper = new gv.Dashboard( chartWrapperElement );
93
+
94
+ // Error Handler.
95
+ gv.events.addListener(chartWrapper, 'error', function ( err ) {
96
+ if ( chartWrapperError.length === 0 ) {
97
+ chartWrapperError.push( err );
98
+ gv.errors.removeError( err.id );
99
+ var chartContainer = $( chartWrapperElement ).find( '.visualizer-front' );
100
+ if ( chartContainer && chartContainer.is(':visible')) {
101
+ if (chartContainer.parents('div').next( '#sidebar' ).length === 0) {
102
+ chartContainer.addClass( 'visualizer-chart-loaded' ).addClass( 'visualizer-cw-error' );
103
+ $( chartWrapperElement ).addClass( 'visualizer-cw-error' );
104
+ }
105
+ }
106
+ } else {
107
+ gv.errors.removeError( err.id );
108
+ }
109
+ } );
110
+ } else {
111
+ render = new gv[render](container);
112
+ }
113
  }
114
 
115
  if (settings['animation'] && parseInt(settings['animation']['startup']) === 1)
364
 
365
  gv.events.addListener(render, 'ready', function () {
366
  var arr = id.split('-');
367
+ render = typeof render.getChart !== 'undefined' ? render.getChart() : render;
368
  __visualizer_chart_images[ arr[0] + '-' + arr[1] ] = '';
369
 
370
  if (render.container && $(render.container).is(':visible')) {
398
  }
399
  });
400
 
401
+ if ( withControlMode ) {
402
+ // Create a control wrapper, passing some options.
403
+ var controlWrapper = new gv.ControlWrapper( {
404
+ containerId: 'control_wrapper_' + id,
405
+ controlType: settings.controls.controlType,
406
+ 'options': settings.controls,
407
+ } );
408
+
409
+ $('body').trigger('visualizer:chart:settings:extend', {id: id, chart: chart, settings: settings, data: table});
410
+ render.setOptions(settings);
411
+ chartWrapper.bind(controlWrapper, render);
412
+ chartWrapper.draw(table);
413
+ } else {
414
+ $('body').trigger('visualizer:chart:settings:extend', {id: id, chart: chart, settings: settings, data: table});
415
+ render.draw(table, settings);
416
+ }
417
  }
418
 
419
  function format_data(id, table, type, format, index) {
559
 
560
  objects = {};
561
  if ( 'object' === typeof google ) {
562
+ $chart_types.push( 'controls' );
563
  google.load( 'visualization', 'current', {packages: $chart_types, mapsApiKey: v.map_api_key, 'language' : v.language,
564
  callback: function () {
565
  gv = google.visualization;
readme.txt CHANGED
@@ -163,6 +163,13 @@ Pay attention that to turn your shortcodes into graphs, your theme has to have `
163
 
164
  == Changelog ==
165
 
 
 
 
 
 
 
 
166
  ##### [Version 3.7.12](https://github.com/Codeinwp/visualizer/compare/v3.7.11...v3.7.12) (2022-09-07)
167
 
168
  - Fixed compatibility issue with some themes and plugins [#933](https://github.com/Codeinwp/visualizer/issues/933)
163
 
164
  == Changelog ==
165
 
166
+ #### [Version 3.8.0](https://github.com/Codeinwp/visualizer/compare/v3.7.12...v3.8.0) (2022-09-21)
167
+
168
+ - Add data filter support for the charts
169
+
170
+
171
+
172
+
173
  ##### [Version 3.7.12](https://github.com/Codeinwp/visualizer/compare/v3.7.11...v3.7.12) (2022-09-07)
174
 
175
  - Fixed compatibility issue with some themes and plugins [#933](https://github.com/Codeinwp/visualizer/issues/933)
vendor/autoload.php CHANGED
@@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
9
 
10
  require_once __DIR__ . '/composer/autoload_real.php';
11
 
12
- return ComposerAutoloaderInit029ba404fa8b9712b812578058163e47::getLoader();
9
 
10
  require_once __DIR__ . '/composer/autoload_real.php';
11
 
12
+ return ComposerAutoloaderInit3e3d69c83300df91e8287efcde552641::getLoader();
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit029ba404fa8b9712b812578058163e47
6
  {
7
  private static $loader;
8
 
@@ -24,18 +24,18 @@ class ComposerAutoloaderInit029ba404fa8b9712b812578058163e47
24
 
25
  require __DIR__ . '/platform_check.php';
26
 
27
- spl_autoload_register(array('ComposerAutoloaderInit029ba404fa8b9712b812578058163e47', 'loadClassLoader'), true, true);
28
  self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
29
- spl_autoload_unregister(array('ComposerAutoloaderInit029ba404fa8b9712b812578058163e47', 'loadClassLoader'));
30
 
31
  require __DIR__ . '/autoload_static.php';
32
- call_user_func(\Composer\Autoload\ComposerStaticInit029ba404fa8b9712b812578058163e47::getInitializer($loader));
33
 
34
  $loader->register(true);
35
 
36
- $includeFiles = \Composer\Autoload\ComposerStaticInit029ba404fa8b9712b812578058163e47::$files;
37
  foreach ($includeFiles as $fileIdentifier => $file) {
38
- composerRequire029ba404fa8b9712b812578058163e47($fileIdentifier, $file);
39
  }
40
 
41
  return $loader;
@@ -47,7 +47,7 @@ class ComposerAutoloaderInit029ba404fa8b9712b812578058163e47
47
  * @param string $file
48
  * @return void
49
  */
50
- function composerRequire029ba404fa8b9712b812578058163e47($fileIdentifier, $file)
51
  {
52
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
53
  $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit3e3d69c83300df91e8287efcde552641
6
  {
7
  private static $loader;
8
 
24
 
25
  require __DIR__ . '/platform_check.php';
26
 
27
+ spl_autoload_register(array('ComposerAutoloaderInit3e3d69c83300df91e8287efcde552641', 'loadClassLoader'), true, true);
28
  self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
29
+ spl_autoload_unregister(array('ComposerAutoloaderInit3e3d69c83300df91e8287efcde552641', 'loadClassLoader'));
30
 
31
  require __DIR__ . '/autoload_static.php';
32
+ call_user_func(\Composer\Autoload\ComposerStaticInit3e3d69c83300df91e8287efcde552641::getInitializer($loader));
33
 
34
  $loader->register(true);
35
 
36
+ $includeFiles = \Composer\Autoload\ComposerStaticInit3e3d69c83300df91e8287efcde552641::$files;
37
  foreach ($includeFiles as $fileIdentifier => $file) {
38
+ composerRequire3e3d69c83300df91e8287efcde552641($fileIdentifier, $file);
39
  }
40
 
41
  return $loader;
47
  * @param string $file
48
  * @return void
49
  */
50
+ function composerRequire3e3d69c83300df91e8287efcde552641($fileIdentifier, $file)
51
  {
52
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
53
  $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit029ba404fa8b9712b812578058163e47
8
  {
9
  public static $files = array (
10
  'abede361264e2ae69ec1eee813a101af' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/abs.php',
@@ -356,10 +356,10 @@ class ComposerStaticInit029ba404fa8b9712b812578058163e47
356
  public static function getInitializer(ClassLoader $loader)
357
  {
358
  return \Closure::bind(function () use ($loader) {
359
- $loader->prefixLengthsPsr4 = ComposerStaticInit029ba404fa8b9712b812578058163e47::$prefixLengthsPsr4;
360
- $loader->prefixDirsPsr4 = ComposerStaticInit029ba404fa8b9712b812578058163e47::$prefixDirsPsr4;
361
- $loader->prefixesPsr0 = ComposerStaticInit029ba404fa8b9712b812578058163e47::$prefixesPsr0;
362
- $loader->classMap = ComposerStaticInit029ba404fa8b9712b812578058163e47::$classMap;
363
 
364
  }, null, ClassLoader::class);
365
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit3e3d69c83300df91e8287efcde552641
8
  {
9
  public static $files = array (
10
  'abede361264e2ae69ec1eee813a101af' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/abs.php',
356
  public static function getInitializer(ClassLoader $loader)
357
  {
358
  return \Closure::bind(function () use ($loader) {
359
+ $loader->prefixLengthsPsr4 = ComposerStaticInit3e3d69c83300df91e8287efcde552641::$prefixLengthsPsr4;
360
+ $loader->prefixDirsPsr4 = ComposerStaticInit3e3d69c83300df91e8287efcde552641::$prefixDirsPsr4;
361
+ $loader->prefixesPsr0 = ComposerStaticInit3e3d69c83300df91e8287efcde552641::$prefixesPsr0;
362
+ $loader->classMap = ComposerStaticInit3e3d69c83300df91e8287efcde552641::$classMap;
363
 
364
  }, null, ClassLoader::class);
365
  }
vendor/composer/installed.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php return array(
2
  'root' => array(
3
  'name' => 'codeinwp/visualizer',
4
- 'pretty_version' => 'v3.7.12',
5
- 'version' => '3.7.12.0',
6
- 'reference' => '1818a65d7c53849b5c3670bcd16966d7e09b9809',
7
  'type' => 'wordpress-plugin',
8
  'install_path' => __DIR__ . '/../../',
9
  'aliases' => array(),
@@ -20,9 +20,9 @@
20
  'dev_requirement' => false,
21
  ),
22
  'codeinwp/visualizer' => array(
23
- 'pretty_version' => 'v3.7.12',
24
- 'version' => '3.7.12.0',
25
- 'reference' => '1818a65d7c53849b5c3670bcd16966d7e09b9809',
26
  'type' => 'wordpress-plugin',
27
  'install_path' => __DIR__ . '/../../',
28
  'aliases' => array(),
1
  <?php return array(
2
  'root' => array(
3
  'name' => 'codeinwp/visualizer',
4
+ 'pretty_version' => 'v3.8.0',
5
+ 'version' => '3.8.0.0',
6
+ 'reference' => '39af88c37fe57aefde0901c99788cd8c02631bee',
7
  'type' => 'wordpress-plugin',
8
  'install_path' => __DIR__ . '/../../',
9
  'aliases' => array(),
20
  'dev_requirement' => false,
21
  ),
22
  'codeinwp/visualizer' => array(
23
+ 'pretty_version' => 'v3.8.0',
24
+ 'version' => '3.8.0.0',
25
+ 'reference' => '39af88c37fe57aefde0901c99788cd8c02631bee',
26
  'type' => 'wordpress-plugin',
27
  'install_path' => __DIR__ . '/../../',
28
  'aliases' => array(),