Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion classes/Visualizer/Module.php
Original file line number Diff line number Diff line change
Expand Up @@ -732,7 +732,7 @@ public static function can_show_feature( $feature ) {
public static final function get_features_for_license( $plan ) {
switch ( $plan ) {
case 1:
return array( 'import-wp', 'db-query' );
return array( 'import-wp', 'db-query', 'import-wc-report' );
case 2:
return array( 'schedule-chart', 'chart-permissions' );
}
Expand Down
23 changes: 23 additions & 0 deletions classes/Visualizer/Module/Chart.php
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,20 @@ public function setJsonSchedule() {
)
);

if ( Visualizer_Module::is_pro() ) {
$is_woocommerce_report = filter_input(
INPUT_POST,
'is_woocommerce_report',
FILTER_VALIDATE_BOOLEAN
);

if ( $is_woocommerce_report ) {
update_post_meta( $chart_id, Visualizer_Plugin::CF_IS_WOOCOMMERCE_SOURCE, true );
} else {
delete_post_meta( $chart_id, Visualizer_Plugin::CF_IS_WOOCOMMERCE_SOURCE );
}
}

delete_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE );

if ( -1 < $time ) {
Expand Down Expand Up @@ -246,6 +260,14 @@ public function setJsonData() {
add_post_meta( $chart->ID, Visualizer_Plugin::CF_JSON_PAGING, $params['paging'] );
}

if ( Visualizer_Module::is_pro() ) {
if ( ! empty( $params['vz_woo_source'] ) ) {
update_post_meta( $chart->ID, Visualizer_Plugin::CF_JSON_WOOCOMMERCE_SOURCE, $params['vz_woo_source'] );
} else {
delete_post_meta( $chart->ID, Visualizer_Plugin::CF_JSON_WOOCOMMERCE_SOURCE );
}
}

$time = filter_input(
INPUT_POST,
'time',
Expand Down Expand Up @@ -832,6 +854,7 @@ private function _handleDataAndSettingsPage() {
'json_tag_separator' => Visualizer_Source_Json::TAG_SEPARATOR,
'json_tag_separator_view' => Visualizer_Source_Json::TAG_SEPARATOR_VIEW,
'is_front' => false,
'rest_base' => get_rest_url( null, 'wc/v3/reports/' ),
)
);

Expand Down
20 changes: 13 additions & 7 deletions classes/Visualizer/Module/Frontend.php
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,10 @@ public function renderChart( $atts ) {
return '';
}

if ( ! is_admin() && ! empty( $chart_data['is_woocommerce_report'] ) ) {
return '';
}

// in case revisions exist.
// phpcs:ignore WordPress.CodeAnalysis.AssignmentInCondition.Found
if ( true === ( $revisions = $this->undoRevisions( $chart->ID, true ) ) ) {
Expand Down Expand Up @@ -639,8 +643,9 @@ private function getChartData( $cache_key = '', $chart_id = 0 ) {
// Get chart by ID.
$chart = get_post( $chart_id );
if ( $chart && Visualizer_Plugin::CPT_VISUALIZER === $chart->post_type ) {
$settings = get_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, true );
$series = get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true );
$settings = get_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, true );
$series = get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true );
$is_woocommerce_report = get_post_meta( $chart->ID, Visualizer_Plugin::CF_IS_WOOCOMMERCE_SOURCE, true );

if ( isset( $settings['series'] ) && ! ( count( $settings['series'] ) - count( $series ) > 1 ) ) {
$diff_total_series = abs( count( $settings['series'] ) - count( $series ) );
Expand All @@ -651,11 +656,12 @@ private function getChartData( $cache_key = '', $chart_id = 0 ) {
}
}
$chart_data = array(
'chart' => $chart,
'type' => get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true ),
'settings' => $settings,
'series' => $series,
'chart_image' => get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_IMAGE, true ),
'chart' => $chart,
'type' => get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true ),
'settings' => $settings,
'series' => $series,
'chart_image' => get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_IMAGE, true ),
'is_woocommerce_report' => $is_woocommerce_report,
);

