1812 lines
98 KiB
PHP
1812 lines
98 KiB
PHP
<?php
|
|
/**
|
|
* MainWP Module Cost Tracker Dashboard class.
|
|
*
|
|
* @package MainWP\Dashboard
|
|
* @version 4.6
|
|
*/
|
|
|
|
namespace MainWP\Dashboard\Module\CostTracker;
|
|
|
|
use MainWP\Dashboard\MainWP_Post_Handler;
|
|
use MainWP\Dashboard\MainWP_DB;
|
|
use MainWP\Dashboard\MainWP_Utility;
|
|
use MainWP\Dashboard\MainWP_DB_Client;
|
|
|
|
/**
|
|
* Class Cost_Tracker_Dashboard
|
|
*/
|
|
class Cost_Tracker_Dashboard { // phpcs:ignore -- NOSONAR - multi methods.
|
|
// phpcs:disable Generic.Metrics.CyclomaticComplexity -- complexity.
|
|
/**
|
|
* Variable to hold the items.
|
|
*
|
|
* @var mixed Default empty.
|
|
*/
|
|
private $items = null;
|
|
|
|
/**
|
|
* Variable to hold the total items.
|
|
*
|
|
* @var mixed Default empty.
|
|
*/
|
|
private $total_items = 0;
|
|
|
|
/**
|
|
* Variable to hold the order.
|
|
*
|
|
* @var mixed Default empty.
|
|
*/
|
|
private static $order = '';
|
|
|
|
/**
|
|
* Variable to hold the order by.
|
|
*
|
|
* @var mixed Default empty.
|
|
*/
|
|
private static $orderby = '';
|
|
|
|
/**
|
|
* Static variable to hold the single instance of the class.
|
|
*
|
|
* @static
|
|
*
|
|
* @var mixed Default null
|
|
*/
|
|
private static $instance = null;
|
|
|
|
/**
|
|
* Get Instance
|
|
*
|
|
* Creates public static instance.
|
|
*
|
|
* @static
|
|
*
|
|
* @return Cost_Tracker_Dashboard
|
|
*/
|
|
public static function get_instance() {
|
|
if ( null === static::$instance ) {
|
|
static::$instance = new self();
|
|
}
|
|
return static::$instance;
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* Runs each time the class is called.
|
|
*/
|
|
public function __construct() {
|
|
add_action( 'admin_init', array( &$this, 'admin_init' ) );
|
|
}
|
|
|
|
/**
|
|
* Method admin_init()
|
|
*
|
|
* Admin init.
|
|
*/
|
|
public function admin_init() {
|
|
MainWP_Post_Handler::instance()->add_action( 'mainwp_module_cost_tracker_notes_save', array( $this, 'ajax_notes_save' ) );
|
|
MainWP_Post_Handler::instance()->add_action( 'mainwp_module_cost_tracker_delete', array( $this, 'ajax_cost_tracker_delete' ) );
|
|
MainWP_Post_Handler::instance()->add_action( 'mainwp_module_cost_tracker_lists_display_rows', array( $this, 'ajax_display_rows' ) );
|
|
MainWP_Post_Handler::instance()->add_action( 'mainwp_module_cost_tracker_filter_save_segment', array( $this, 'ajax_costs_filter_save_segment' ) );
|
|
MainWP_Post_Handler::instance()->add_action( 'mainwp_module_cost_tracker_filter_load_segments', array( $this, 'ajax_costs_filter_load_segments' ) );
|
|
MainWP_Post_Handler::instance()->add_action( 'mainwp_module_cost_tracker_filter_delete_segment', array( $this, 'ajax_costs_filter_delete_segment' ) );
|
|
}
|
|
|
|
|
|
/**
|
|
* Get columns.
|
|
*
|
|
* @param bool $filtered With per site price column.
|
|
*
|
|
* @return array Array of column names.
|
|
*/
|
|
public static function get_columns( $filtered = false ) {
|
|
$cols = array(
|
|
'cb' => true,
|
|
'cost_status' => esc_html__( 'Status', 'mainwp' ),
|
|
'icon' => esc_html__( 'Icon', 'mainwp' ),
|
|
'name' => esc_html__( 'Name', 'mainwp' ),
|
|
'per_site_price' => esc_html__( 'Price', 'mainwp' ),
|
|
'price' => esc_html__( 'Price', 'mainwp' ),
|
|
'license_type' => esc_html__( 'License', 'mainwp' ),
|
|
'product_type' => esc_html__( 'Category', 'mainwp' ),
|
|
'type' => esc_html__( 'Type', 'mainwp' ),
|
|
'last_renewal' => esc_html__( 'Last Renewal', 'mainwp' ),
|
|
'payment_method' => esc_html__( 'Payment method', 'mainwp' ),
|
|
'next_renewal' => esc_html__( 'Next Renewal', 'mainwp' ),
|
|
'sites' => esc_html__( 'Sites', 'mainwp' ),
|
|
'actions' => esc_html__( 'Action', 'mainwp' ),
|
|
);
|
|
|
|
if ( ! $filtered ) {
|
|
unset( $cols['per_site_price'] );
|
|
}
|
|
return $cols;
|
|
}
|
|
|
|
|
|
/**
|
|
* Get column defines.
|
|
*
|
|
* @return array $defines
|
|
*/
|
|
public function get_columns_defines() {
|
|
$defines = array();
|
|
$defines[] = array(
|
|
'targets' => 'no-sort',
|
|
'orderable' => false,
|
|
);
|
|
$defines[] = array(
|
|
'targets' => 'title-column',
|
|
'className' => 'task-row-working',
|
|
);
|
|
$defines[] = array(
|
|
'targets' => 'date-column',
|
|
'className' => 'mainwp-date-cell',
|
|
);
|
|
$defines[] = array(
|
|
'targets' => 'state-column',
|
|
'className' => 'mainwp-state-cell',
|
|
);
|
|
$defines[] = array(
|
|
'targets' => array( 'column-sites', 'column-payment-method', 'column-license-type', 'column-icon' ),
|
|
'className' => 'center aligned',
|
|
);
|
|
$defines[] = array(
|
|
'targets' => array( 'column-site-price', 'column-price' ),
|
|
'className' => 'right aligned',
|
|
);
|
|
$defines[] = array(
|
|
'targets' => 'check-column',
|
|
'className' => 'check-column',
|
|
);
|
|
$defines[] = array(
|
|
'targets' => 'column-actions',
|
|
'className' => 'collapsing not-selectable',
|
|
);
|
|
|
|
return $defines;
|
|
}
|
|
|
|
/**
|
|
* Instantiate Columns.
|
|
*
|
|
* @param bool $filtered With per site price column.
|
|
*
|
|
* @return array $init_cols
|
|
*/
|
|
public function get_columns_init( $filtered ) {
|
|
$cols = $this->get_columns( $filtered );
|
|
$init_cols = array();
|
|
foreach ( $cols as $key => $val ) {
|
|
$init_cols[] = array( 'data' => esc_html( $key ) );
|
|
}
|
|
return $init_cols;
|
|
}
|
|
|
|
/**
|
|
* Renders overview.
|
|
*
|
|
* When the page loads render the body content.
|
|
*/
|
|
public function render_overview_page() {
|
|
if ( ! \mainwp_current_user_can( 'dashboard', 'manage_cost_tracker' ) ) {
|
|
\mainwp_do_not_have_permissions( esc_html__( 'manage cost tracker', 'mainwp' ) );
|
|
return;
|
|
}
|
|
|
|
$sel_ids = isset( $_GET['selected_ids'] ) ? $_GET['selected_ids'] : ''; //phpcs:ignore -- ok.
|
|
$sel_ids = explode( ',', $sel_ids );
|
|
|
|
if ( ! empty( $sel_ids ) && is_array( $sel_ids ) ) {
|
|
global $current_user;
|
|
$sel_ids = MainWP_Utility::array_numeric_filter( $sel_ids );
|
|
if ( ! empty( $sel_ids ) ) {
|
|
update_user_option( $current_user->ID, 'mainwp_module_cost_tracker_onetime_filters_saved', $sel_ids );
|
|
}
|
|
}
|
|
Cost_Tracker_Admin::render_header();
|
|
?>
|
|
<div id="mainwp-module-cost-tracker-dashboard-tab">
|
|
<?php static::render_manage_tasks_table_top( $sel_ids ); ?>
|
|
<?php $this->render_actions_bar(); ?>
|
|
<div class="ui segment">
|
|
<?php $this->render_dashboard_body(); ?>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Method ajax_display_rows()
|
|
*
|
|
* Handle display table rows.
|
|
*/
|
|
public function ajax_display_rows() { //phpcs:ignore -- NOSONAR - complex.
|
|
|
|
MainWP_Post_Handler::instance()->check_security( 'mainwp_module_cost_tracker_lists_display_rows' );
|
|
$filtered_one_time_ids = get_user_option( 'mainwp_module_cost_tracker_onetime_filters_saved' );
|
|
if ( ! empty( $filtered_one_time_ids ) && is_array( $filtered_one_time_ids ) ) {
|
|
global $current_user;
|
|
delete_user_option( $current_user->ID, 'mainwp_module_cost_tracker_onetime_filters_saved' );
|
|
$filtered_one_time_ids = MainWP_Utility::array_numeric_filter( $filtered_one_time_ids );
|
|
}
|
|
$req_orderby = '';
|
|
$req_order = null;
|
|
// phpcs:disable WordPress.Security.NonceVerification
|
|
if ( isset( $_REQUEST['order'] ) ) {
|
|
$order_values = MainWP_Utility::instance()->get_table_orders( $_REQUEST );
|
|
$req_orderby = $order_values['orderby'];
|
|
$req_order = $order_values['order'];
|
|
}
|
|
|
|
$filters = static::get_cost_filter_params();
|
|
|
|
$get_saved = true;
|
|
foreach ( $filters as $filter ) {
|
|
if ( isset( $_REQUEST[ $filter ] ) ) {
|
|
$get_saved = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
$filter_sites_ids = '';
|
|
$filter_client_ids = '';
|
|
$filter_prod_type_slugs = '';
|
|
$filter_cost_state = '';
|
|
$filter_dtsstart = '';
|
|
$filter_dtsstop = '';
|
|
|
|
$filter_license_type = '';
|
|
$filter_payment_method = '';
|
|
$filter_sub_renewal_type = '';
|
|
|
|
if ( $get_saved ) {
|
|
$filters_saved = get_user_option( 'mainwp_module_cost_tracker_filters_saved' );
|
|
if ( ! is_array( $filters_saved ) ) {
|
|
$filters_saved = array();
|
|
}
|
|
|
|
$filter_sites_ids = isset( $filters_saved['sites_ids'] ) ? $filters_saved['sites_ids'] : false;
|
|
$filter_client_ids = isset( $filters_saved['client_ids'] ) ? $filters_saved['client_ids'] : false;
|
|
$filter_prod_type_slugs = isset( $filters_saved['prods_types'] ) ? $filters_saved['prods_types'] : false;
|
|
$filter_cost_state = isset( $filters_saved['costs_state'] ) ? $filters_saved['costs_state'] : '';
|
|
$filter_dtsstart = isset( $filters_saved['dtsstart'] ) ? $filters_saved['dtsstart'] : '';
|
|
$filter_dtsstop = isset( $filters_saved['dtsstop'] ) ? $filters_saved['dtsstop'] : '';
|
|
|
|
$filter_license_type = isset( $filters_saved['license_types'] ) && ! empty( $filters_saved['license_types'] ) ? $filters_saved['license_types'] : '';
|
|
$filter_sub_renewal_type = isset( $filters_saved['renewal_frequency'] ) && ! empty( $filters_saved['renewal_frequency'] ) ? $filters_saved['renewal_frequency'] : '';
|
|
$filter_payment_method = isset( $filters_saved['payment_methods'] ) && ! empty( $filters_saved['payment_methods'] ) ? $filters_saved['payment_methods'] : '';
|
|
|
|
} else {
|
|
// phpcs:disable WordPress.Security.NonceVerification
|
|
$filter_sites_ids = isset( $_REQUEST['sites'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['sites'] ) ) : '';
|
|
$filter_client_ids = isset( $_REQUEST['client'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['client'] ) ) : '';
|
|
$filter_prod_type_slugs = isset( $_REQUEST['prods_types'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['prods_types'] ) ) : '';
|
|
$filter_cost_state = isset( $_REQUEST['costs_state'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['costs_state'] ) ) : '';
|
|
$filter_dtsstart = isset( $_REQUEST['dtsstart'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['dtsstart'] ) ) : '';
|
|
$filter_dtsstop = isset( $_REQUEST['dtsstop'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['dtsstop'] ) ) : '';
|
|
|
|
$filter_license_type = isset( $_REQUEST['license_types'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['license_types'] ) ) : '';
|
|
$filter_sub_renewal_type = isset( $_REQUEST['renewal_frequency'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['renewal_frequency'] ) ) : '';
|
|
$filter_payment_method = isset( $_REQUEST['payment_methods'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['payment_methods'] ) ) : '';
|
|
|
|
// phpcs:enable WordPress.Security.NonceVerification
|
|
}
|
|
|
|
$array_sites_ids = array();
|
|
$array_clients_ids = array();
|
|
$array_prod_types_slugs = array();
|
|
$array_status_slugs = array();
|
|
|
|
$array_license_type = array();
|
|
$array_payment_method = array();
|
|
$array_sub_renewal_type = array();
|
|
|
|
if ( ! empty( $filter_sites_ids ) ) {
|
|
$array_sites_ids = explode( ',', $filter_sites_ids ); // convert to array.
|
|
if ( in_array( 'nosites', $array_sites_ids, true ) ) {
|
|
$array_sites_ids = false;
|
|
$filter_sites_ids = '';
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $filter_client_ids ) ) {
|
|
$array_clients_ids = explode( ',', $filter_client_ids ); // convert to array.
|
|
if ( in_array( 'noclients', $array_clients_ids, true ) ) {
|
|
$array_clients_ids = false;
|
|
$filter_client_ids = '';
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $filter_prod_type_slugs ) ) {
|
|
$array_prod_types_slugs = explode( ',', $filter_prod_type_slugs ); // convert to array.
|
|
if ( in_array( 'nocategories', $array_prod_types_slugs, true ) ) {
|
|
$array_prod_types_slugs = false;
|
|
$filter_prod_type_slugs = '';
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $filter_cost_state ) ) {
|
|
$array_status_slugs = explode( ',', $filter_cost_state ); // convert to array.
|
|
if ( in_array( 'nostatus', $array_status_slugs, true ) ) {
|
|
$array_status_slugs = false;
|
|
$filter_cost_state = '';
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $filter_license_type ) ) {
|
|
$array_license_type = explode( ',', $filter_license_type ); // convert to array.
|
|
if ( in_array( 'nolicensetypes', $array_license_type, true ) ) {
|
|
$array_license_type = false;
|
|
$filter_license_type = '';
|
|
}
|
|
}
|
|
if ( ! empty( $filter_payment_method ) ) {
|
|
$array_payment_method = explode( ',', $filter_payment_method ); // convert to array.
|
|
if ( in_array( 'nopaymentmenthods', $array_payment_method, true ) ) {
|
|
$array_payment_method = false;
|
|
$filter_payment_method = '';
|
|
}
|
|
}
|
|
if ( ! empty( $filter_sub_renewal_type ) ) {
|
|
$array_sub_renewal_type = explode( ',', $filter_sub_renewal_type ); // convert to array.
|
|
if ( in_array( 'norenewalfrequency', $array_sub_renewal_type, true ) ) {
|
|
$array_sub_renewal_type = false;
|
|
$filter_sub_renewal_type = '';
|
|
}
|
|
}
|
|
|
|
global $current_user;
|
|
|
|
if ( empty( $filtered_one_time_ids ) ) {
|
|
update_user_option(
|
|
$current_user->ID,
|
|
'mainwp_module_cost_tracker_filters_saved',
|
|
array(
|
|
'sites_ids' => $filter_sites_ids,
|
|
'client_ids' => $filter_client_ids,
|
|
'prods_types' => $filter_prod_type_slugs,
|
|
'costs_state' => $filter_cost_state,
|
|
'dtsstart' => $filter_dtsstart,
|
|
'dtsstop' => $filter_dtsstop,
|
|
'license_types' => $filter_license_type,
|
|
'payment_methods' => $filter_payment_method,
|
|
'renewal_frequency' => $filter_sub_renewal_type,
|
|
)
|
|
);
|
|
}
|
|
|
|
// phpcs:enable
|
|
|
|
// phpcs:disable WordPress.Security.NonceVerification
|
|
$per_page = isset( $_REQUEST['length'] ) ? intval( $_REQUEST['length'] ) : 25;
|
|
|
|
if ( -1 === $per_page ) {
|
|
$per_page = 9999;
|
|
}
|
|
|
|
$start = isset( $_REQUEST['start'] ) ? intval( $_REQUEST['start'] ) : 0;
|
|
$search = isset( $_REQUEST['search']['value'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['search']['value'] ) ) : '';
|
|
|
|
// phpcs:enable WordPress.Security.NonceVerification
|
|
|
|
$args = array(
|
|
'order' => ( 'asc' === $req_order ) ? 'asc' : 'desc',
|
|
'orderby' => $req_orderby,
|
|
'start' => $start,
|
|
'search' => $search,
|
|
'dtsstart' => ! empty( $filter_dtsstart ) ? $filter_dtsstart : false,
|
|
'dtsstop' => ! empty( $filter_dtsstop ) ? $filter_dtsstop : false,
|
|
'filter_clients' => $array_clients_ids,
|
|
'filter_sites' => $array_sites_ids,
|
|
'filter_prods_types' => $array_prod_types_slugs,
|
|
'filter_states' => $array_status_slugs,
|
|
'filter_license_type' => $array_license_type,
|
|
'filter_payment_method' => $array_payment_method,
|
|
'filter_renewal_type' => $array_sub_renewal_type,
|
|
);
|
|
|
|
$args['records_per_page'] = $per_page ? $per_page : 20;
|
|
|
|
if ( ! empty( $filtered_one_time_ids ) ) {
|
|
$items = Cost_Tracker_DB::get_instance()->get_cost_tracker_by( 'all', null, array( 'selected_ids' => $filtered_one_time_ids ) );
|
|
$this->items = ! empty( $items ) ? $items : array();
|
|
$this->total_items = ! empty( $items ) ? count( $items ) : 0;
|
|
} else {
|
|
$results = Cost_Tracker_DB_Query::instance()->query_costs( $args );
|
|
$this->items = $results['items'];
|
|
$this->total_items = $results['count'];
|
|
}
|
|
$output = $this->ajax_get_datatable_rows();
|
|
wp_send_json( $output );
|
|
}
|
|
|
|
|
|
/**
|
|
* Render the Dashboard tab
|
|
*
|
|
* Renders the dashboard tab content - Subscription table
|
|
*/
|
|
public function render_dashboard_body() {
|
|
$_orderby = 'name';
|
|
$_order = 'desc';
|
|
|
|
static::$order = $_order;
|
|
static::$orderby = $_orderby;
|
|
|
|
if ( gmdate( 'Y-m-d' ) !== get_option( 'module_cost_tracker_calc_today_next_renewal', '' ) ) {
|
|
Cost_Tracker_DB::get_instance()->update_next_renewal_today();
|
|
}
|
|
|
|
$filtered = false;
|
|
if ( isset( $_GET['selected_ids'] ) && ! empty( $_GET['selected_ids'] ) ) { //phpcs:ignore -- ok.
|
|
$filtered = true;
|
|
}
|
|
?>
|
|
<table class="ui single line table" id="mainwp-module-cost-tracker-sites-table" style="width:100%">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="no-sort collapsing check-column column-check"><span class="ui checkbox"><input id="cb-select-all-top" type="checkbox"></span></th>
|
|
<th id="cost_status" class="collapsing column-status"><?php esc_html_e( 'Status', 'mainwp' ); ?></th>
|
|
<th id="icon" class="no-sort column-icon collapsing"></th>
|
|
<th id="name" class="column-name"><?php esc_html_e( 'Name', 'mainwp' ); ?></th>
|
|
<?php if ( $filtered ) : ?>
|
|
<th id="per_site_price" class="no-sort collapsing column-site-price"><?php esc_html_e( 'Per Site Price', 'mainwp' ); ?></th>
|
|
<th id="price" class="collapsing column-total-price"><?php esc_html_e( 'Total Price', 'mainwp' ); ?></th>
|
|
<?php else : ?>
|
|
<th id="price" class="collapsing column-price"><?php esc_html_e( 'Price', 'mainwp' ); ?></th>
|
|
<?php endif; ?>
|
|
<th id="license_type" class="collapsing column-license-type"><?php esc_html_e( 'License', 'mainwp' ); ?></th>
|
|
<th id="product_type" class="collapsing column-product-type"><?php esc_html_e( 'Category', 'mainwp' ); ?></th>
|
|
<th id="type" class="collapsing column-type"><?php esc_html_e( 'Type', 'mainwp' ); ?></th>
|
|
<th id="last_renewal" class="collapsing column-last-renewal"><?php esc_html_e( 'Purchased', 'mainwp' ); ?></th>
|
|
<th id="payment_method" class="collapsing center aligned column-payment-method"><?php esc_html_e( 'Method', 'mainwp' ); ?></th>
|
|
<th id="next_renewal" class="collapsing column-next-renewal"><?php esc_html_e( 'Renews', 'mainwp' ); ?></th>
|
|
<th id="sites" class="no-sort collapsing center aligned column-sites"><?php esc_html_e( 'Sites', 'mainwp' ); ?></th>
|
|
<th id="actions" class="no-sort collapsing right aligned column-actions"></th>
|
|
</tr>
|
|
</thead>
|
|
<tfoot>
|
|
<tr>
|
|
<th scope="col" class="no-sort collapsing check-column column-check"><span class="ui checkbox"><input id="cb-select-all-bottom" type="checkbox"></span></th>
|
|
<th id="cost_status-bottom" class="collapsing column-status"><?php esc_html_e( 'Status', 'mainwp' ); ?></th>
|
|
<th id="icon-bottom" class="column-icon collapsing"></th>
|
|
<th id="name-bottom" class="column-name" ><?php esc_html_e( 'Name', 'mainwp' ); ?></th>
|
|
<?php if ( $filtered ) : ?>
|
|
<th id="per_site_price-bottom" class="no-sort collapsing column-site-price"><?php esc_html_e( 'Per Site Price', 'mainwp' ); ?></th>
|
|
<th id="price-bottom" class="collapsing column-price"><?php esc_html_e( 'Total Price', 'mainwp' ); ?></th>
|
|
<?php else :
|
|
$el_id_prc_bt_1 = 'price-bottom';
|
|
?>
|
|
<th id="<?php echo esc_attr( $el_id_prc_bt_1 ); ?>" class="collapsing column-price"><?php esc_html_e( 'Price', 'mainwp' ); ?></th>
|
|
<?php endif; ?>
|
|
<th id="license_type-bottom" class="collapsing column-license-type"><?php esc_html_e( 'License', 'mainwp' ); ?></th>
|
|
<th id="product_type-bottom" class="collapsing column-product-type"><?php esc_html_e( 'Category', 'mainwp' ); ?></th>
|
|
<th id="type-bottom" class="column-type"><?php esc_html_e( 'Type', 'mainwp' ); ?></th>
|
|
<th id="last_renewal-bottom" class="collapsing column-last-renewal"><?php esc_html_e( 'Purchased', 'mainwp' ); ?></th>
|
|
<th id="payment_method-bottom" class="collapsing center aligned column-payment-method"><?php esc_html_e( 'Method', 'mainwp' ); ?></th>
|
|
<th id="next_renewal-bottom" class="collapsing column-next-renewal"><?php esc_html_e( 'Renews', 'mainwp' ); ?></th>
|
|
<th id="sites-bottom" class="collapsing column-sites"><?php esc_html_e( 'Sites', 'mainwp' ); ?></th>
|
|
<th id="actions-bottom" class="no-sort collapsing right aligned column-actions"></th>
|
|
</tr>
|
|
</tfoot>
|
|
</table>
|
|
<div id="mainwp-loading-sites" style="display: none;">
|
|
<div class="ui active inverted dimmer">
|
|
<div class="ui indeterminate large text loader"><?php esc_html_e( 'Loading ...', 'mainwp' ); ?></div>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
static::render_modal_edit_notes();
|
|
static::render_screen_options();
|
|
$sites_per_page = get_option( 'mainwp_default_sites_per_page', 25 );
|
|
$sites_per_page = intval( $sites_per_page );
|
|
$pages_length = array(
|
|
25 => '25',
|
|
10 => '10',
|
|
50 => '50',
|
|
100 => '100',
|
|
300 => '300',
|
|
);
|
|
|
|
$pages_length = $pages_length + array( $sites_per_page => $sites_per_page );
|
|
|
|
ksort( $pages_length );
|
|
|
|
if ( isset( $pages_length[-1] ) ) {
|
|
unset( $pages_length[-1] );
|
|
}
|
|
|
|
$pagelength_val = implode( ',', array_keys( $pages_length ) );
|
|
$pagelength_title = implode( ',', array_values( $pages_length ) );
|
|
|
|
$table_features = array(
|
|
'searching' => 'true',
|
|
'paging' => 'true',
|
|
'pagingType' => 'full_numbers',
|
|
'info' => 'true',
|
|
'colReorder' => '{columns:":not(.check-column):not(.column-actions)"}',
|
|
'stateSave' => 'true',
|
|
'stateDuration' => '0',
|
|
'order' => '[]',
|
|
'scrollX' => 'true',
|
|
'responsive' => 'true',
|
|
'fixedColumns' => '',
|
|
);
|
|
|
|
?>
|
|
<script type="text/javascript">
|
|
|
|
jQuery( document ).ready( function( $ ) {
|
|
let responsive = <?php echo esc_js( $table_features['responsive'] ); ?>;
|
|
if( jQuery( window ).width() > 1140 ) {
|
|
responsive = false;
|
|
}
|
|
|
|
// to fix issue not loaded calendar js library
|
|
if (jQuery('.ui.calendar').length > 0) {
|
|
if (mainwpParams.use_wp_datepicker == 1) {
|
|
jQuery('#mainwp-module-cost-tracker-list-sub-header .ui.calendar input[type=text]').datepicker({ dateFormat: "yy-mm-dd" });
|
|
} else {
|
|
jQuery('#mainwp-module-cost-tracker-list-sub-header .ui.calendar').calendar({
|
|
type: 'date',
|
|
monthFirst: false,
|
|
today: true,
|
|
touchReadonly: false,
|
|
formatter: {
|
|
date : 'YYYY-MM-DD'
|
|
}
|
|
});
|
|
}
|
|
}
|
|
try {
|
|
$subscription_sites_table = jQuery( '#mainwp-module-cost-tracker-sites-table' ).on( 'processing.dt', function ( e, settings, processing ) {
|
|
jQuery( '#mainwp-loading-sites' ).css( 'display', processing ? 'block' : 'none' );
|
|
if (!processing) {
|
|
let tb = jQuery( '#mainwp-module-cost-tracker-sites-table' );
|
|
$( '#mainwp-module-cost-tracker-sites-table .ui.dropdown' ).dropdown();
|
|
$( '#mainwp-module-cost-tracker-sites-table .ui.checkbox' ).checkbox();
|
|
}
|
|
}).DataTable( {
|
|
"ajax": {
|
|
"url": ajaxurl,
|
|
"type": "POST",
|
|
"data": function ( d ) {
|
|
let data = mainwp_secure_data( {
|
|
action: 'mainwp_module_cost_tracker_lists_display_rows',
|
|
sites: $( '#mainwp-module-cost-tracker-costs-filter-sites').dropdown('get value'),
|
|
prods_types: $( '#mainwp-module-cost-tracker-costs-filter-cats').dropdown('get value'),
|
|
costs_state: $( '#mainwp-module-cost-tracker-costs-filter-status').dropdown('get value'),
|
|
license_types: $( '#mainwp-module-cost-tracker-costs-filter-license-types').dropdown('get value'),
|
|
renewal_frequency: $( '#mainwp-module-cost-tracker-costs-filter-renewal-frequency').dropdown('get value'),
|
|
payment_methods: $( '#mainwp-module-cost-tracker-costs-filter-payment-methods').dropdown('get value'),
|
|
client: $( '#mainwp-module-cost-tracker-costs-filter-clients').dropdown('get value'),
|
|
dtsstart: $('#mainwp-module-cost-tracker-costs-filter-dtsstart').val(),
|
|
dtsstop: $('#mainwp-module-cost-tracker-costs-filter-dtsstop').val(),
|
|
show_per_site_price: <?php echo $filtered ? 1 : 0; ?>,
|
|
} );
|
|
return $.extend( {}, d, data );
|
|
},
|
|
"dataSrc": function ( json ) {
|
|
for ( let i=0, ien=json.data.length ; i < ien ; i++ ) {
|
|
json.data[i].rowClass = json.rowsInfo[i].rowClass;
|
|
json.data[i].cost_id = json.rowsInfo[i].cost_id;
|
|
}
|
|
return json.data;
|
|
}
|
|
},
|
|
"responsive": responsive,
|
|
"searching" : <?php echo esc_js( $table_features['searching'] ); ?>,
|
|
"paging" : <?php echo esc_js( $table_features['paging'] ); ?>,
|
|
"pagingType" : "<?php echo esc_js( $table_features['pagingType'] ); ?>",
|
|
"info" : <?php echo esc_js( $table_features['info'] ); ?>,
|
|
"colReorder" : <?php echo $table_features['colReorder']; // phpcs:ignore -- specical chars. ?>,
|
|
"scrollX" : <?php echo esc_js( $table_features['scrollX'] ); ?>,
|
|
"stateSave" : <?php echo esc_js( $table_features['stateSave'] ); ?>,
|
|
"stateDuration" : <?php echo esc_js( $table_features['stateDuration'] ); ?>,
|
|
"order" : <?php echo $table_features['order']; // phpcs:ignore -- specical chars. ?>,
|
|
"fixedColumns" : <?php echo ! empty( $table_features['fixedColumns'] ) ? esc_js( $table_features['fixedColumns'] ) : '""'; ?>,
|
|
"lengthMenu" : [ [<?php echo esc_js( $pagelength_val ); ?>, -1 ], [<?php echo esc_js( $pagelength_title ); ?>, "All"] ],
|
|
"serverSide": true,
|
|
"pageLength": <?php echo intval( $sites_per_page ); ?>,
|
|
"columnDefs": <?php echo wp_json_encode( $this->get_columns_defines() ); ?>,
|
|
"columns": <?php echo wp_json_encode( $this->get_columns_init( $filtered ) ); ?>,
|
|
"language": {
|
|
"emptyTable": "<?php esc_html_e( 'No subscriptions found.', 'mainwp' ); ?>"
|
|
},
|
|
"drawCallback": function( settings ) {
|
|
this.api().tables().body().to$().attr( 'id', 'mainwp-module-cost-tracker-body-table' );
|
|
mainwp_datatable_fix_menu_overflow();
|
|
},
|
|
"initComplete": function( settings, json ) {
|
|
},
|
|
rowCallback: function (row, data) {
|
|
jQuery( row ).addClass(data.rowClass);
|
|
jQuery( row ).attr( 'id', "cost-row-" + data.cost_id );
|
|
jQuery( row ).attr( 'item-id', data.cost_id );
|
|
|
|
},
|
|
'select': {
|
|
items: 'row',
|
|
style: 'multi+shift',
|
|
selector: 'tr>td:not(.not-selectable)'
|
|
}
|
|
}).on('select', function (e, dt, type, indexes) {
|
|
if( 'row' == type ){
|
|
dt.rows(indexes)
|
|
.nodes()
|
|
.to$().find('td.check-column .ui.checkbox' ).checkbox('set checked');
|
|
}
|
|
}).on('deselect', function (e, dt, type, indexes) {
|
|
if( 'row' == type ){
|
|
dt.rows(indexes)
|
|
.nodes()
|
|
.to$().find('td.check-column .ui.checkbox' ).checkbox('set unchecked');
|
|
}
|
|
}).on( 'columns-reordered', function () {
|
|
console.log('columns-reordered');
|
|
setTimeout(() => {
|
|
$( '#mainwp-module-cost-tracker-sites-table .ui.dropdown' ).dropdown();
|
|
$( '#mainwp-module-cost-tracker-sites-table .ui.checkbox' ).checkbox();
|
|
mainwp_datatable_fix_menu_overflow('#mainwp-module-cost-tracker-sites-table');
|
|
}, 1000 );
|
|
} );
|
|
} catch(err) {
|
|
// to fix js error.
|
|
console.log(err);
|
|
}
|
|
_init_cost_tracker_sites_screen();
|
|
} );
|
|
|
|
mainwp_module_cost_tracker_manage_costs_filter = function() {
|
|
try {
|
|
let emptyFilter = ( '' == jQuery( '#mainwp-module-cost-tracker-costs-filter-sites').dropdown('get value') ) &&
|
|
( '' == jQuery( '#mainwp-module-cost-tracker-costs-filter-cats').dropdown('get value') ) &&
|
|
( '' == jQuery( '#mainwp-module-cost-tracker-costs-filter-status').dropdown('get value') ) &&
|
|
( '' == jQuery( '#mainwp-module-cost-tracker-costs-filter-license-types').dropdown('get value') ) &&
|
|
( '' == jQuery( '#mainwp-module-cost-tracker-costs-filter-renewal-frequency').dropdown('get value') ) &&
|
|
( '' == jQuery( '#mainwp-module-cost-tracker-costs-filter-payment-methods').dropdown('get value') ) &&
|
|
( '' == jQuery( '#mainwp-module-cost-tracker-costs-filter-clients').dropdown('get value') ) &&
|
|
( '' == jQuery( '#mainwp-module-cost-tracker-costs-filter-dtsstart').dropdown('get value') ) &&
|
|
( '' == jQuery( '#mainwp-module-cost-tracker-costs-filter-dtsstop').dropdown('get value') );
|
|
|
|
console.log('emptyFilter: ' + ( emptyFilter ? 'yes' : 'no' ) );
|
|
|
|
if(emptyFilter){
|
|
jQuery( '#mainwp_module_cost_tracker_manage_costs_reset_filters' ).attr('disabled', 'disabled');
|
|
} else {
|
|
jQuery( '#mainwp_module_cost_tracker_manage_costs_reset_filters' ).attr('disabled', false);
|
|
}
|
|
|
|
$subscription_sites_table.ajax.reload();
|
|
|
|
} catch(err) {
|
|
// to fix js error.
|
|
console.log(err);
|
|
}
|
|
};
|
|
|
|
mainwp_module_cost_tracker_manage_costs_reset_filters = function() {
|
|
try {
|
|
jQuery( '#mainwp-module-cost-tracker-costs-filter-clients').dropdown('clear');
|
|
jQuery( '#mainwp-module-cost-tracker-costs-filter-sites').dropdown('clear');
|
|
jQuery( '#mainwp-module-cost-tracker-costs-filter-cats').dropdown('clear');
|
|
jQuery( '#mainwp-module-cost-tracker-costs-filter-status').dropdown('clear');
|
|
jQuery( '#mainwp-module-cost-tracker-costs-filter-license-types').dropdown('clear');
|
|
jQuery( '#mainwp-module-cost-tracker-costs-filter-renewal-frequency').dropdown('clear');
|
|
jQuery( '#mainwp-module-cost-tracker-costs-filter-payment-methods').dropdown('clear');
|
|
jQuery('#mainwp-module-cost-tracker-costs-filter-dtsstart').val('');
|
|
jQuery('#mainwp-module-cost-tracker-costs-filter-dtsstop').val('');
|
|
$subscription_sites_table.ajax.reload();
|
|
jQuery( '#mainwp_module_cost_tracker_manage_costs_reset_filters' ).attr('disabled', 'disabled');
|
|
} catch(err) {
|
|
// to fix js error.
|
|
console.log(err);
|
|
}
|
|
};
|
|
|
|
_init_cost_tracker_sites_screen = function() {
|
|
jQuery( '#mainwp-module-cost-tracker-sites-screen-options-modal input[type=checkbox][id^="mainwp_show_column_"]' ).each( function() {
|
|
let check_id = jQuery( this ).attr( 'id' );
|
|
col_id = check_id.replace( "mainwp_show_column_", "" );
|
|
try {
|
|
$subscription_sites_table.column( '#' + col_id ).visible( jQuery(this).is( ':checked' ) );
|
|
if ( check_id.indexOf("mainwp_show_column_desktop") >= 0 ) {
|
|
col_id = check_id.replace( "mainwp_show_column_desktop", "" );
|
|
$subscription_sites_table.column( '#mobile' + col_id ).visible( jQuery(this).is( ':checked' ) ); // to set mobile columns.
|
|
}
|
|
} catch(err) {
|
|
// to fix js error.
|
|
}
|
|
} );
|
|
};
|
|
|
|
//@see hook_screen_options().
|
|
mainwp_module_cost_tracker_sites_screen_options = function () {
|
|
jQuery( '#mainwp-module-cost-tracker-sites-screen-options-modal' ).modal( {
|
|
allowMultiple: true,
|
|
onHide: function () {
|
|
}
|
|
} ).modal( 'show' );
|
|
|
|
jQuery( '#subscription-sites-screen-options-form' ).submit( function() {
|
|
if ( jQuery('input[name=reset_subscriptionsites_columns_order]').attr('value') == 1 ) {
|
|
$subscription_sites_table.colReorder.reset();
|
|
}
|
|
jQuery( '#mainwp-module-cost-tracker-sites-screen-options-modal' ).modal( 'hide' );
|
|
} );
|
|
return false;
|
|
};
|
|
</script>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Get table rows.
|
|
*
|
|
* Optimize for shared hosting or big networks.
|
|
*
|
|
* @return array Rows html.
|
|
*/
|
|
public function ajax_get_datatable_rows() { //phpcs:ignore -- NOSONAR - complex.
|
|
|
|
$sel_ids = isset( $_GET['selected_ids'] ) ? $_GET['selected_ids'] : ''; //phpcs:ignore -- ok.
|
|
$sel_ids = explode( ',', $sel_ids );
|
|
|
|
$license_types = array(
|
|
'single_site' => '<span data-tooltip="Single-Site License" data-inverted="" data-position="left center"><i class="wordpress large icon"></i></span>',
|
|
'multi_site' => '<span data-tooltip="Multiple-Site License" data-inverted="" data-position="left center"><i class="icons"><i class="wordpress mini icon"></i><i class="top left corner large wordpress icon"></i><i class="bottom right corner large wordpress icon"></i></i></span>',
|
|
);
|
|
|
|
$product_types = Cost_Tracker_Admin::get_product_types();
|
|
$payment_methods = Cost_Tracker_Admin::get_payment_methods();
|
|
|
|
$show_per_site_price = false;
|
|
if ( isset( $_POST['show_per_site_price'] ) && ! empty( $_POST['show_per_site_price'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing
|
|
$show_per_site_price = true;
|
|
}
|
|
|
|
$current_time = time();
|
|
$upcoming1 = strtotime( gmdate( 'Y-m-d 00:00:00', $current_time ) );
|
|
$upcoming2 = strtotime( '+1 month', $current_time );
|
|
|
|
$all_rows = array();
|
|
$info_rows = array();
|
|
|
|
$columns = $this->get_columns( $show_per_site_price );
|
|
|
|
$product_types_icons = Cost_Tracker_Admin::get_product_type_icons();
|
|
$product_colors = Cost_Tracker_Admin::get_product_colors();
|
|
|
|
if ( $this->items ) {
|
|
foreach ( $this->items as $subscription ) {
|
|
|
|
$note = html_entity_decode( $subscription->note );
|
|
$esc_note = apply_filters( 'mainwp_escape_content', $note );
|
|
$strip_note = wp_strip_all_tags( $esc_note );
|
|
$last_renewal = $subscription ? $subscription->last_renewal : 0;
|
|
|
|
$sel_sites = ! empty( $subscription->sites ) ? json_decode( $subscription->sites, true ) : array();
|
|
$sel_groups = ! empty( $subscription->groups ) ? json_decode( $subscription->groups, true ) : array();
|
|
$sel_clients = ! empty( $subscription->clients ) ? json_decode( $subscription->clients, true ) : array();
|
|
|
|
if ( ! is_array( $sel_sites ) ) {
|
|
$sel_sites = array();
|
|
}
|
|
if ( ! is_array( $sel_groups ) ) {
|
|
$sel_groups = array();
|
|
}
|
|
if ( ! is_array( $sel_clients ) ) {
|
|
$sel_clients = array();
|
|
}
|
|
|
|
$url_manage_sites = '';
|
|
|
|
$params = array(
|
|
'sites' => $sel_sites,
|
|
'groups' => $sel_groups,
|
|
'clients' => $sel_clients,
|
|
);
|
|
|
|
$sub_sites = MainWP_DB::instance()->get_db_sites( $params );
|
|
$num_sites = count( $sub_sites );
|
|
if ( $num_sites > 0 ) {
|
|
$filter_sites = ! empty( $sel_sites ) ? '&selected_sites=' . implode( ',', $sel_sites ) : '';
|
|
$filter_groups = ! empty( $sel_groups ) ? '&g=' . implode( ',', $sel_groups ) : '';
|
|
$filter_clients = ! empty( $sel_clients ) ? '&client=' . implode( ',', $sel_clients ) : '';
|
|
$url_manage_sites = 'admin.php?page=managesites' . $filter_sites . $filter_groups . $filter_clients;
|
|
}
|
|
|
|
$rw_classes = 'cost-item cost-tracker-item-' . intval( $subscription->id ) . ' cost-tracker-type-' . ( isset( $product_types[ $subscription->product_type ] ) ? $product_types[ $subscription->product_type ] : '' );
|
|
$info_item = array(
|
|
'rowClass' => esc_html( $rw_classes ),
|
|
'cost_id' => intval( $subscription->id ),
|
|
);
|
|
|
|
$cols_data = array();
|
|
|
|
foreach ( $columns as $column_name => $column_display_name ) {
|
|
ob_start();
|
|
switch ( $column_name ) {
|
|
case 'cb':
|
|
?>
|
|
<span class="ui checkbox" data-tooltip="<?php esc_attr_e( 'Click to select the site.', 'mainwp' ); ?>" data-inverted="" data-position="right center"><input type="checkbox" name="checked[]"></span>
|
|
<?php
|
|
break;
|
|
case 'cost_status':
|
|
?>
|
|
<?php echo Cost_Tracker_Admin::get_cost_status_label( $subscription->cost_status ); //phpcs:ignore -- escaped. ?>
|
|
<?php
|
|
break;
|
|
case 'icon':
|
|
?>
|
|
<?php echo Cost_Tracker_Admin::get_instance()->get_product_icon_display( $subscription ); //phpcs:ignore -- escaped.?>
|
|
<?php
|
|
break;
|
|
case 'name':
|
|
?>
|
|
<a class="item" href="admin.php?page=CostTrackerAdd&id=<?php echo intval( $subscription->id ); ?>"><?php echo esc_html( $subscription->name ); ?></a>
|
|
<?php
|
|
break;
|
|
case 'per_site_price':
|
|
if ( 'single_site' === $subscription->license_type ) {
|
|
$per_site_price = $subscription->price;
|
|
} else {
|
|
$per_site_price = ( $num_sites > 0 ) ? ( $subscription->price / $num_sites ) : 0;
|
|
}
|
|
|
|
$next30_price = 0;
|
|
if ( 'active' === $subscription->cost_status && 'subscription' === $subscription->type ) {
|
|
$next_rl = $subscription->next_renewal;
|
|
if ( $next_rl <= $upcoming1 ) {
|
|
$next_rl = Cost_Tracker_Admin::get_next_renewal( $upcoming1, $subscription->renewal_type, false );
|
|
}
|
|
while ( $next_rl <= $upcoming2 ) {
|
|
if ( $next_rl > $upcoming1 && $next_rl <= $upcoming2 ) {
|
|
$next30_price += $per_site_price;
|
|
}
|
|
$next_rl = Cost_Tracker_Admin::get_next_renewal( $next_rl, $subscription->renewal_type, false );
|
|
}
|
|
}
|
|
?>
|
|
<strong><?php Cost_Tracker_Utility::cost_tracker_format_price( $next30_price ); ?></strong>
|
|
<?php
|
|
break;
|
|
case 'price':
|
|
echo ! empty( $url_manage_sites ) ? '<a href="' . esc_url( $url_manage_sites ) . '">' . Cost_Tracker_Utility::cost_tracker_format_price( $subscription->price, true ) . '</a>' : Cost_Tracker_Utility::cost_tracker_format_price( $subscription->price ); //phpcs:ignore -- ok.
|
|
break;
|
|
case 'license_type':
|
|
?>
|
|
<?php echo isset( $license_types[ $subscription->license_type ] ) ? $license_types[ $subscription->license_type ] : ''; //phpcs:ignore -- ok. ?>
|
|
<?php
|
|
break;
|
|
case 'type':
|
|
?>
|
|
<?php echo 'lifetime' === $subscription->type ? '<span data-tooltip="Lifetime license" data-inverted="" data-position="left center"><div class="ui grey fluid label"><i class="infinity icon"></i>L</div></span>' : '<span data-tooltip="Recurring subscription" data-inverted="" data-position="left center"><div class="ui black fluid label"><i class="calendar alternate outline icon"></i><strong>' . esc_html( substr( ucfirst( $subscription->renewal_type ), 0, 1 ) ) . '</strong></div></span>'; ?>
|
|
<?php
|
|
break;
|
|
case 'product_type':
|
|
?>
|
|
<?php echo isset( $product_types[ $subscription->product_type ] ) ? '<div class="ui label" style="color:#ffffff;background-color:' . esc_attr( $product_colors[ $subscription->product_type ] ) . '"><i class="' . str_replace( 'deficon:', '', esc_attr( $product_types_icons[ $subscription->product_type ] ) ) . ' icon"></i>' . esc_html( $product_types[ $subscription->product_type ] ) . '</div>' : ''; //phpcs:ignore -- ok. ?>
|
|
<?php
|
|
break;
|
|
case 'last_renewal':
|
|
?>
|
|
<?php echo $last_renewal ? '<em>' . MainWP_Utility::format_date( $last_renewal ) . '</em>': ''; //phpcs:ignore -- escaped. ?>
|
|
<?php
|
|
break;
|
|
case 'payment_method':
|
|
?>
|
|
<?php echo isset( $payment_methods[ $subscription->payment_method ] ) ? Cost_Tracker_Utility::get_payment_method_icon( $payment_methods[ $subscription->payment_method ] ) : ''; // phpcs:ignore -- ok.?>
|
|
<?php
|
|
break;
|
|
case 'next_renewal':
|
|
$next_renewal = Cost_Tracker_Admin::get_next_renewal( $subscription->last_renewal, $subscription->renewal_type );
|
|
Cost_Tracker_Admin::generate_next_renewal( $subscription, $next_renewal );
|
|
break;
|
|
case 'sites':
|
|
?>
|
|
<?php echo ! empty( $url_manage_sites ) ? '<a href="' . esc_url( $url_manage_sites ) . '">' . '<div class="ui blue small label"><i class="wordpress icon"></i>' . count( $sub_sites ) . '</div>' . '</a>' : '<div class="ui small label"><i class="wordpress icon"></i> 0</div>'; //phpcs:ignore -- WP icon. ?>
|
|
<?php
|
|
break;
|
|
case 'actions':
|
|
?>
|
|
<div class="ui right pointing dropdown">
|
|
<a href="javascript:void(0)" aria-label="<?php esc_attr_e( 'Actions menu', 'mainwp' ); ?>"><i class="ellipsis vertical icon"></i></a>
|
|
<div class="menu">
|
|
<a class="item" href="admin.php?page=CostTrackerAdd&id=<?php echo intval( $subscription->id ); ?>"><?php esc_html_e( 'Edit', 'mainwp' ); ?></a>
|
|
<?php if ( empty( $subscription->note ) ) : ?>
|
|
<a href="javascript:void(0)" class="item mainwp-edit-sub-note"><?php esc_html_e( 'Add Notes', 'mainwp' ); ?></a>
|
|
<?php else : ?>
|
|
<a href="javascript:void(0)" class="item mainwp-edit-sub-note" data-tooltip="<?php echo esc_attr( substr( wp_unslash( $strip_note ), 0, 100 ) ); ?>" data-position="left center" data-inverted=""><?php esc_html_e( 'View Notes', 'mainwp' ); ?></a>
|
|
<?php endif; ?>
|
|
<span style="display: none" id="sub-notes-<?php echo intval( $subscription->id ); ?>-note"><?php echo wp_unslash( $esc_note ); //phpcs:ignore -- escaped. ?></span>
|
|
<a class="item subscription_menu_item_delete" href="javascript:void(0)"><?php esc_html_e( 'Delete', 'mainwp' ); ?></a>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
$cols_data[ $column_name ] = ob_get_clean();
|
|
}
|
|
$all_rows[] = $cols_data;
|
|
$info_rows[] = $info_item;
|
|
}
|
|
}
|
|
return array(
|
|
'data' => $all_rows,
|
|
'recordsTotal' => $this->total_items,
|
|
'recordsFiltered' => $this->total_items,
|
|
'rowsInfo' => $info_rows,
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Method ajax_notes_save()
|
|
*
|
|
* Post handler for save notes.
|
|
*/
|
|
public function ajax_notes_save() {
|
|
MainWP_Post_Handler::instance()->check_security( 'mainwp_module_cost_tracker_notes_save' );
|
|
//phpcs:disable WordPress.Security.NonceVerification.Missing
|
|
$sub_id = isset( $_POST['subid'] ) ? intval( $_POST['subid'] ) : 0;
|
|
$sub = Cost_Tracker_DB::get_instance()->get_cost_tracker_by( 'id', $sub_id );
|
|
if ( $sub_id && $sub ) {
|
|
$note = isset( $_POST['note'] ) ? wp_unslash( $_POST['note'] ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- mainwp_escape_content.
|
|
$esc_note = apply_filters( 'mainwp_escape_content', $note );
|
|
$update = array(
|
|
'id' => $sub_id,
|
|
'note' => $esc_note,
|
|
);
|
|
Cost_Tracker_DB::get_instance()->update_cost_tracker( $update );
|
|
die(
|
|
wp_json_encode(
|
|
array(
|
|
'result' => 'SUCCESS',
|
|
'esc_note_content' => $esc_note,
|
|
)
|
|
)
|
|
);
|
|
} else {
|
|
die( wp_json_encode( array( 'error' => esc_html__( 'Invalid cost tracker ID or item not found.', 'mainwp' ) ) ) );
|
|
}
|
|
//phpcs:enable
|
|
}
|
|
|
|
/**
|
|
* Method ajax_costs_filter_save_segment()
|
|
*
|
|
* Post handler for save segment.
|
|
*/
|
|
public function ajax_costs_filter_save_segment() {
|
|
MainWP_Post_Handler::instance()->check_security( 'mainwp_module_cost_tracker_filter_save_segment' );
|
|
//phpcs:disable WordPress.Security.NonceVerification.Missing
|
|
|
|
$not_filters = array(
|
|
'seg_sites' => 'nosites',
|
|
'seg_clients' => 'noclients',
|
|
'seg_prods_types' => 'nocategories',
|
|
'seg_costs_state' => 'nostatus',
|
|
'seg_license_types' => 'nolicensetypes',
|
|
'seg_payment_methods' => 'nopaymentmenthods',
|
|
'seg_renewal_frequency' => 'norenewalfrequency',
|
|
);
|
|
|
|
$fields = array(
|
|
'name',
|
|
'seg_sites',
|
|
'seg_clients',
|
|
'seg_prods_types',
|
|
'seg_costs_state',
|
|
'seg_license_types',
|
|
'seg_renewal_frequency',
|
|
'seg_payment_methods',
|
|
'seg_dtsstart',
|
|
'seg_dtsstop',
|
|
);
|
|
|
|
$save_fields = array();
|
|
|
|
foreach ( $fields as $field ) {
|
|
if ( isset( $_POST[ $field ] ) ) {
|
|
$val_seg = sanitize_text_field( wp_unslash( $_POST[ $field ] ) );
|
|
if ( isset( $not_filters[ $field ] ) && false !== strpos( $val_seg, $not_filters[ $field ] ) ) {
|
|
$val_seg = '';
|
|
}
|
|
$save_fields[ $field ] = $val_seg;
|
|
}
|
|
}
|
|
|
|
$seg_id = ! empty( $_POST['seg_id'] ) ? sanitize_text_field( wp_unslash( $_POST['seg_id'] ) ) : time();
|
|
//phpcs:enable WordPress.Security.NonceVerification.Missing
|
|
|
|
$saved_segments = $this->set_get_cost_filter_segments();
|
|
if ( ! is_array( $saved_segments ) ) {
|
|
$saved_segments = array();
|
|
}
|
|
$saved_segments[ $seg_id ] = $save_fields;
|
|
$this->set_get_cost_filter_segments( true, $saved_segments );
|
|
die( wp_json_encode( array( 'result' => 'SUCCESS' ) ) );
|
|
}
|
|
|
|
|
|
/**
|
|
* Method set_get_cost_filter_segments()
|
|
*
|
|
* @param bool $set_val Get or set value.
|
|
* @param array $saved_segments segments value.
|
|
*/
|
|
public function set_get_cost_filter_segments( $set_val = false, $saved_segments = array() ) {
|
|
global $current_user;
|
|
if ( $current_user && ! empty( $current_user->ID ) ) {
|
|
if ( $set_val ) {
|
|
update_user_option( $current_user->ID, 'mainwp_module_cost_tracker_filter_saved_segments', $saved_segments );
|
|
} else {
|
|
$values = get_user_option( 'mainwp_module_cost_tracker_filter_saved_segments', array() );
|
|
if ( ! is_array( $values ) ) {
|
|
$values = array();
|
|
}
|
|
return $values;
|
|
}
|
|
}
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* Method ajax_costs_filter_load_segments()
|
|
*
|
|
* Post handler for save segment.
|
|
*/
|
|
public function ajax_costs_filter_load_segments() {
|
|
MainWP_Post_Handler::instance()->check_security( 'mainwp_module_cost_tracker_filter_load_segments' );
|
|
$saved_segments = $this->set_get_cost_filter_segments();
|
|
$list_segs = '';
|
|
if ( is_array( $saved_segments ) && ! empty( $saved_segments ) ) {
|
|
$list_segs .= '<select id="mainwp_module_cost_tracker_edit_payment_type" class="ui fluid dropdown">';
|
|
$list_segs .= '<option segment-filters="" value="">' . esc_html__( 'Select a segment', 'mainwp' ) . '</option>';
|
|
foreach ( $saved_segments as $sid => $values ) {
|
|
if ( empty( $values['name'] ) ) {
|
|
continue;
|
|
}
|
|
$list_segs .= '<option segment-filters="' . esc_attr( wp_json_encode( $values ) ) . '" value="' . esc_attr( $sid ) . '">' . esc_html( $values['name'] ) . '</option>';
|
|
}
|
|
$list_segs .= '</select>';
|
|
}
|
|
die( wp_json_encode( array( 'result' => $list_segs ) ) ); //phpcs:ignore -- ok.
|
|
}
|
|
|
|
/**
|
|
* Method ajax_costs_filter_delete_segment()
|
|
*
|
|
* Post handler for save segment.
|
|
*/
|
|
public function ajax_costs_filter_delete_segment() {
|
|
MainWP_Post_Handler::instance()->check_security( 'mainwp_module_cost_tracker_filter_delete_segment' );
|
|
$seg_id = ! empty( $_POST['seg_id'] ) ? sanitize_text_field( wp_unslash( $_POST['seg_id'] ) ) : 0; //phpcs:ignore -- ok.
|
|
|
|
$saved_segments = $this->set_get_cost_filter_segments();
|
|
if ( ! empty( $seg_id ) && is_array( $saved_segments ) && isset( $saved_segments[ $seg_id ] ) ) {
|
|
unset( $saved_segments[ $seg_id ] );
|
|
$this->set_get_cost_filter_segments( true, $saved_segments );
|
|
die( wp_json_encode( array( 'result' =>'SUCCESS' ) ) ); //phpcs:ignore -- ok.
|
|
}
|
|
die( wp_json_encode( array( 'error' => esc_html__( 'Segment not found. Please try again.', 'mainwp' ) ) ) ); //phpcs:ignore -- ok.
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Method ajax_cost_tracker_delete()
|
|
*
|
|
* Post handler for save notes.
|
|
*/
|
|
public function ajax_cost_tracker_delete() {
|
|
MainWP_Post_Handler::instance()->check_security( 'mainwp_module_cost_tracker_delete' );
|
|
$sub_id = isset( $_POST['sub_id'] ) ? intval( $_POST['sub_id'] ) : 0; //phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
|
|
|
|
if ( Cost_Tracker_DB::get_instance()->delete_cost_tracker( 'id', $sub_id ) ) {
|
|
die( wp_json_encode( array( 'status' => 'success' ) ) );
|
|
} else {
|
|
die( wp_json_encode( array( 'error' => esc_html__( 'Failed.', 'mainwp' ) ) ) );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Render Actions Bar
|
|
*
|
|
* Renders the actions bar on the Dashboard tab.
|
|
*/
|
|
public function render_actions_bar() {
|
|
?>
|
|
<div class="mainwp-actions-bar">
|
|
<div class="ui two columns grid">
|
|
<div class="column ui mini form">
|
|
<select class="ui dropdown" id="mwp_cost_tracker_bulk_action">
|
|
<option value="-1"><?php esc_html_e( 'Bulk actions', 'mainwp' ); ?></option>
|
|
<option value="delete-sub"><?php esc_html_e( 'Delete', 'mainwp' ); ?></option>
|
|
</select>
|
|
<input type="button" name="mainwp_module_cost_tracker_action_btn" id="mainwp_module_cost_tracker_action_btn" class="ui basic mini button" value="<?php esc_html_e( 'Apply', 'mainwp' ); ?>"/>
|
|
<?php do_action( 'mainwp_module_cost_tracker_actions_bar_left' ); ?>
|
|
</div>
|
|
<div class="right aligned middle aligned column">
|
|
<div class="ui stackable grid">
|
|
<div class="eight wide right aligned middle aligned column"><?php do_action( 'mainwp_module_cost_tracker_actions_bar_right' ); ?></div>
|
|
<div class="eight wide right aligned middle aligned column"><a href="#" class="ui mini basic button" id="mainwp-manage-costs-filter-toggle-button" aria-label="<?php esc_attr_e( 'Available filters.', 'mainwp' ); ?>"><i class="filter grey icon"></i> <?php esc_html_e( 'Filter Costs', 'mainwp' ); ?></a></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">
|
|
jQuery( document ).on( 'click', '#mainwp-manage-costs-filter-toggle-button', function () {
|
|
jQuery( '#mainwp-module-cost-tracker-list-sub-header' ).toggle( 300 );
|
|
return false;
|
|
} );
|
|
</script>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
|
|
/**
|
|
* Method get_cost_filter_params().
|
|
*
|
|
* @return array filters params.
|
|
*/
|
|
public static function get_cost_filter_params() {
|
|
return array( 'sites', 'client', 'prods_types', 'costs_state', 'dtsstart', 'dtsstop', 'license_types', 'renewal_frequency', 'payment_methods' );
|
|
}
|
|
|
|
/**
|
|
* Render Manage Tasks Table Top.
|
|
*
|
|
* @param bool $sel_one_time_ids selected one time ids.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function render_manage_tasks_table_top( $sel_one_time_ids = false ) { //phpcs:ignore -- NOSONAR - complex.
|
|
|
|
$filters = static::get_cost_filter_params();
|
|
|
|
$get_saved = true;
|
|
foreach ( $filters as $filter ) {
|
|
if ( isset( $_REQUEST[ $filter ] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended -- ok.
|
|
$get_saved = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
$filter_sites_ids = '';
|
|
$filter_client_ids = '';
|
|
$filter_prod_type_slugs = '';
|
|
$filter_cost_state = '';
|
|
$filter_dtsstart = '';
|
|
$filter_dtsstop = '';
|
|
|
|
$filter_license_type = '';
|
|
$filter_payment_method = '';
|
|
$filter_sub_renewal_type = '';
|
|
|
|
$redirect_site_id = isset( $_GET['site_id'] ) ? intval( $_GET['site_id'] ) : 0; //phpcs:ignore -- ok.
|
|
|
|
if ( ! $sel_one_time_ids ) {
|
|
if ( $get_saved ) {
|
|
$filters_saved = get_user_option( 'mainwp_module_cost_tracker_filters_saved' );
|
|
if ( ! is_array( $filters_saved ) ) {
|
|
$filters_saved = array();
|
|
}
|
|
$filter_sites_ids = isset( $filters_saved['sites_ids'] ) && ! empty( $filters_saved['sites_ids'] ) ? $filters_saved['sites_ids'] : false;
|
|
$filter_client_ids = isset( $filters_saved['client_ids'] ) && ! empty( $filters_saved['client_ids'] ) ? $filters_saved['client_ids'] : false;
|
|
$filter_prod_type_slugs = isset( $filters_saved['prods_types'] ) && ! empty( $filters_saved['prods_types'] ) ? $filters_saved['prods_types'] : false;
|
|
$filter_cost_state = isset( $filters_saved['costs_state'] ) && ! empty( $filters_saved['costs_state'] ) ? $filters_saved['costs_state'] : '';
|
|
$filter_dtsstart = isset( $filters_saved['dtsstart'] ) && ! empty( $filters_saved['dtsstart'] ) ? $filters_saved['dtsstart'] : '';
|
|
$filter_dtsstop = isset( $filters_saved['dtsstop'] ) && ! empty( $filters_saved['dtsstop'] ) ? $filters_saved['dtsstop'] : '';
|
|
|
|
$filter_license_type = isset( $filters_saved['license_types'] ) && ! empty( $filters_saved['license_types'] ) ? $filters_saved['license_types'] : '';
|
|
$filter_sub_renewal_type = isset( $filters_saved['renewal_frequency'] ) && ! empty( $filters_saved['renewal_frequency'] ) ? $filters_saved['renewal_frequency'] : '';
|
|
$filter_payment_method = isset( $filters_saved['payment_methods'] ) && ! empty( $filters_saved['payment_methods'] ) ? $filters_saved['payment_methods'] : '';
|
|
} else {
|
|
// phpcs:disable WordPress.Security.NonceVerification
|
|
$filter_sites_ids = isset( $_REQUEST['sites_ids'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['sites_ids'] ) ) : '';
|
|
$filter_client_ids = isset( $_REQUEST['client'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['client'] ) ) : '';
|
|
$filter_prod_type_slugs = isset( $_REQUEST['prods_types'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['prods_types'] ) ) : '';
|
|
$filter_cost_state = isset( $_REQUEST['costs_state'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['costs_state'] ) ) : '';
|
|
$filter_dtsstart = isset( $_REQUEST['dtsstart'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['dtsstart'] ) ) : '';
|
|
$filter_dtsstop = isset( $_REQUEST['dtsstop'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['dtsstop'] ) ) : '';
|
|
|
|
$filter_license_type = isset( $_REQUEST['license_types'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['license_types'] ) ) : '';
|
|
$filter_sub_renewal_type = isset( $_REQUEST['renewal_frequency'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['renewal_frequency'] ) ) : '';
|
|
$filter_payment_method = isset( $_REQUEST['payment_methods'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['payment_methods'] ) ) : '';
|
|
// phpcs:enable WordPress.Security.NonceVerification
|
|
}
|
|
} elseif ( $redirect_site_id ) {
|
|
$filter_sites_ids = $redirect_site_id;
|
|
$filter_dtsstart = gmdate( 'Y-m-d' );
|
|
$filter_dtsstop = gmdate( 'Y-m-d', time() + 30 * DAY_IN_SECONDS );
|
|
}
|
|
|
|
$empty_filter = true;
|
|
if ( ! $sel_one_time_ids ) {
|
|
$empty_filter = empty( $filter_sites_ids ) && empty( $filter_client_ids ) && empty( $filter_prod_type_slugs ) && empty( $filter_cost_state ) && empty( $filter_dtsstart ) && empty( $filter_dtsstop ) && empty( $filter_license_type ) && empty( $filter_sub_renewal_type ) && empty( $filter_payment_method );
|
|
}
|
|
|
|
$all_defaults = Cost_Tracker_Admin::get_default_fields_values();
|
|
$product_types = $all_defaults['product_types'];
|
|
$cost_status = $all_defaults['cost_status'];
|
|
|
|
$license_types = $all_defaults['license_types'];
|
|
$renewal_frequency = $all_defaults['renewal_frequency'];
|
|
$payment_methods = $all_defaults['payment_methods'];
|
|
|
|
$saved_segments = static::get_instance()->set_get_cost_filter_segments();
|
|
|
|
$filters_row_style = 'display:none';
|
|
|
|
if ( ! empty( $filter_sites_ids ) || ! empty( $filter_client_ids ) || ! empty( $filter_prod_type_slugs ) || ! empty( $filter_cost_state ) || ! empty( $filter_license_type ) || ! empty( $filter_sub_renewal_type ) || ! empty( $filter_payment_method ) || ! empty( $filter_dtsstart ) || ! empty( $filter_dtsstop ) ) {
|
|
$filters_row_style = 'display:block';
|
|
}
|
|
|
|
?>
|
|
<div class="mainwp-sub-header" id="mainwp-module-cost-tracker-list-sub-header" style="<?php echo esc_attr( $filters_row_style ); ?>">
|
|
<div class="ui stackable compact grid mini form" id="mainwp-module-cost-tracker-costs-filters-row">
|
|
<div class="thirteen wide column ui compact grid">
|
|
<div class="three wide middle aligned column">
|
|
<div id="mainwp-module-cost-tracker-costs-filter-sites" class="ui fluid selection multiple dropdown seg_sites">
|
|
<input type="hidden" value="<?php echo esc_html( $filter_sites_ids ); ?>">
|
|
<i class="dropdown icon"></i>
|
|
<div class="default text"><?php esc_html_e( 'All sites', 'mainwp' ); ?></div>
|
|
<div class="menu">
|
|
<?php
|
|
$websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_wp_for_current_user() );
|
|
foreach ( $websites as $site ) {
|
|
?>
|
|
<div class="item" data-value="<?php echo intval( $site['id'] ); ?>"><?php echo esc_html( stripslashes( $site['name'] ) ); ?></div>
|
|
<?php
|
|
}
|
|
?>
|
|
<div class="item" data-value="nosites"><?php esc_html_e( 'All sites', 'mainwp' ); ?></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="three wide middle aligned column">
|
|
<div id="mainwp-module-cost-tracker-costs-filter-clients" class="ui fluid selection multiple dropdown seg_clients">
|
|
<input type="hidden" value="<?php echo esc_html( $filter_client_ids ); ?>">
|
|
<i class="dropdown icon"></i>
|
|
<div class="default text"><?php esc_html_e( 'All clients', 'mainwp' ); ?></div>
|
|
<div class="menu">
|
|
<?php
|
|
$clients = MainWP_DB_Client::instance()->get_wp_client_by( 'all' );
|
|
|
|
foreach ( $clients as $client ) {
|
|
?>
|
|
<div class="item" data-value="<?php echo intval( $client->client_id ); ?>"><?php echo esc_html( stripslashes( $client->name ) ); ?></div>
|
|
<?php
|
|
}
|
|
?>
|
|
<div class="item" data-value="noclients"><?php esc_html_e( 'All clients', 'mainwp' ); ?></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="three wide middle aligned column">
|
|
<div id="mainwp-module-cost-tracker-costs-filter-cats" class="ui fluid selection multiple dropdown seg_prods_types">
|
|
<input type="hidden" value="<?php echo esc_html( $filter_prod_type_slugs ); ?>">
|
|
<i class="dropdown icon"></i>
|
|
<div class="default text"><?php esc_html_e( 'All categories', 'mainwp' ); ?></div>
|
|
<div class="menu">
|
|
<?php
|
|
foreach ( $product_types as $pro_type => $pro_name ) {
|
|
?>
|
|
<div class="item" data-value="<?php echo esc_attr( $pro_type ); ?>"><?php echo esc_html( stripslashes( $pro_name ) ); ?></div>
|
|
<?php
|
|
}
|
|
?>
|
|
<div class="item" data-value="nocategories"><?php esc_html_e( 'All categories', 'mainwp' ); ?></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="three wide middle aligned column">
|
|
<div id="mainwp-module-cost-tracker-costs-filter-status" class="ui fluid selection multiple dropdown seg_costs_state">
|
|
<input type="hidden" value="<?php echo esc_html( $filter_cost_state ); ?>">
|
|
<i class="dropdown icon"></i>
|
|
<div class="default text"><?php esc_html_e( 'All statuses', 'mainwp' ); ?></div>
|
|
<div class="menu">
|
|
<?php
|
|
foreach ( $cost_status as $status => $status_name ) {
|
|
?>
|
|
<div class="item" data-value="<?php echo esc_attr( $status ); ?>"><?php echo esc_html( stripslashes( $status_name ) ); ?></div>
|
|
<?php
|
|
}
|
|
?>
|
|
<div class="item" data-value="nostatus"><?php esc_html_e( 'All statuses', 'mainwp' ); ?></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="three wide middle aligned column">
|
|
<div id="mainwp-module-cost-tracker-costs-filter-license-types" class="ui fluid selection multiple dropdown seg_license_types">
|
|
<input type="hidden" value="<?php echo esc_attr( $filter_license_type ); ?>">
|
|
<i class="dropdown icon"></i>
|
|
<div class="default text"><?php esc_html_e( 'All license types', 'mainwp' ); ?></div>
|
|
<div class="menu">
|
|
<?php
|
|
foreach ( $license_types as $key => $title ) {
|
|
?>
|
|
<div class="item" data-value="<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $title ); ?></div>
|
|
<?php
|
|
}
|
|
?>
|
|
<div class="item" data-value="nolicensetypes"><?php esc_html_e( 'All license types', 'mainwp' ); ?></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="three wide middle aligned column">
|
|
<div id="mainwp-module-cost-tracker-costs-filter-renewal-frequency" class="ui fluid selection multiple dropdown seg_renewal_frequency">
|
|
<input type="hidden" value="<?php echo esc_attr( $filter_sub_renewal_type ); ?>">
|
|
<i class="dropdown icon"></i>
|
|
<div class="default text"><?php esc_html_e( 'All Subscription types', 'mainwp' ); ?></div>
|
|
<div class="menu">
|
|
<?php
|
|
foreach ( $renewal_frequency as $key => $title ) {
|
|
?>
|
|
<div class="item" data-value="<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $title ); ?></div>
|
|
<?php
|
|
}
|
|
?>
|
|
<div class="item" data-value="norenewalfrequency"><?php esc_html_e( 'All Subscription types', 'mainwp' ); ?></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="three wide middle aligned column">
|
|
<div id="mainwp-module-cost-tracker-costs-filter-payment-methods" class="ui fluid selection multiple dropdown seg_payment_methods">
|
|
<input type="hidden" value="<?php echo esc_attr( $filter_payment_method ); ?>">
|
|
<i class="dropdown icon"></i>
|
|
<div class="default text"><?php esc_html_e( 'All methods', 'mainwp' ); ?></div>
|
|
<div class="menu">
|
|
<?php
|
|
foreach ( $payment_methods as $key => $title ) {
|
|
?>
|
|
<div class="item" data-value="<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $title ); ?></div>
|
|
<?php
|
|
}
|
|
?>
|
|
<div class="item" data-value="nopaymentmenthods"><?php esc_html_e( 'All methods', 'mainwp' ); ?></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="three wide middle aligned column">
|
|
<div class="ui calendar fluid mainwp_datepicker seg_dtsstart">
|
|
<div class="ui fluid input left icon">
|
|
<i class="calendar icon"></i>
|
|
<input type="text" autocomplete="off" placeholder="<?php esc_attr_e( 'Renews period start date', 'mainwp' ); ?>" id="mainwp-module-cost-tracker-costs-filter-dtsstart" value="<?php echo ! empty( $filter_dtsstart ) ? esc_attr( $filter_dtsstart ) : ''; ?>"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="three wide middle aligned column">
|
|
<div class="ui calendar fluid mainwp_datepicker seg_dtsstop">
|
|
<div class="ui fluid input left icon">
|
|
<i class="calendar icon"></i>
|
|
<input type="text" autocomplete="off" placeholder="<?php esc_attr_e( 'Renews period end date', 'mainwp' ); ?>" id="mainwp-module-cost-tracker-costs-filter-dtsstop" value="<?php echo ! empty( $filter_dtsstop ) ? esc_attr( $filter_dtsstop ) : ''; ?>"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="three wide middle aligned right aligned column">
|
|
<button onclick="mainwp_module_cost_tracker_manage_costs_filter()" class="ui mini green button"><?php esc_html_e( 'Filter Costs', 'mainwp' ); ?></button>
|
|
<button onclick="mainwp_module_cost_tracker_manage_costs_reset_filters()" id="mainwp_module_cost_tracker_manage_costs_reset_filters" class="ui mini button" <?php echo $empty_filter ? 'disabled' : ''; ?>><?php esc_html_e( 'Reset Filters', 'mainwp' ); ?></button>
|
|
</div>
|
|
</div>
|
|
<div class="three wide top aligned right aligned column">
|
|
<div class="ui compact grid">
|
|
<div class="eight wide column"></div>
|
|
<div class="eight wide column">
|
|
<button class="ui mini green fluid button" id="module-cost-tracker-filter-save-segment-button" selected-segment-id="" selected-segment-name=""><?php esc_html_e( 'Save Segment', 'mainwp' ); ?></button>
|
|
<br/>
|
|
<?php if ( ! empty( $saved_segments ) ) : ?>
|
|
<button class="ui mini fluid button mainwp_module_cost_tracker_filter_choose_segment"><?php esc_html_e( 'Load Segment', 'mainwp' ); ?></button>
|
|
<?php else : ?>
|
|
<button class="ui mini fluid disabled button"><?php esc_html_e( 'Load Segment', 'mainwp' ); ?></button>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<style>
|
|
|
|
</style>
|
|
<script type="text/javascript">
|
|
jQuery( document ).ready( function( $ ) {
|
|
|
|
jQuery('#module-cost-tracker-filter-save-segment-button').on( 'click', function () {
|
|
jQuery( '#mainwp-cost-tracker-segment-edit-fields' ).show();
|
|
jQuery( '#mainwp-cost-tracker-edit-segment-save' ).show();
|
|
jQuery( '#mainwp-cost-tracker-segment-select-fields' ).hide();
|
|
jQuery( '#mainwp-cost-tracker-select-segment-choose-button' ).hide();
|
|
jQuery( '#mainwp-cost-tracker-select-segment-delete-button' ).hide();
|
|
jQuery('#mainwp-cost-tracker-edit-segment-name').val(jQuery(this).attr('selected-segment-name'));
|
|
mainwp_module_cost_tracker_show_segments_modal();
|
|
} );
|
|
|
|
jQuery('.mainwp_module_cost_tracker_filter_choose_segment').on( 'click', function () {
|
|
jQuery( '#mainwp-cost-tracker-segment-edit-fields' ).hide();
|
|
jQuery( '#mainwp-cost-tracker-edit-segment-save' ).hide();
|
|
jQuery( '#mainwp-cost-tracker-segment-select-fields' ).show();
|
|
jQuery( '#mainwp-cost-tracker-select-segment-choose-button' ).show();
|
|
jQuery( '#mainwp-cost-tracker-select-segment-delete-button' ).show();
|
|
mainwp_module_cost_tracker_show_segments_modal(true);
|
|
} );
|
|
|
|
mainwp_module_cost_tracker_hide_segments_message = function () {
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').removeClass('red green').hide();
|
|
};
|
|
|
|
mainwp_module_cost_tracker_show_segments_modal = function (loadSeg) {
|
|
mainwp_module_cost_tracker_hide_segments_message();
|
|
jQuery( '#mainwp-module-cost-tracker-segment-modal' ).modal( {
|
|
allowMultiple: false,
|
|
onShow: function () {
|
|
if(typeof loadSeg !== "undefined" && loadSeg){
|
|
mainwp_module_cost_tracker_load_segments();
|
|
}
|
|
}
|
|
} ).modal( 'show' );
|
|
};
|
|
|
|
mainwp_module_cost_tracker_load_segments = function () {
|
|
jQuery('#mainwp-cost-tracker-segment-select-fields').hide();
|
|
let data = mainwp_secure_data({
|
|
action: 'mainwp_module_cost_tracker_filter_load_segments',
|
|
});
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html('<i class="notched circle loading icon"></i> ' + __('Loading segments. Please wait...')).show();
|
|
jQuery.post(ajaxurl, data, function (response) {
|
|
if (response.error != undefined) {
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html(response.error).addClass('red');
|
|
} else if (response.result) {
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').hide();
|
|
jQuery('#mainwp-cost-tracker-segments-lists-wrapper').html(response.result);
|
|
jQuery( '#mainwp-cost-tracker-segments-lists-wrapper .ui.dropdown' ).dropdown();
|
|
jQuery('#mainwp-cost-tracker-segment-select-fields').show();
|
|
} else {
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html(__('No saved segments.')).addClass('red');
|
|
}
|
|
}, 'json');
|
|
};
|
|
|
|
jQuery('#mainwp-cost-tracker-edit-segment-save').on( 'click', function () {
|
|
|
|
mainwp_module_cost_tracker_hide_segments_message();
|
|
|
|
let seg_name = jQuery('#mainwp-cost-tracker-edit-segment-name').val().trim();
|
|
|
|
if('' == seg_name){
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html(__('Please enter segment name.')).addClass('red').show();
|
|
return false;
|
|
}
|
|
|
|
let data = mainwp_secure_data({
|
|
action: 'mainwp_module_cost_tracker_filter_save_segment',
|
|
name: seg_name,
|
|
seg_sites: $( '#mainwp-module-cost-tracker-costs-filter-sites').dropdown('get value'),
|
|
seg_clients: $( '#mainwp-module-cost-tracker-costs-filter-clients').dropdown('get value'),
|
|
seg_prods_types: $( '#mainwp-module-cost-tracker-costs-filter-cats').dropdown('get value'),
|
|
seg_costs_state: $( '#mainwp-module-cost-tracker-costs-filter-status').dropdown('get value'),
|
|
seg_license_types: $( '#mainwp-module-cost-tracker-costs-filter-license-types').dropdown('get value'),
|
|
seg_renewal_frequency: $( '#mainwp-module-cost-tracker-costs-filter-renewal-frequency').dropdown('get value'),
|
|
seg_payment_methods: $( '#mainwp-module-cost-tracker-costs-filter-payment-methods').dropdown('get value'),
|
|
seg_dtsstart: $('#mainwp-module-cost-tracker-costs-filter-dtsstart').val(),
|
|
seg_dtsstop: $('#mainwp-module-cost-tracker-costs-filter-dtsstop').val(),
|
|
seg_id:$('#module-cost-tracker-filter-save-segment-button').attr('selected-segment-id'),
|
|
});
|
|
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html('<i class="notched circle loading icon"></i> ' + __('Saving segment. Please wait...')).show();
|
|
|
|
jQuery.post(ajaxurl, data, function (response) {
|
|
if (response.error != undefined) {
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html(response.error).addClass('red');
|
|
} else if (response.result == 'SUCCESS') {
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html(__('Segment saved successfully.')).addClass('green');
|
|
setTimeout(function () {
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').fadeOut(300);
|
|
jQuery( '#mainwp-module-cost-tracker-segment-modal' ).modal('hide');
|
|
}, 2000);
|
|
} else {
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html(__('Undefined error occured while saving your segment!')).addClass('red');
|
|
}
|
|
}, 'json');
|
|
|
|
|
|
|
|
return false;
|
|
});
|
|
|
|
jQuery('#mainwp-cost-tracker-select-segment-choose-button').on( 'click', function () {
|
|
mainwp_module_cost_tracker_hide_segments_message();
|
|
let seg_id = jQuery( '#mainwp-cost-tracker-segment-select-fields .ui.dropdown').dropdown('get value');
|
|
let seg_values = '';
|
|
if('' != seg_id ) {
|
|
seg_values = jQuery( '#mainwp-cost-tracker-segment-select-fields select > option[value="' +seg_id+ '"]').attr('segment-filters');
|
|
}
|
|
|
|
let valErr = true;
|
|
let arrVal = '';
|
|
|
|
let fieldsAllows = [
|
|
'seg_sites',
|
|
'seg_clients',
|
|
'seg_prods_types',
|
|
'seg_costs_state',
|
|
'seg_license_types',
|
|
'seg_renewal_frequency',
|
|
'seg_payment_methods',
|
|
'seg_dtsstart',
|
|
'seg_dtsstop',
|
|
];
|
|
if('' != seg_values ) {
|
|
try {
|
|
seg_values = JSON.parse(seg_values);
|
|
if('' != seg_values){
|
|
jQuery( '#module-cost-tracker-filter-save-segment-button' ).attr('selected-segment-id',seg_id);
|
|
jQuery( '#module-cost-tracker-filter-save-segment-button' ).attr('selected-segment-name',seg_values.name);
|
|
|
|
for (const [key, value] of Object.entries(seg_values)) {
|
|
try {
|
|
if(fieldsAllows.includes(key)){
|
|
if( 'seg_dtsstart' !== key && 'seg_dtsstop' !== key ){
|
|
jQuery( '#mainwp-module-cost-tracker-costs-filters-row .ui.dropdown.' + key ).dropdown('clear');
|
|
arrVal = value.split(",");
|
|
jQuery( '#mainwp-module-cost-tracker-costs-filters-row .ui.dropdown.' + key ).dropdown('set selected', arrVal);
|
|
} else {
|
|
jQuery( '#mainwp-module-cost-tracker-costs-filters-row .ui.calendar.' + key ).calendar('set date', value );
|
|
}
|
|
}
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
}
|
|
jQuery( '#mainwp-module-cost-tracker-segment-modal' ).modal('hide');
|
|
mainwp_module_cost_tracker_manage_costs_filter();
|
|
valErr = false;
|
|
}
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
}
|
|
if(valErr){
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html(__('Undefined error segment values! Please try again.')).addClass('red').show();
|
|
}
|
|
});
|
|
|
|
|
|
jQuery('#mainwp-cost-tracker-select-segment-delete-button').on( 'click', function () {
|
|
mainwp_module_cost_tracker_hide_segments_message();
|
|
let delBtn = this;
|
|
let seg_id = jQuery( '#mainwp-cost-tracker-segment-select-fields .ui.dropdown').dropdown('get value');
|
|
if('' == seg_id){
|
|
return false;
|
|
}
|
|
|
|
if('yes' === jQuery(delBtn).attr('running')){
|
|
return false;
|
|
}
|
|
|
|
jQuery(seg_id).attr('running', 'yes');
|
|
let data = mainwp_secure_data({
|
|
action: 'mainwp_module_cost_tracker_filter_delete_segment',
|
|
seg_id: seg_id,
|
|
});
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html('<i class="notched circle loading icon"></i> ' + __('Deleting segment. Please wait...')).show();
|
|
jQuery.post(ajaxurl, data, function (response) {
|
|
|
|
jQuery(delBtn).removeAttr('running');
|
|
|
|
if (response.error != undefined) {
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html(response.error).addClass('red');
|
|
} else if (response.result == 'SUCCESS') {
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html(__('Segment deleted successfully.')).addClass('green');
|
|
setTimeout(function () {
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').fadeOut(300);
|
|
jQuery( '#mainwp-module-cost-tracker-segment-modal' ).modal('hide');
|
|
}, 2000);
|
|
} else {
|
|
jQuery('#mainwp-cost-tracker-edit-segment-status').html(__('Undefined error occured while deleting your segment!')).addClass('red');
|
|
}
|
|
}, 'json');
|
|
|
|
return false;
|
|
});
|
|
|
|
} );
|
|
</script>
|
|
<?php
|
|
static::render_modal_save_segment();
|
|
}
|
|
|
|
|
|
/**
|
|
* Method render_modal_save_segment()
|
|
*
|
|
* Render modal window.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function render_modal_save_segment() {
|
|
?>
|
|
<div id="mainwp-module-cost-tracker-segment-modal" class="ui tiny modal">
|
|
<i class="close icon" id="mainwp-notes-subs-cancel"></i>
|
|
<div class="header"><?php esc_html_e( 'Save Segment', 'mainwp' ); ?></div>
|
|
<div class="content" id="mainwp-cost-tracker-segment-content">
|
|
<div id="mainwp-cost-tracker-edit-segment-status" class="ui message hidden"></div>
|
|
<div id="mainwp-cost-tracker-segment-edit-fields" class="ui form">
|
|
<div class="field">
|
|
<label><?php esc_html_e( 'Enter the segment name', 'mainwp' ); ?></label>
|
|
</div>
|
|
<div class="field">
|
|
<input type="text" id="mainwp-cost-tracker-edit-segment-name" value=""/>
|
|
</div>
|
|
</div>
|
|
<div id="mainwp-cost-tracker-segment-select-fields" style="display:none;">
|
|
<div class="field">
|
|
<label><?php esc_html_e( 'Select a segment', 'mainwp' ); ?></label>
|
|
</div>
|
|
<div class="field">
|
|
<div id="mainwp-cost-tracker-segments-lists-wrapper"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="actions">
|
|
<div class="ui grid">
|
|
<div class="eight wide left aligned middle aligned column">
|
|
<input type="button" class="ui green button" id="mainwp-cost-tracker-edit-segment-save" value="<?php esc_attr_e( 'Save', 'mainwp' ); ?>"/>
|
|
<input type="button" class="ui green button" id="mainwp-cost-tracker-select-segment-choose-button" value="<?php esc_attr_e( 'Choose', 'mainwp' ); ?>" style="display:none;"/>
|
|
<input type="button" class="ui basic button" id="mainwp-cost-tracker-select-segment-delete-button" value="<?php esc_attr_e( 'Delete', 'mainwp' ); ?>" style="display:none;"/>
|
|
</div>
|
|
<div class="eight wide column">
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Method render_modal_edit_notes()
|
|
*
|
|
* Render modal window for edit notes.
|
|
*
|
|
* @param string $what What modal window to render. Default = site.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function render_modal_edit_notes( $what = 'site' ) {
|
|
?>
|
|
<div id="mainwp-notes-subs-modal" class="ui modal">
|
|
<i class="close icon" id="mainwp-notes-subs-cancel"></i>
|
|
<div class="header"><?php esc_html_e( 'Notes', 'mainwp' ); ?></div>
|
|
<div class="content" id="mainwp-notes-subs-content">
|
|
<div id="mainwp-notes-subs-status" class="ui message hidden"></div>
|
|
<div id="mainwp-notes-subs-html"></div>
|
|
<div id="mainwp-notes-subs-editor" class="ui form" style="display:none;">
|
|
<div class="field">
|
|
<label><?php esc_html_e( 'Edit note', 'mainwp' ); ?></label>
|
|
<textarea id="mainwp-notes-subs-note"></textarea>
|
|
</div>
|
|
<div><?php esc_html_e( 'Allowed HTML tags:', 'mainwp' ); ?> <p>, <strong>, <em>, <br>, <hr>, <a>, <ul>, <ol>, <li>, <h1>, <h2> </div>
|
|
</div>
|
|
</div>
|
|
<div class="actions">
|
|
<div class="ui grid">
|
|
<div class="eight wide left aligned middle aligned column">
|
|
<input type="button" class="ui green button" id="mainwp-notes-subs-save" value="<?php esc_attr_e( 'Save Note', 'mainwp' ); ?>" style="display:none;"/>
|
|
<input type="button" class="ui green button" id="mainwp-notes-subs-edit" value="<?php esc_attr_e( 'Edit Note', 'mainwp' ); ?>"/>
|
|
</div>
|
|
<div class="eight wide column">
|
|
<input type="hidden" id="mainwp-notes-subs-subid" value=""/>
|
|
<input type="hidden" id="mainwp-notes-subs-slug" value=""/>
|
|
<input type="hidden" id="mainwp-which-note" value="<?php echo esc_html( $what ); ?>"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Render Page Settings.
|
|
*/
|
|
public static function render_screen_options() {
|
|
|
|
$columns = static::get_columns();
|
|
|
|
$show_cols = get_user_option( 'mainwp_module_costs_tracker_manage_showhide_columns' );
|
|
|
|
if ( ! is_array( $show_cols ) ) {
|
|
$show_cols = array();
|
|
}
|
|
|
|
?>
|
|
<div class="ui modal" id="mainwp-module-cost-tracker-sites-screen-options-modal">
|
|
<div class="header"><?php esc_html_e( 'Page Settings', 'mainwp' ); ?></div>
|
|
<div class="scrolling content ui form">
|
|
<form method="POST" action="" id="subscription-sites-screen-options-form" name="subscription_sites_screen_options_form">
|
|
<?php wp_nonce_field( 'mainwp-admin-nonce' ); ?>
|
|
<input type="hidden" name="wp_nonce" value="<?php echo esc_attr( wp_create_nonce( 'CostTrackerSitesScrOptions' ) ); ?>" />
|
|
<div class="ui grid field">
|
|
<label class="six wide column"><?php esc_html_e( 'Show columns', 'mainwp' ); ?></label>
|
|
<div class="ten wide column">
|
|
<ul class="mainwp_hide_wpmenu_checkboxes">
|
|
<?php
|
|
foreach ( $columns as $name => $title ) {
|
|
if ( 'cb' === $name ) {
|
|
continue;
|
|
}
|
|
?>
|
|
<li>
|
|
<div class="ui checkbox">
|
|
<input type="checkbox"
|
|
<?php
|
|
$show_col = ! isset( $show_cols[ $name ] ) || ( 1 === (int) $show_cols[ $name ] );
|
|
if ( $show_col ) {
|
|
echo 'checked="checked"';
|
|
}
|
|
?>
|
|
id="mainwp_show_column_<?php echo esc_attr( $name ); ?>" name="mainwp_show_column_<?php echo esc_attr( $name ); ?>" value="<?php echo esc_attr( $name ); ?>">
|
|
<label for="mainwp_show_column_<?php echo esc_attr( $name ); ?>" ><?php echo $title; //phpcs:ignore ?></label>
|
|
<input type="hidden" value="<?php echo esc_attr( $name ); ?>" name="show_columns_name[]" />
|
|
</div>
|
|
</li>
|
|
<?php
|
|
}
|
|
?>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="actions">
|
|
<div class="ui two columns grid">
|
|
<div class="left aligned column">
|
|
<span data-tooltip="<?php esc_attr_e( 'Returns this page to the state it was in when installed. The feature also restores any column you have moved through the drag and drop feature on the page.', 'mainwp' ); ?>" data-inverted="" data-position="top center"><input type="button" class="ui button" name="reset" id="reset-subscriptionsites-settings" value="<?php esc_attr_e( 'Reset Page', 'mainwp' ); ?>" /></span>
|
|
</div>
|
|
<div class="ui right aligned column">
|
|
<input type="submit" class="ui green button" name="btnSubmit" id="submit-subscriptionsites-settings" value="<?php esc_attr_e( 'Save Settings', 'mainwp' ); ?>" />
|
|
<div class="ui cancel button"><?php esc_html_e( 'Close', 'mainwp' ); ?></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<input type="hidden" name="reset_subscriptionsites_columns_order" value="0">
|
|
</form>
|
|
</div>
|
|
<div class="ui small modal" id="mainwp-module-cost-tracker-sites-site-preview-screen-options-modal">
|
|
<div class="header"><?php esc_html_e( 'Screen Options', 'mainwp' ); ?></div>
|
|
<div class="scrolling content ui form">
|
|
<span><?php esc_html_e( 'Would you like to turn on home screen previews? This function queries WordPress.com servers to capture a screenshot of your site the same way comments shows you preview of URLs.', 'mainwp' ); ?>
|
|
</div>
|
|
<div class="actions">
|
|
<div class="ui ok button"><?php esc_html_e( 'Yes', 'mainwp' ); ?></div>
|
|
<div class="ui cancel button"><?php esc_html_e( 'No', 'mainwp' ); ?></div>
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">
|
|
jQuery( document ).ready( function () {
|
|
jQuery('#reset-subscriptionsites-settings').on( 'click', function () {
|
|
mainwp_confirm(__( 'Are you sure.' ), function(){
|
|
jQuery('.mainwp_hide_wpmenu_checkboxes input[id^="mainwp_show_column_"]').prop( 'checked', false );
|
|
//default columns
|
|
let cols = ['name','type','product_type','price','cost_status','license_type','last_renewal','next_renewal','payment_method','sites','actions'];
|
|
jQuery.each( cols, function ( index, value ) {
|
|
jQuery('.mainwp_hide_wpmenu_checkboxes input[id="mainwp_show_column_' + value + '"]').prop( 'checked', true );
|
|
} );
|
|
jQuery('input[name=reset_subscriptionsites_columns_order]').attr('value',1);
|
|
jQuery('#submit-subscriptionsites-settings').click();
|
|
}, false, false, true );
|
|
return false;
|
|
});
|
|
} );
|
|
</script>
|
|
<?php
|
|
}
|
|
}
|