// Put the results in a transient. Expire after 12 hours.
Expand Down
2 changes: 2 additions & 0 deletions classes/Visualizer/Plugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ class Visualizer_Plugin {
const PRO_TEASER_TITLE = 'Check PRO version ';

const CF_CHART_CACHE = 'visualizer-chart-cache';
const CF_JSON_WOOCOMMERCE_SOURCE = 'visualizer-woocommerce-source';
const CF_IS_WOOCOMMERCE_SOURCE = 'visualizer-is-woocommerce-source';

/**
* Name of the option for WordPress DB.
Expand Down
112 changes: 109 additions & 3 deletions classes/Visualizer/Render/Layout.php
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ public static function _renderJsonScreen( $args ) {
)
);

$is_wc_source = get_post_meta( $id, Visualizer_Plugin::CF_IS_WOOCOMMERCE_SOURCE, true );
$url = get_post_meta( $id, Visualizer_Plugin::CF_JSON_URL, true );
$root = get_post_meta( $id, Visualizer_Plugin::CF_JSON_ROOT, true );
$paging = get_post_meta( $id, Visualizer_Plugin::CF_JSON_PAGING, true );
Expand Down Expand Up @@ -171,9 +172,11 @@ public static function _renderJsonScreen( $args ) {
name="url"
value="<?php echo esc_url( $url ); ?>"
placeholder="<?php esc_html_e( 'Please enter the URL', 'visualizer' ); ?>"
class="visualizer-input json-form-element">
class="visualizer-input json-form-element"
<?php echo $is_wc_source ? 'readonly' : ''; ?>
>
<button class="button button-secondary button-small" id="visualizer-json-fetch"><?php esc_html_e( 'Fetch Endpoint', 'visualizer' ); ?></button>

<div class="visualizer-json-subform">
<h3 class="viz-substep <?php echo $headers_open ? 'open' : ''; ?>"><?php _e( 'Headers', 'visualizer' ); ?></h3>
<div class="json-wizard-headers">
Expand Down Expand Up @@ -670,7 +673,12 @@ public static function _renderTabBasic( $args ) {
);

// this will allow us to open the correct source tab by default.
$source_of_chart = strtolower( get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true ) );
$source_of_chart = strtolower( get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true ) );
// Import from woocommerce report.
$is_woocommerce_source = strtolower( get_post_meta( $chart_id, Visualizer_Plugin::CF_IS_WOOCOMMERCE_SOURCE, true ) );
if ( ! empty( $is_woocommerce_source ) ) {
$source_of_chart .= '_wc';
}
// both import from wp and import from db have the same source so we need to differentiate.
$filter_config = get_post_meta( $chart_id, Visualizer_Plugin::CF_FILTER_CONFIG, true );
// if filter config is present, then its import from wp.
Expand Down Expand Up @@ -920,6 +928,104 @@ class="dashicons dashicons-lock"></span></h2>
</div>
</li>

<!-- import from WooCommerce -->
<?php
if ( class_exists( 'WooCommerce', false ) ) :
$wc_source = strtolower( get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_WOOCOMMERCE_SOURCE, true ) );
$wc_source_list = apply_filters(
'visualizer_woocommerce_report_endpoints',
array(
array(
'name' => esc_html__( 'Sales', 'visualizer' ),
'endpoint' => esc_attr( 'sales' ),
),
array(
'name' => esc_html__( 'Top Sellers', 'visualizer' ),
'endpoint' => esc_attr( 'top_sellers' ),
),
array(
'name' => esc_html__( 'Coupons Totals', 'visualizer' ),
'endpoint' => esc_attr( 'coupons/totals' ),
),
array(
'name' => esc_html__( 'Customers Totals', 'visualizer' ),
'endpoint' => esc_attr( 'customers/totals' ),
),
array(
'name' => esc_html__( 'Orders Totals', 'visualizer' ),
'endpoint' => esc_attr( 'orders/totals' ),
),
array(
'name' => esc_html__( 'Products Totals', 'visualizer' ),
'endpoint' => esc_attr( 'products/totals' ),
),
array(
'name' => esc_html__( 'Reviews Totals', 'visualizer' ),
'endpoint' => esc_attr( 'reviews/totals' ),
),
)
);
?>
<li class="viz-group visualizer_woocommerce_source<?php echo 'visualizer_source_json_wc' === $source_of_chart ? ' open' : ''; ?> <?php echo apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'import-wc-report' ); ?> ">
<h2 class="viz-group-title viz-sub-group"><?php _e( 'Import from WooCommerce Reports', 'visualizer' ); ?><span class="dashicons dashicons-lock"></span></h2>
<div class="viz-group-content edit-data-content">
<div>
<p class="viz-group-description"><?php _e( 'You can choose here to import/synchronize your chart data with a WooCommerce report API. For more info check <a href="https://woocommerce.github.io/woocommerce-rest-api-docs/?shell#reports" target="_blank" >this</a> tutorial', 'visualizer' ); ?></p>
<form id="vz-import-woo-report" action="<?php echo $upload_link; ?>" method="post" target="thehole" enctype="multipart/form-data">
<div class="remote-file-section">
<?php
$bttn_label = 'visualizer_source_json_wc' === $source_of_chart ? __( 'Modify Parameters', 'visualizer' ) : __( 'Create Parameters', 'visualizer' );
?>
<p class="viz-group-description"><?php _e( 'How often do you want to check the URL', 'visualizer' ); ?></p>
<select name="time" id="vz-woo-time" class="visualizer-select json-form-element" data-chart="<?php echo $chart_id; ?>">
<?php
$hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, true );
$schedules = apply_filters(
'visualizer_chart_schedules', array(
'-1' => __( 'One-time', 'visualizer' ),
),
'json',
$chart_id
);
foreach ( $schedules as $num => $name ) {
// phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
$extra = $num == $hours ? 'selected' : '';
?>
<option value="<?php echo $num; ?>" <?php echo $extra; ?>><?php echo $name; ?></option>
<?php
}
do_action( 'visualizer_chart_schedules_spl', 'json', $chart_id, 1 );
?>
</select>
<p class="viz-group-description"><?php _e( 'Select report endpoint', 'visualizer' ); ?></p>
<select name="vz_woo_source" id="vz-woo-source" class="visualizer-select json-form-element" data-chart="<?php echo $chart_id; ?>">
<option value=""></option>
<?php
if ( ! empty( $wc_source_list ) ) {
foreach ( $wc_source_list as $api ) {
if ( isset( $api['name'] ) && $api['endpoint'] ) {
echo sprintf( '<option value="%2$s" %3$s>%1$s</option>', $api['name'], $api['endpoint'], selected( $wc_source, $api['endpoint'], false ) ); // phpcs:ignore
}
}
}
?>
</select>
</div>

<input type="button" id="woo-chart-button" class="button button-secondary show-chart-toggle"
value="<?php echo $bttn_label; ?>" data-current="chart"
data-t-filter="<?php _e( 'Show Chart', 'visualizer' ); ?>"
data-t-chart="<?php echo $bttn_label; ?>"
<?php empty( $wc_source ) ? 'disabled' : ''; ?>
>
<input type="button" id="woo-chart-save-button" class="button button-primary "
value="<?php _e( 'Save Schedule', 'visualizer' ); ?>" <?php empty( $wc_source ) ? 'disabled' : ''; ?>>
</form>
<?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-wc-report' ); ?>
</div>
</div>
</li>
<?php endif; ?>
<?php
$save_query = esc_url(
add_query_arg(
Expand Down
45 changes: 37 additions & 8 deletions js/frame.js
Original file line number Diff line number Diff line change
Expand Up @@ -383,17 +383,23 @@
});

// toggle between chart and create/modify parameters
$( '#json-chart-button' ).on( 'click', function(){
$( '#json-chart-button, #woo-chart-button' ).on( 'click', function(){

$('body').off('visualizer:change:action').on('visualizer:change:action', function(e){
var filter_button = $( '#json-chart-button' );
var filter_button = $( '#json-chart-button, #woo-chart-button' );
$( '#visualizer-json-screen' ).css("z-index", "-1").hide();
filter_button.val( filter_button.attr( 'data-t-chart' ) );
filter_button.html( filter_button.attr( 'data-t-chart' ) );
filter_button.attr( 'data-current', 'chart' );
$( '#canvas' ).css("z-index", "1").show();
$( '#vz-import-woo-report' ).find( 'select, input' ).removeAttr( 'disabled' );
});

if ( 'json-chart-button' === $( this ).attr( 'id' ) ) {
$( '#vz-import-woo-report' ).find( 'select, input' ).attr( 'disabled', true );
} else {
$( '#vz-import-woo-report' ).find( 'select, input' ).removeAttr( 'disabled' );
}
$('#content').css('width', 'calc(100% - 100px)');
if( $(this).attr( 'data-current' ) === 'chart'){
// toggle from chart to LHS form
Expand All @@ -402,6 +408,15 @@
$(this).attr( 'data-current', 'filter' );
$( '.visualizer-editor-lhs' ).hide();
$( '#visualizer-json-screen' ).css("z-index", "9999").show();
if ( 'woo-chart-button' === $( this ).attr( 'id' ) && '' !== $( '#vz-woo-source:visible' ).val() ) {
$( '#vz-import-json-url' ).val( visualizer.rest_base + $( '#vz-woo-source' ).val() ).attr( 'readonly', true );
} else {
if ( 'undefined' !== $( '#vz-import-json-url' ).attr( 'readonly' ) ) {
$( '#vz-import-json-url' ).val( '' ).removeAttr( 'readonly' ).removeAttr( 'value' );
$('#json-endpoint-form')[0].reset();
$('.visualizer-json-form h3.viz-step:not(.step1)').addClass('ui-state-disabled');
}
}
$( '#canvas' ).hide();
}else{
// toggle from LHS form to chart
Expand All @@ -410,14 +425,14 @@
} );

$('body').on('visualizer:json:form:submit', function() {
var filter_button = $( '#json-chart-button' );
var filter_button = $( '#json-chart-button, #woo-chart-button' );
$( '#visualizer-json-screen' ).css("z-index", "-1").hide();
$('#canvas').lock();
filter_button.val( filter_button.attr( 'data-t-chart' ) );
filter_button.html( filter_button.attr( 'data-t-chart' ) );
filter_button.attr( 'data-current', 'chart' );
end_ajax( $( '#visualizer-json-screen' ) );
$( '#canvas' ).css("z-index", "1").show();
$( '#canvas' ).removeClass('visualizer-chart-loaded').css("z-index", "1").show();
});


Expand Down Expand Up @@ -512,25 +527,27 @@
}

// populate the form elements that are in the other tabs.
$('#json-conclude-form-helper .json-form-element, #json-endpoint-form .json-form-element, #json-root-form .json-form-element, #vz-import-json .json-form-element').each(function(x, y){
$('#json-conclude-form-helper .json-form-element, #json-endpoint-form .json-form-element, #json-root-form .json-form-element, #vz-import-json .json-form-element, #vz-import-woo-report .json-form-element:not(:disabled)').each(function(x, y){
$('#json-conclude-form').append('<input type="hidden" name="' + y.name + '" value="' + y.value + '">');
});

$('body').trigger('visualizer:json:form:submit');
});

// update the schedule
$('#json-chart-save-button').on('click', function(e){
$('#json-chart-save-button, #woo-chart-save-button').on('click', function(e){
e.preventDefault();
$('#canvas').lock();
var btnID = jQuery( this ).attr( 'id' );
$.ajax({
url : ajaxurl,
method : 'post',
data : {
'action' : visualizer.ajax['actions']['json_set_schedule'],
'security' : visualizer.ajax['nonces']['json_set_schedule'],
'chart' : $('#vz-json-time').attr('data-chart'),
'time' : $('#vz-json-time').val()
'chart' : $('#vz-json-time, #vz-woo-time').attr('data-chart'),
'time' : $('#vz-json-time, #vz-woo-time').val(),
'is_woocommerce_report': 'woo-chart-save-button' === btnID,
},
success : function(data){
// do nothing.
Expand All @@ -541,6 +558,18 @@
});
});

// Select WooCommerce report endpoint.
$( '#vz-woo-source' ).on( 'click', function( e ) {
// Trigger change action.
$( 'body' ).trigger( 'visualizer:change:action' );

if ( '' !== $( this ).val() ) {
$( '#woo-chart-button, #woo-chart-save-button' ).removeAttr( 'disabled' );
} else {
$( '#woo-chart-button, #woo-chart-save-button' ).attr( 'disabled', true );
}
} );

}

function init_editor_table() {
Expand Down