38217-vm/wp-content/plugins/mainwp/class/class-mainwp-monitoring-sites-list-table.php
2026-02-05 17:08:59 +03:00

1661 lines
74 KiB
PHP

<?php
/**
* Monitoring Sites List Table.
*
* @package MainWP/Dashboard
*/
namespace MainWP\Dashboard;
/**
* Class MainWP_Monitoring_Sites_List_Table
*
* @package MainWP\Dashboard
*
* MainWP sites monitoring list.
*
* @devtodo The only variables that seam to be used are $column_headers.
*
* @uses \MainWP\Dashboard\MainWP_Manage_Sites_List_Table
*/
class MainWP_Monitoring_Sites_List_Table extends MainWP_Manage_Sites_List_Table { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
/**
* Protected variable to hold columns headers
*
* @var array
*/
protected $column_headers;
/**
* Instance variable.
*
* @var null Instance variable.
*/
private static $instance = null;
/**
* Global settings variable.
*
* @var null Instance variable.
*/
private $global_settings = null;
/**
* Public variable.
*
* @var bool
*/
public $site_health_disabled = false;
/**
* Create instance.
*
* @return mixed $instance.
*/
public static function instance() {
if ( null === static::$instance ) {
static::$instance = new self();
}
return static::$instance;
}
/**
* MainWP_Monitoring_Sites_List_Table constructor.
*
* Run each time the class is called.
* Add action to generate tabletop.
*/
public function __construct() {
add_action( 'mainwp_managesites_tabletop', array( &$this, 'generate_tabletop' ) );
if ( null === $this->global_settings ) {
$this->global_settings = MainWP_Uptime_Monitoring_Handle::get_global_monitoring_settings();
}
$this->site_health_disabled = get_option( 'mainwp_disableSitesHealthMonitoring', 1 ) ? true : false; // disabled by default.
}
/**
* Get the default primary column name.
*
* @return string Child site name.
*/
protected function get_default_primary_column_name() {
return 'site';
}
/**
* Set the column names.
*
* @param mixed $item MainWP site table item.
* @param string $column_name Column name to use.
*
* @return string Column name.
*/
public function column_default( $item, $column_name ) { // phpcs:ignore -- NOSONAR - complex function. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
/**
* Filter: mainwp_monitoring_sitestable_item
*
* Filters the Monitoring Sites table column items. Allows user to create new column item.
*
* @param array $item Array containing child site data.
*
* @since 4.1
*/
$item = apply_filters( 'mainwp_monitoring_sitestable_item', $item, $item );
switch ( $column_name ) {
case 'status':
case 'favicon':
case 'site':
case 'login':
case 'url':
case 'status_code':
case 'last_check':
case 'site_health':
case 'preview':
case 'last24_status':
case 'site_actions':
return '';
default:
return isset( $item[ $column_name ] ) ? $item[ $column_name ] : '';
}
}
/**
* Get sortable columns.
*
* @return array $sortable_columns Array of sortable column names.
*/
public function get_sortable_columns() {
return array(
'site' => array( 'site', false ),
'url' => array( 'url', false ),
'status_code' => array( 'status_code', false ),
'last_check' => array( 'last_check', false ),
'site_health' => array( 'site_health', false ),
'client_name' => array( 'client_name', false ),
'type' => array( 'type', false ),
'interval' => array( 'interval', false ),
);
}
/**
* Get default columns.
*
* @return array Array of default column names.
*/
public function get_default_columns() {
$columns = array(
'cb' => '<input type="checkbox" />',
'status' => esc_html__( 'Status', 'mainwp' ),
'site' => esc_html__( 'Monitor', 'mainwp' ),
'type' => esc_html__( 'Monitor Type', 'mainwp' ),
'interval' => esc_html__( 'Check Frequency', 'mainwp' ),
'status_code' => esc_html__( 'Status code', 'mainwp' ),
'site_health' => esc_html__( 'Site Health', 'mainwp' ),
'last24_status' => esc_html__( 'Last 24h Status', 'mainwp' ),
'last_check' => esc_html__( 'Last Check', 'mainwp' ),
);
if ( $this->site_health_disabled ) {
unset( $columns['site_health'] );
}
return $columns;
}
/**
* Method get_columns()
*
* Combine all columns.
*
* @param bool $sub_rows sub rows.
*
* @return array $columns Array of column names.
*/
public function get_columns( $sub_rows = false ) {
$columns = $this->get_default_columns( $sub_rows );
if ( ! $sub_rows ) {
/**
* Filter: mainwp_monitoring_sitestable_getcolumns
*
* Filters the Monitoring Sites table columns. Allows user to create a new column.
*
* @param array $columns Array containing table columns.
*
* @since 4.1
*/
$columns = apply_filters( 'mainwp_monitoring_sitestable_getcolumns', $columns, $columns );
}
$columns['site_actions'] = '';
return $columns;
}
/**
* Instantiate Columns.
*
* @return array $init_cols
*/
public function get_columns_init() {
$cols = $this->get_columns();
$init_cols = array();
foreach ( $cols as $key => $val ) {
$init_cols[] = array( 'data' => esc_html( $key ) );
}
return $init_cols;
}
/**
* Get column defines.
*
* @return array $defines Array of defines.
*/
public function get_columns_defines() {
$defines = array();
$defines[] = array(
'targets' => 'no-sort',
'orderable' => false,
);
$defines[] = array(
'targets' => 'manage-cb-column',
'className' => 'check-column collapsing',
);
$defines[] = array(
'targets' => 'manage-site-column',
'className' => 'column-site-bulk mainwp-site-cell',
);
$defines[] = array(
'targets' => 'manage-url-column',
'className' => 'mainwp-url-cell',
);
$defines[] = array(
'targets' => array( 'manage-login-column', 'manage-last_check-column', 'manage-last24_status-column', 'manage-status_code-column', 'manage-site_actions-column', 'extra-column', 'manage-client_name-column' ),
'className' => 'collapsing',
);
$defines[] = array(
'targets' => array( 'manage-status_code-column' ),
'className' => 'center aligned collapsing',
);
$defines[] = array(
'targets' => 'manage-site_actions-column',
'className' => 'parent-site-actions-column',
);
$defines[] = array(
'targets' => array( 'manage-last24_status-column' ),
'className' => 'dt-right',
);
$defines[] = array(
'targets' => array( 'manage-type-column' ),
'className' => 'collapsing',
);
$defines[] = array(
'targets' => array( 'manage-interval-column' ),
'className' => 'collapsing',
);
$defines[] = array(
'targets' => array( 'manage-status-column' ),
'className' => 'collapsing center aligned',
);
return $defines;
}
/**
* Method generate_tabletop()
*
* Run the render_manage_sites_table_top menthod.
*/
public function generate_tabletop() {
$this->render_manage_sites_table_top();
}
/**
* Create bulk actions drop down.
*
* @return array $actions Return actions through the mainwp_monitoringsites_bulk_actions filter.
*/
public function get_bulk_actions() {
$actions = array(
'checknow' => esc_html__( 'Check Now', 'mainwp' ),
'sync' => esc_html__( 'Sync Data', 'mainwp' ),
);
/**
* Filter: mainwp_monitoringsites_bulk_actions
*
* Filters bulk actions on the Monitoring Sites page. Allows user to hook in new actions or remove default ones.
*
* @since 4.1
*/
return apply_filters( 'mainwp_monitoringsites_bulk_actions', $actions );
}
/**
* Render manage sites table top.
*
* @uses \MainWP\Dashboard\MainWP_DB_Common::get_groups_for_manage_sites()
*/
public function render_manage_sites_table_top() {
$items_bulk = $this->get_bulk_actions();
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$selected_status = isset( $_REQUEST['status'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['status'] ) ) : '';
$selected_group = isset( $_REQUEST['g'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['g'] ) ) : '';
$selected_client = isset( $_REQUEST['client'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['client'] ) ) : '';
// phpcs:enable
if ( empty( $selected_status ) && empty( $selected_group ) && empty( $selected_client ) ) {
$selected_status = get_option( 'mainwp_monitoringsites_filter_status' );
$selected_group = get_option( 'mainwp_monitoringsites_filter_group' );
$selected_client = get_option( 'mainwp_monitoringsites_filter_client' );
}
?>
<div class="ui grid">
<div class="equal width row ui mini form">
<div class="middle aligned column">
<div id="mainwp-uptime-monitoring-bulk-actions-menu" class="ui selection dropdown">
<div class="default text"><?php esc_html_e( 'Bulk actions', 'mainwp' ); ?></div>
<i class="dropdown icon"></i>
<div class="menu">
<?php
foreach ( $items_bulk as $value => $title ) {
if ( 'seperator_' === substr( $value, 0, 10 ) ) {
?>
<div class="ui divider"></div>
<?php
} else {
?>
<div class="item" data-value="<?php echo esc_attr( $value ); ?>"><?php echo esc_html( $title ); ?></div>
<?php
}
}
?>
</div>
</div>
<button class="ui tiny basic button" id="mainwp-do-monitors-bulk-actions"><?php esc_html_e( 'Apply', 'mainwp' ); ?></button>
</div>
<div class="right aligned middle aligned column">
<?php esc_html_e( 'Filter sites: ', 'mainwp' ); ?>
<div id="mainwp-filter-sites-group" multiple="" class="ui selection multiple dropdown">
<input type="hidden" value="<?php echo esc_html( $selected_group ); ?>">
<i class="dropdown icon"></i>
<div class="default text"><?php esc_html_e( 'All tags', 'mainwp' ); ?></div>
<div class="menu">
<?php
$groups = MainWP_DB_Common::instance()->get_groups_for_manage_sites();
foreach ( $groups as $group ) {
?>
<div class="item" data-value="<?php echo intval( $group->id ); ?>"><?php echo esc_html( stripslashes( $group->name ) ); ?></div>
<?php
}
?>
<div class="item" data-value="nogroups"><?php esc_html_e( 'No Tags', 'mainwp' ); ?></div>
</div>
</div>
<div class="ui selection dropdown" id="mainwp-filter-sites-status">
<div class="default text"><?php esc_html_e( 'All statuses', 'mainwp' ); ?></div>
<i class="dropdown icon"></i>
<div class="menu">
<div class="item" data-value="all" ><?php esc_html_e( 'All statuses', 'mainwp' ); ?></div>
<div class="item" data-value="online"><?php esc_html_e( 'Online', 'mainwp' ); ?></div>
<div class="item" data-value="offline"><?php esc_html_e( 'Offline', 'mainwp' ); ?></div>
<div class="item" data-value="undefined"><?php esc_html_e( 'Undefined', 'mainwp' ); ?></div>
</div>
</div>
<div id="mainwp-filter-clients" class="ui selection multiple dropdown">
<input type="hidden" value="<?php echo esc_html( $selected_client ); ?>">
<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( 'No Client', 'mainwp' ); ?></div>
</div>
</div>
<button onclick="mainwp_manage_monitor_sites_filter()" class="ui tiny basic button"><?php esc_html_e( 'Filter Sites', 'mainwp' ); ?></button>
</div>
</div>
</div>
<script type="text/javascript">
jQuery( document ).ready( function () {
<?php if ( '' !== $selected_status ) { ?>
jQuery( '#mainwp-filter-sites-status' ).dropdown( "set selected", "<?php echo esc_js( $selected_status ); ?>" );
<?php } ?>
} );
</script>
<?php
}
/**
* Prepair the items to be listed.
*
* @param bool $optimize true|false Whether or not to optimize.
*
* @uses \MainWP\Dashboard\MainWP_DB::query()
* @uses \MainWP\Dashboard\MainWP_DB::get_sql_search_websites_for_current_user()
* @uses \MainWP\Dashboard\MainWP_DB::num_rows()
* @uses \MainWP\Dashboard\MainWP_DB::free_result()
* @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
* @uses \MainWP\Dashboard\MainWP_DB::data_seek()
* @uses \MainWP\Dashboard\MainWP_Utility::update_option()
*/
public function prepare_items( $optimize = true ) { // phpcs:ignore -- NOSONAR - complex function. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
$orderby = 'wp.url';
$req_orderby = null;
$req_order = null;
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( $optimize ) {
if ( isset( $_REQUEST['order'] ) ) {
$order_values = MainWP_Utility::instance()->get_table_orders( $_REQUEST );
$req_orderby = $order_values['orderby'];
$req_order = $order_values['order'];
}
if ( isset( $req_orderby ) ) {
if ( 'site' === $req_orderby ) {
$orderby = 'wp.name ' . ( 'asc' === $req_order ? 'asc' : 'desc' );
} elseif ( 'url' === $req_orderby ) {
$orderby = 'wp.url ' . ( 'asc' === $req_order ? 'asc' : 'desc' );
} elseif ( 'status' === $req_orderby ) {
$orderby = 'CASE true
WHEN (offline_check_result = 1)
THEN 1
WHEN (offline_check_result <> 1)
THEN 2
END ' . ( 'asc' === $req_order ? 'asc' : 'desc' );
} elseif ( 'status_code' === $req_orderby ) {
$orderby = 'wp.http_response_code ' . ( 'asc' === $req_order ? 'asc' : 'desc' );
} elseif ( 'last_check' === $req_orderby ) {
$orderby = 'wp.offline_checks_last ' . ( 'asc' === $req_order ? 'asc' : 'desc' );
} elseif ( 'site_health' === $req_orderby ) {
$orderby = 'wp_sync.health_value ' . ( 'asc' === $req_order ? 'asc' : 'desc' );
} elseif ( 'client_name' === $req_orderby ) {
$orderby = 'client_name ' . ( 'asc' === $req_order ? 'asc' : 'desc' );
} elseif ( 'type' === $req_orderby ) {
$orderby = ' mo.type ' . ( 'asc' === $req_order ? 'asc' : 'desc' );
} elseif ( 'interval' === $req_orderby ) {
$orderby = ' mo.interval ' . ( 'asc' === $req_order ? 'asc' : 'desc' );
}
}
}
if ( ! $optimize ) {
$perPage = 9999;
$start = 0;
} else {
$perPage = isset( $_REQUEST['length'] ) ? intval( $_REQUEST['length'] ) : 25;
if ( -1 === (int) $perPage ) {
$perPage = 9999;
}
$start = isset( $_REQUEST['start'] ) ? intval( $_REQUEST['start'] ) : 0;
}
$search = isset( $_REQUEST['search']['value'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['search']['value'] ) ) : '';
$get_saved_state = empty( $search ) && ! isset( $_REQUEST['g'] ) && ! isset( $_REQUEST['status'] ) && ! isset( $_REQUEST['client'] );
$get_all = ( '' === $search ) && ( isset( $_REQUEST['status'] ) && 'all' === $_REQUEST['status'] ) && ( isset( $_REQUEST['g'] ) && -1 === (int) $_REQUEST['g'] ) && empty( $_REQUEST['client'] ) ? true : false;
$group_ids = false;
$client_ids = false;
$site_status = '';
if ( ! isset( $_REQUEST['status'] ) ) {
if ( $get_saved_state ) {
$site_status = get_option( 'mainwp_monitoringsites_filter_status' );
} else {
MainWP_Utility::update_option( 'mainwp_monitoringsites_filter_status', '' );
}
} else {
$site_status = sanitize_text_field( wp_unslash( $_REQUEST['status'] ) );
MainWP_Utility::update_option( 'mainwp_monitoringsites_filter_status', $site_status );
}
if ( $get_all ) {
MainWP_Utility::update_user_option( 'mainwp_monitoringsites_filter_group', '' );
MainWP_Utility::update_user_option( 'mainwp_monitoringsites_filter_client', '' );
}
if ( ! $get_all ) {
if ( ! isset( $_REQUEST['g'] ) ) {
if ( $get_saved_state ) {
$group_ids = get_option( 'mainwp_monitoringsites_filter_group' );
} else {
MainWP_Utility::update_option( 'mainwp_monitoringsites_filter_group', '' );
}
} else {
MainWP_Utility::update_option( 'mainwp_monitoringsites_filter_group', sanitize_text_field( wp_unslash( $_REQUEST['g'] ) ) );
$group_ids = sanitize_text_field( wp_unslash( $_REQUEST['g'] ) ); // may be multi groups.
}
if ( ! isset( $_REQUEST['client'] ) ) {
if ( $get_saved_state ) {
$client_ids = get_user_option( 'mainwp_monitoringsites_filter_client' );
} else {
MainWP_Utility::update_user_option( 'mainwp_monitoringsites_filter_client', '' );
}
} else {
MainWP_Utility::update_user_option( 'mainwp_monitoringsites_filter_client', sanitize_text_field( wp_unslash( $_REQUEST['client'] ) ) );
$client_ids = sanitize_text_field( wp_unslash( $_REQUEST['client'] ) ); // may be multi groups.
}
}
// phpcs:enable
$where = null;
if ( '' !== $site_status && 'all' !== $site_status ) {
if ( 'online' === $site_status ) {
$where .= ' wp.offline_check_result = 1';
} elseif ( 'undefined' === $site_status ) {
$where .= ' wp.http_response_code = ""';
} elseif ( 'offline' === $site_status ) {
$where .= ' wp.offline_check_result <> "" AND wp.offline_check_result <> 1'; // 1 - online, -1 offline.
}
}
$total_params = array( 'count_only' => true );
if ( $get_all ) {
$params = array(
'selectgroups' => true,
'orderby' => $orderby,
'offset' => $start,
'rowcount' => $perPage,
);
} else {
$total_params['search'] = $search;
$params = array(
'selectgroups' => true,
'orderby' => $orderby,
'offset' => $start,
'rowcount' => $perPage,
'search' => $search,
);
$qry_group_ids = array();
if ( ! empty( $group_ids ) ) {
$group_ids = explode( ',', $group_ids ); // convert to array.
// to fix query deleted groups.
$groups = MainWP_DB_Common::instance()->get_groups_for_manage_sites();
foreach ( $groups as $gr ) {
if ( in_array( $gr->id, $group_ids ) ) {
$qry_group_ids[] = $gr->id;
}
}
// to fix.
if ( in_array( 'nogroups', $group_ids ) ) {
$qry_group_ids[] = 'nogroups';
}
}
if ( ! empty( $qry_group_ids ) ) {
$total_params['group_id'] = $qry_group_ids;
$params['group_id'] = $qry_group_ids;
}
$qry_client_ids = array();
if ( ! empty( $client_ids ) ) {
$client_ids = explode( ',', $client_ids ); // convert to array.
// to fix query deleted client.
$clients = MainWP_DB_Client::instance()->get_wp_client_by( 'all' );
if ( $clients ) {
foreach ( $clients as $client ) {
if ( in_array( $client->client_id, $client_ids ) ) {
$qry_client_ids[] = $client->client_id;
}
}
}
// to fix.
if ( in_array( 'noclients', $client_ids ) ) {
$qry_client_ids[] = 'noclients';
}
}
if ( ! empty( $qry_client_ids ) ) {
$total_params['client_id'] = $qry_client_ids;
$params['client_id'] = $qry_client_ids;
}
if ( ! empty( $where ) ) {
$total_params['extra_where'] = $where;
$params['extra_where'] = $where;
}
}
$params['view'] = 'monitor_view';
$total_params['view'] = 'monitor_view';
$total_websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_search_websites_for_current_user( $total_params ) );
$totalRecords = ( $total_websites ? MainWP_DB::num_rows( $total_websites ) : 0 );
if ( $total_websites ) {
MainWP_DB::free_result( $total_websites );
}
$extra_view = apply_filters( 'mainwp_monitoring_sitestable_prepare_extra_view', array( 'favi_icon', 'health_site_status' ) );
$extra_view = array_unique( $extra_view );
$params['extra_view'] = $extra_view;
$websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_search_websites_for_current_user( $params ) );
$site_ids = array();
while ( $websites && ( $site = MainWP_DB::fetch_object( $websites ) ) ) {
$site_ids[] = $site->id;
}
/**
* Action: mainwp_monitoring_sitestable_prepared_items
*
* Fires before the Monitoring Sites table itemes are prepared.
*
* @param object $websites Object containing child sites data.
* @param array $site_ids Array containing IDs of all child sites.
*
* @since 4.1
*/
do_action( 'mainwp_monitoring_sitestable_prepared_items', $websites, $site_ids );
MainWP_DB::data_seek( $websites, 0 );
$this->items = $websites;
$this->total_items = $totalRecords;
}
/**
* Display the table.
*
* @param bool $optimize true|false Whether or not to optimize.
*/
public function display( $optimize = true ) {
$sites_per_page = get_option( 'mainwp_default_monitoring_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 ) );
?>
<?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-monitoring-info-message' ) ) : ?>
<div class="ui info message">
<i class="close icon mainwp-notice-dismiss" notice-id="mainwp-monitoring-info-message"></i>
<div><?php esc_html_e( 'The Uptime Monitoring feature runs directly on your server, which means it utilizes your server\'s resources to perform checks. A high frequency checks could place additional load on your server, especially for resource-intensive environments.', 'mainwp' ); ?></div><br/>
<div><?php esc_html_e( 'We recommend setting a check interval that balances your uptime monitoring needs with your server\'s performance. For most sites, a 5-minute or 10-minute interval provides reliable monitoring without unnecessary strain.', 'mainwp' ); ?></div><br/>
<div><?php printf( esc_html__( 'If you need further guidance, feel free to visit our %1$sKnowledge Base%2$s or reach out to support.', 'mainwp' ), '<a href="https://mainwp.com/kb/sites-monitoring/" target="_blank">', '</a> <i class="external alternate icon"></i>' ); // NOSONAR - noopener - open safe. ?></div>
</div>
<?php endif; ?>
<table id="mainwp-manage-sites-table" style="width:100%" class="ui single line selectable unstackable table mainwp-with-preview-table mainwp-manage-wpsites-table">
<thead>
<tr>
<?php $this->print_column_headers( $optimize, true ); ?>
</tr>
</thead>
<?php if ( ! $optimize ) { ?>
<tbody id="mainwp-manage-sites-body-table">
<?php $this->display_rows_or_placeholder(); ?>
</tbody>
<?php } ?>
<tfoot>
<tr>
<?php $this->print_column_headers( $optimize, false ); ?>
</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
$count = MainWP_DB::instance()->get_websites_count( null, true );
$table_features = array(
'searching' => 'true',
'paging' => 'true',
'pagingType' => 'full_numbers',
'info' => 'true',
'colReorder' => '{columns:":not(.check-column):not(:last-child)"}',
'stateSave' => 'true',
'stateDuration' => '0',
'order' => '[]',
'scrollX' => 'true',
'responsive' => 'true',
);
/**
* Filter: mainwp_monitoring_table_features
*
* Filter the Monitoring table features.
*
* @since 4.1
*/
$table_features = apply_filters( 'mainwp_monitoring_table_features', $table_features );
?>
<script type="text/javascript">
let _init_uptime_status_bar_popup_tooltip = function( wrapper ){
let popWrapper = '';
if( typeof wrapper === 'undefined' ){
popWrapper = jQuery('#mainwp-manage-sites-table .mainwp-html-popup');
} else {
popWrapper = jQuery(wrapper).find('.mainwp-html-popup');
}
if( popWrapper !== '' ) {
jQuery(popWrapper).each(
function(){
mainwp_init_html_popup(this);
}
);
}
}
jQuery( document ).ready( function( $ ) {
mainwp_manage_sites_screen_options = function () {
jQuery( '#mainwp-manage-sites-screen-options-modal' ).modal( {
allowMultiple: true,
onHide: function () {
let val = jQuery( '#mainwp_default_monitoring_sites_per_page' ).val();
let saved = jQuery( '#mainwp_default_monitoring_sites_per_page' ).attr( 'saved-value' );
if ( saved != val ) {
jQuery( '#mainwp-manage-sites-table' ).DataTable().page.len( val );
jQuery( '#mainwp-manage-sites-table' ).DataTable().state.save();
}
}
} ).modal( 'show' );
jQuery( '#manage-sites-screen-options-form' ).submit( function() {
if ( jQuery('input[name=reset_monitoringsites_columns_order]').attr('value') == 1 ) {
$manage_sites_table.colReorder.reset();
jQuery( '.uptime-monitors-sub-pages-table' ).each(function(){
jQuery(this).DataTable().colReorder.reset();
});
}
jQuery( '#mainwp-manage-sites-screen-options-modal' ).modal( 'hide' );
} );
return false;
};
let responsive = <?php echo esc_js( $table_features['responsive'] ); ?>;
if( jQuery( window ).width() > 1140 ) {
responsive = false;
}
try {
$manage_sites_table = jQuery( '#mainwp-manage-sites-table' ).on( 'processing.dt', function ( e, settings, processing ) {
jQuery( '#mainwp-loading-sites' ).css( 'display', processing ? 'block' : 'none' );
if (!processing) {
let tb = jQuery( '#mainwp-manage-sites-table' );
tb.find( 'th[cell-cls]' ).each( function(){
let ceIdx = this.cellIndex;
let cls = jQuery( this ).attr( 'cell-cls' );
jQuery( '#mainwp-manage-sites-table tr' ).each(function(){
jQuery(this).find( 'td:eq(' + ceIdx + ')' ).addClass(cls);
} );
} );
$( '#mainwp-manage-sites-table .ui.dropdown' ).dropdown();
$( '#mainwp-manage-sites-table .ui.checkbox' ).checkbox();
}
} ).DataTable( {
"ajax": {
"url": ajaxurl,
"type": "POST",
"data": function ( d ) {
return $.extend( {}, d, mainwp_secure_data( {
action: 'mainwp_monitoring_sites_display_rows',
status: jQuery("#mainwp-filter-sites-status").dropdown("get value"),
g: jQuery("#mainwp-filter-sites-group").dropdown("get value"),
client: jQuery("#mainwp-filter-clients").dropdown("get value")
} )
);
},
"dataSrc": function ( json ) {
for ( let i=0, ien=json.data.length ; i < ien ; i++ ) {
json.data[i].syncError = json.rowsInfo[i].syncError ? json.rowsInfo[i].syncError : false;
json.data[i].rowClass = json.rowsInfo[i].rowClass;
json.data[i].siteID = json.rowsInfo[i].siteID;
json.data[i].siteUrl = json.rowsInfo[i].siteUrl;
json.data[i].monitorID = json.rowsInfo[i].monitorID;
json.data[i].niceurl = json.rowsInfo[i].niceurl;
json.data[i].urlpage = json.rowsInfo[i].urlpage;
json.data[i].childRows = json.childRows[i];
}
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. ?>,
"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. ?>,
"scrollX" : <?php echo esc_js( $table_features['scrollX'] ); ?>,
"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() ); ?>,
"drawCallback": function( settings ) {
this.api().tables().body().to$().attr( 'id', 'mainwp-manage-sites-body-table' );
// mainwp_datatable_fix_menu_overflow( '#mainwp-manage-sites-table' );
_init_uptime_status_bar_popup_tooltip();
},
rowCallback: function (row, data) {
jQuery( row ).addClass(data.rowClass);
jQuery( row ).attr( 'site-url', data.siteUrl );
jQuery( row ).attr( 'siteid', data.siteID );
jQuery( row ).attr( 'id', "child-site-" + data.siteID );
jQuery( row ).attr( 'itemid', data.monitorID );
jQuery( row ).attr( 'niceurl', data.niceurl );
jQuery( row ).attr( 'urlpage', data.urlpage );
if(data.childRows != '' ){
let tdrow = this.api().tables().row(row).child(data.childRows);
tdrow.show();
_init_uptime_monitoring_table_sub_rows(jQuery(tdrow.child()[0]));
}
if ( data.syncError ) {
jQuery( row ).find( 'td.column-site-bulk' ).addClass( 'site-sync-error' );
};
},
'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-manage-sites-table .ui.dropdown' ).dropdown();
$( '#mainwp-manage-sites-table .ui.checkbox' ).checkbox();
// mainwp_datatable_fix_menu_overflow( '#mainwp-manage-sites-table' );
}, 1000 );
_init_uptime_status_bar_popup_tooltip();
} );
_init_uptime_status_bar_popup_tooltip();
} catch(err) {
// to fix js error.
}
_init_uptime_monitoring_table_sub_rows = function(tblWrapper){
let tblSelector = jQuery(tblWrapper).find( '.uptime-monitors-sub-pages-table' );
try {
$manage_sub_pages_table = jQuery(tblSelector).DataTable( {
"responsive" : responsive,
paging: false,
searching:false,
info: false,
order:[[2, 'desc']],
"colReorder" : <?php echo $table_features['colReorder']; // phpcs:ignore -- specical chars. ?>,
"stateSave" : <?php echo esc_js( $table_features['stateSave'] ); ?>,
"stateDuration" : <?php echo esc_js( $table_features['stateDuration'] ); ?>,
"columnDefs": [
{
"targets": 'no-sort',
"orderable": false
},
{
"targets": 'manage-site-column',
"type": 'natural-nohtml'
},
<?php do_action( 'mainwp_manage_sites_table_columns_defs' ); ?>
],
"drawCallback": function( settings ) {
jQuery(tblSelector).find('.ui.dropdown' ).dropdown();
jQuery(tblSelector).find('.ui.checkbox' ).checkbox();
_init_manage_monitors_screen_settings(tblSelector);
_init_uptime_status_bar_popup_tooltip(jQuery(tblSelector));
},
'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('sub pages columns-reordered');
setTimeout(() => {
$( tblSelector + ' .ui.dropdown' ).dropdown();
$( tblSelector + ' .ui.checkbox' ).checkbox();
}, 1000 );
_init_uptime_status_bar_popup_tooltip(jQuery(tblSelector));
} );
_init_uptime_status_bar_popup_tooltip(jQuery(tblSelector));
} catch(err) {
// to fix js error.
}
}
_init_manage_monitors_screen_settings = function(tblSelector) {
let $sub_pages_table = jQuery(tblSelector).DataTable();
jQuery( '#mainwp-manage-sites-screen-options-modal input[type=checkbox][id^="mainwp_show_column_"]' ).each( function() {
let col_id = jQuery( this ).attr( 'id' );
col_id = col_id.replace( "mainwp_show_column_", "" );
try {
$sub_pages_table.column( '#' + col_id ).visible( jQuery(this).is( ':checked' ) );
} catch(err) {
// to fix js error.
}
} );
}
_init_manage_sites_screen = function() {
<?php
if ( empty( $count ) ) {
?>
jQuery( '#mainwp-manage-sites-screen-options-modal input[type=checkbox][id^="mainwp_show_column_"]' ).each( function() {
let col_id = jQuery( this ).attr( 'id' );
col_id = col_id.replace( "mainwp_show_column_", "" );
try {
$manage_sites_table.column( '#' + col_id ).visible( false );
jQuery( '.uptime-monitors-sub-pages-table' ).each(function(){
let $sub_pages_table = jQuery(this).DataTable();
$sub_pages_table.column( '#' + col_id ).visible( false );
});
} catch(err) {
// to fix js error.
}
} );
//default columns: Site, Open Admin, URL, Updates, Site Health, Status Code and Actions.
let cols = ['site','status','site_actions'];
jQuery.each( cols, function ( index, value ) {
try {
$manage_sites_table.column( '#' + value ).visible( true );
jQuery( '.uptime-monitors-sub-pages-table' ).each(function(){
let $sub_pages_table = jQuery(this).DataTable();
$sub_pages_table.column( '#' + value ).visible( true );
});
} catch(err) {
// to fix js error.
}
} );
<?php
} else {
?>
jQuery( '#mainwp-manage-sites-screen-options-modal input[type=checkbox][id^="mainwp_show_column_"]' ).each( function() {
let col_id = jQuery( this ).attr( 'id' );
col_id = col_id.replace( "mainwp_show_column_", "" );
try {
$manage_sites_table.column( '#' + col_id ).visible( jQuery(this).is( ':checked' ) );
} catch(err) {
// to fix js error.
}
} );
<?php } ?>
};
_init_manage_sites_screen();
} );
mainwp_manage_monitor_sites_filter = function() {
<?php if ( ! $optimize ) { ?>
let group = jQuery( "#mainwp-filter-sites-group" ).dropdown( "get value" );
let status = jQuery( "#mainwp-filter-sites-status" ).dropdown( "get value" );
let client = jQuery("#mainwp-filter-clients").dropdown("get value");
let params = '';
params += '&g=' + group;
params += '&client=' + client;
if ( status != '' )
params += '&status=' + status;
window.location = 'admin.php?page=MonitoringSites' + params;
return false;
<?php } else { ?>
try {
$manage_sites_table.ajax.reload();
} catch(err) {
// to fix js error.
}
<?php } ?>
};
</script>
<?php
}
/**
* Echo the column headers.
*
* @param bool $optimize true|false Whether or not to optimise.
* @param bool $top true|false.
* @param bool $sub_rows true|false.
* @param int $parent_site_id site parent id.
*/
public function print_column_headers( $optimize = false, $top = true, $sub_rows = false, $parent_site_id = false ) { //phpcs:ignore -- NOSONAR - complex.
list( $columns, $sortable ) = $this->get_column_info( $sub_rows );
if ( ! empty( $columns['cb'] ) ) {
if ( $sub_rows ) {
$columns['cb'] = '<div class="ui checkbox"><input class="sub-pages-checkbox ' . ( $top ? 'cb-select-all-parent-top' : 'cb-select-all-parent-bottom' ) . '" type="checkbox" cb-parent-selector=".monitors-sub-pages-table-body-' . ( false !== $parent_site_id ? intval( $parent_site_id ) : 0 ) . '" /></div>';
} else {
$columns['cb'] = '<div class="ui checkbox"><input id="' . ( $top ? 'cb-select-all-top' : 'cb-select-all-bottom' ) . '" type="checkbox" /></div>';
}
}
$def_columns = $this->get_default_columns( $sub_rows );
$def_columns['site_actions'] = '';
foreach ( $columns as $column_key => $column_display_name ) {
$class = array( 'manage-' . $column_key . '-column' );
$attr = '';
if ( ! isset( $def_columns[ $column_key ] ) ) {
$class[] = 'extra-column';
if ( $optimize ) {
$attr = 'cell-cls="' . esc_html( "collapsing $column_key column-$column_key" ) . '"';
}
}
if ( 'cb' === $column_key ) {
$class[] = 'check-column no-sort collapsing dt-orderable-none';
}
if ( 'status' === $column_key ) {
$class[] = 'collapsing';
}
if ( ! isset( $sortable[ $column_key ] ) ) {
$class[] = 'no-sort';
}
$tag = 'th';
$id = "id='$column_key'";
if ( ! empty( $class ) ) {
$class = "class='" . join( ' ', $class ) . "'";
}
echo "<$tag $id $class $attr>$column_display_name</$tag>"; // phpcs:ignore WordPress.Security.EscapeOutput
}
}
/**
* Get column info.
*
* @param bool $sub_rows sub rows.
* @return mixed
*/
protected function get_column_info( $sub_rows = false ) {
if ( isset( $this->column_headers ) && is_array( $this->column_headers ) ) {
$column_headers = array( array(), array(), array(), $this->get_default_primary_column_name() );
foreach ( $this->column_headers as $key => $value ) {
$column_headers[ $key ] = $value;
}
return $column_headers;
}
$columns = $this->get_columns( $sub_rows );
$sortable_columns = $this->get_sortable_columns();
$_sortable = $sortable_columns;
$sortable = array();
foreach ( $_sortable as $id => $data ) {
if ( empty( $data ) ) {
continue;
}
$data = (array) $data;
if ( ! isset( $data[1] ) ) {
$data[1] = false;
}
$sortable[ $id ] = $data;
}
$primary = $this->get_default_primary_column_name();
$this->column_headers = array( $columns, $sortable, $primary );
return $this->column_headers;
}
/**
* Single row.
*
* @param mixed $monitor_subpage Object containing the site info.
*
* @uses \MainWP\Dashboard\MainWP_Utility::sanitize_file_name()
*/
public function single_row( $monitor_subpage ) {
$classes = $this->get_groups_classes( $monitor_subpage );
$classes = trim( $classes );
$classes = ' class="child-site mainwp-child-site-' . intval( $monitor_subpage['wpid'] ) . ' ' . esc_html( $classes ) . '"';
$check_url = empty( $monitor_subpage['issub'] ) ? $monitor_subpage['url'] : $monitor_subpage['url'] . $monitor_subpage['suburl'];
echo '<tr id="monitor-sub-page-' . intval( $monitor_subpage['wpid'] ) . '"' . $classes . ' siteid="' . intval( $monitor_subpage['wpid'] ) . '" urlpage="' . esc_url( $check_url ) . '" itemid="' . intval( $monitor_subpage['monitor_id'] ) . '" niceurl="' . esc_attr( MainWP_Utility::get_nice_url( $check_url ) ) . '">'; //phpcs:ignore -- NOSONAR - safe.
$this->single_row_columns( $monitor_subpage );
echo '</tr>';
}
/**
* Columns for a single row.
*
* @param object $website Object containing the site info.
* @param array $good_health Deprecated.
*
* @uses \MainWP\Dashboard\MainWP_Connect::get_favico_url()
* @uses \MainWP\Dashboard\MainWP_Utility::esc_content()
* @uses \MainWP\Dashboard\MainWP_Utility::get_http_codes()
* @uses \MainWP\Dashboard\MainWP_Utility::format_timestamp()
* @uses \MainWP\Dashboard\MainWP_Utility::get_timestamp()
*/
protected function single_row_columns( $website, $good_health = false ) { // phpcs:ignore -- NOSONAR - complex function. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
unset( $good_health ); // compatible params, unuse.
$monitor_subpage = $website;
list( $columns ) = $this->get_column_info();
$glo_active = 0;
if ( isset( $this->global_settings['active'] ) ) {
$glo_active = 1 === (int) $this->global_settings['active'] ? 1 : 0;
}
$last24_time = MainWP_Uptime_Monitoring_Handle::get_hourly_key_by_timestamp( time() - DAY_IN_SECONDS );
$uptime_status = MainWP_DB_Uptime_Monitoring::instance()->get_uptime_monitor_stat_hourly_by( $monitor_subpage['monitor_id'], 'last24', $last24_time );
$disabled = ( ! $glo_active && ( -1 === (int) $monitor_subpage['active'] ) ) || 0 === (int) $monitor_subpage['active'] ? true : false;
foreach ( $columns as $column_name => $column_display_name ) {
$classes = "collapsing center aligned $column_name column-$column_name";
$attributes = "class='$classes'";
?>
<?php if ( 'cb' === $column_name ) { ?>
<td class="check-column no-sort">
<div class="ui checkbox <?php echo ! empty( $monitor_subpage['monitor_id'] ) ? 'cb-uptime-monitor' : ''; ?>">
<input type="checkbox" value="<?php echo intval( $monitor_subpage['id'] ); ?>" name=""/>
</div>
</td>
<?php
} elseif ( 'status' === $column_name ) {
?>
<td class="manage-type-column">
<?php
$this->render_uptime_status( $monitor_subpage['last_status'], false, $disabled );
?>
</td>
<?php
} elseif ( 'site' === $column_name ) {
?>
<td class="mainwp-site-cell">
<?php
$this->column_site( $monitor_subpage );
?>
</td>
<?php
} elseif ( 'last_check' === $column_name ) {
?>
<td class="collapsing">
<?php
if ( ! $disabled ) {
$this->column_last_check( $monitor_subpage, true );
}
?>
</td>
<?php
} elseif ( 'site_health' === $column_name ) {
?>
<td class="collapsing">
</td>
<?php
} elseif ( 'type' === $column_name ) {
?>
<td class="manage-type-column">
<?php
if ( ! $disabled ) {
$mo_type = MainWP_Uptime_Monitoring_Connect::get_apply_setting( 'type', $monitor_subpage['type'], $this->global_settings, 'useglobal', 'http' );
$this->column_type( $mo_type );
}
?>
</td>
<?php } elseif ( 'interval' === $column_name ) { ?>
<td class="manage-interval-column collapsing">
<?php
if ( ! $disabled ) {
$mo_interval = MainWP_Uptime_Monitoring_Connect::get_apply_setting( 'interval', (int) $monitor_subpage['interval'], $this->global_settings, -1, 60 );
echo '<i class="clock outline icon"></i> ' . ( -1 === (int) $mo_interval ? esc_html__( 'Use global setting', 'mainwp' ) : intval( $mo_interval ) . esc_html__( ' minutes', 'mainwp' ) );
}
?>
</td>
<?php
} elseif ( 'status_code' === $column_name ) {
?>
<td class="center aligned collapsing">
<?php
if ( ! $disabled ) {
echo esc_html( $website['http_response_code'] );
}
?>
</td>
<?php
} elseif ( 'last24_status' === $column_name ) {
?>
<td class="dt-right collapsing">
<?php
if ( ! $disabled ) {
$this->render_last24_uptime_status( $uptime_status, $last24_time );
}
?>
</td>
<?php
} elseif ( 'site_actions' === $column_name ) {
?>
<td class="collapsing">
<div class="ui right pointing dropdown" style="z-index:999;">
<i class="ellipsis vertical icon"></i>
<div class="menu" siteid="<?php echo intval( $monitor_subpage['id'] ); ?>" itemid="<?php echo intval( $monitor_subpage['monitor_id'] ); ?>">
<a class="managemonitors_uptime_checknow item" href="#"><?php esc_html_e( 'Check Now', 'mainwp' ); ?></a>
</div>
</div>
</td>
<?php
} else {
echo "<td $attributes>"; // phpcs:ignore WordPress.Security.EscapeOutput
echo $this->column_default( $monitor_subpage, $column_name ); // phpcs:ignore WordPress.Security.EscapeOutput
echo '</td>'; // phpcs:ignore WordPress.Security.EscapeOutput
}
}
}
/**
* Get table rows.
*
* Optimize for shared hosting or big networks.
*
* @return array Table rows HTML.
*
* @uses \MainWP\Dashboard\MainWP_Connect::get_favico_url()
* @uses \MainWP\Dashboard\MainWP_Utility::get_http_codes()
* @uses \MainWP\Dashboard\MainWP_Utility::format_timestamp()
* @uses \MainWP\Dashboard\MainWP_Utility::get_timestamp()
*/
public function ajax_get_datatable_rows() { // phpcs:ignore -- NOSONAR - complex function. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
$all_rows = array();
$info_rows = array();
$child_rows = array();
if ( $this->items ) {
$glo_active = 0;
if ( isset( $this->global_settings['active'] ) ) {
$glo_active = 1 === (int) $this->global_settings['active'] ? 1 : 0;
}
foreach ( $this->items as $website ) {
$rw_classes = 'child-site mainwp-child-site-' . intval( $website['id'] ) . ' ';
$health_status = ! empty( $website['health_site_status'] ) ? json_decode( $website['health_site_status'], true ) : array();
$hstatus = MainWP_Utility::get_site_health( $health_status );
$hval = $hstatus['val'];
$critical = $hstatus['critical'];
$good_health = false;
if ( 80 <= $hval && empty( $critical ) ) {
$good_health = true;
}
if ( $good_health ) {
$h_color = 'green';
$h_text = esc_html__( 'Good', 'mainwp' );
} else {
$h_color = 'orange';
$h_text = esc_html__( 'Should be improved', 'mainwp' );
}
$check_url = ! $website['issub'] ? $website['url'] : $website['url'] . $website['suburl'];
$info_item = array(
'rowClass' => esc_html( $rw_classes ),
'siteID' => $website['id'],
'siteUrl' => $website['url'],
'syncError' => ( '' !== $website['sync_errors'] ? true : false ),
'monitorID' => $website['monitor_id'],
'niceurl' => MainWP_Utility::get_nice_url( $check_url ),
'urlpage' => $check_url,
);
$columns = $this->get_columns();
$cols_data = array();
$last24_time = MainWP_Uptime_Monitoring_Handle::get_hourly_key_by_timestamp( time() - DAY_IN_SECONDS );
$uptime_status = MainWP_DB_Uptime_Monitoring::instance()->get_uptime_monitor_stat_hourly_by( $website['monitor_id'], 'last24', $last24_time );
$disabled = ( ! $glo_active && ( -1 === (int) $website['active'] ) ) || 0 === (int) $website['active'] ? true : false;
foreach ( $columns as $column_name => $column_display_name ) {
ob_start();
?>
<?php if ( 'cb' === $column_name ) : ?>
<div class="ui checkbox <?php echo ! empty( $website['monitor_id'] ) ? 'cb-uptime-monitor' : ''; ?>"><input type="checkbox" value="<?php echo intval( $website['id'] ); ?>" /></div>
<?php
elseif ( 'status' === $column_name ) :
?>
<?php $this->render_uptime_status( false, $website['offline_check_result'], $disabled ); ?>
<?php
elseif ( 'site' === $column_name ) :
$this->column_site( $website );
elseif ( 'type' === $column_name ) :
if ( ! $disabled ) {
$mo_type = MainWP_Uptime_Monitoring_Connect::get_apply_setting( 'type', $website['type'], $this->global_settings, 'useglobal', 'http' );
$this->column_type( $mo_type );
}
?>
<?php elseif ( 'interval' === $column_name ) : ?>
<?php
if ( ! $disabled ) {
$mo_interval = MainWP_Uptime_Monitoring_Connect::get_apply_setting( 'interval', (int) $website['interval'], $this->global_settings, -1, 60 );
echo '<i class="clock outline icon"></i> ' . ( -1 === (int) $mo_interval ? esc_html__( 'Use global setting', 'mainwp' ) : intval( $mo_interval ) . esc_html__( ' minutes', 'mainwp' ) );
}
?>
<?php elseif ( 'status_code' === $column_name ) : ?>
<?php
if ( ! $disabled ) {
echo esc_html( $website['http_response_code'] );
}
?>
<?php elseif ( 'last24_status' === $column_name ) : ?>
<?php
if ( ! $disabled ) {
$this->render_last24_uptime_status( $uptime_status, $last24_time );
}
?>
<?php
elseif ( 'last_check' === $column_name ) :
if ( ! $disabled ) {
$this->column_last_check( $website );
}
?>
<?php
elseif ( 'site_health' === $column_name ) :
if ( ! $disabled ) :
?>
<span><a class="open_newwindow_wpadmin" href="admin.php?page=SiteOpen&newWindow=yes&websiteid=<?php echo intval( $website['id'] ); ?>&location=<?php echo esc_attr( base64_encode( 'site-health.php' ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode used for http encoding compatible. ?>&_opennonce=<?php echo esc_attr( wp_create_nonce( 'mainwp-admin-nonce' ) ); ?>" target="_blank"><span class="ui <?php echo esc_html( $h_color ); ?> empty circular label"></span></a> <?php echo esc_html( $h_text ); ?></span>
<?php
endif;
elseif ( 'site_actions' === $column_name ) :
?>
<div class="ui right pointing dropdown" style="z-index:999;">
<i class="ellipsis vertical icon"></i>
<div class="menu" siteid="<?php echo intval( $website['id'] ); ?>">
<a class="managesites_checknow item" href="#"><?php esc_html_e( 'Check Now', 'mainwp' ); ?></a>
<?php if ( empty( $website['sync_errors'] ) ) : ?>
<a class="managesites_syncdata item" href="#"><?php esc_html_e( 'Sync Data', 'mainwp' ); ?></a>
<?php endif; ?>
<?php if ( \mainwp_current_user_can( 'dashboard', 'access_individual_dashboard' ) ) : ?>
<a class="item" href="admin.php?page=managesites&dashboard=<?php echo intval( $website['id'] ); ?>"><?php esc_html_e( 'Overview', 'mainwp' ); ?></a>
<?php endif; ?>
</div>
</div>
<?php else : ?>
<?php echo $this->column_default( $website, $column_name ); // phpcs:ignore WordPress.Security.EscapeOutput ?>
<?php endif; ?>
<?php
$cols_data[ $column_name ] = ob_get_clean();
}
$all_rows[] = $cols_data;
$info_rows[] = $info_item;
$sub_pages = MainWP_DB_Uptime_Monitoring::instance()->get_monitor_sub_pages( array( 'wpid' => $website['id'] ) );
$child_rows[] = ! empty( $sub_pages ) ? $this->get_monitors_table_child_rows( $website['id'], $sub_pages ) : '';
}
}
return array(
'data' => $all_rows,
'recordsTotal' => $this->total_items,
'recordsFiltered' => $this->total_items,
'rowsInfo' => $info_rows,
'childRows' => $child_rows,
);
}
/**
* Method column_site.
*
* @param mixed $website website.
*
* @return void
*/
public function column_site( $website ) {
?>
<?php if ( ! \mainwp_current_user_can( 'dashboard', 'access_wpadmin_on_child_sites' ) ) : ?>
<i class="sign in icon"></i>
<?php else : ?>
<a href="<?php MainWP_Site_Open::get_open_site_url( $website['id'] ); ?>" class="open_newwindow_wpadmin" target="_blank"><i class="sign in icon"></i></a>
<?php endif; ?>
<?php if ( empty( $website['issub'] ) ) { // primary monitor.
$mo_st_id = $website['id'];
?>
<a href="<?php echo 'admin.php?page=managesites&dashboard=' . intval( $website['id'] ); ?>"><?php echo esc_html( stripslashes( $website['name'] ) ); ?></a><i class="ui active inline loader tiny" style="display:none"></i>
<span id="site-status-<?php echo esc_attr( $mo_st_id ); ?>" class="status hidden"></span>
<br/>
<span class="ui small text"><a href="<?php echo esc_url( $website['url'] ); ?>" class="mainwp-may-hide-referrer open_site_url" target="_blank"><?php echo esc_html( MainWP_Utility::get_nice_url( $website['url'] ) ); ?></a></span>
<?php
} else {
$subpage = $website['url'] . $website['suburl'];
$sub_st_id = $website['id'];
?>
<a href="admin.php?page=managesites&monitor_wpid=<?php echo intval( $website['id'] ); ?>&monitor_id=<?php echo intval( $website['monitor_id'] ); ?>"><?php echo esc_html( $subpage ); ?></a><i class="ui active inline loader tiny" style="display:none"></i>
<span id="site-status-<?php echo esc_attr( $sub_st_id ); ?>" class="status hidden"></span>
<br/>
<span class="ui small text"><a href="<?php echo esc_url( $subpage ); ?>" class="mainwp-may-hide-referrer open_site_url" target="_blank"><?php echo esc_html( MainWP_Utility::get_nice_url( $subpage ) ); ?></a></span>
<?php } ?>
<?php
}
/**
* Method column_type
*
* @param string $mo_type mointor type.
*
* @return void
*/
public function column_type( $mo_type ) {
$mo_type_text = '';
if ( 'http' === $mo_type ) {
$mo_type_text = esc_html__( 'HTTP(s)', 'mainwp' );
} elseif ( 'ping' === $mo_type ) {
$mo_type_text = esc_html__( 'Ping', 'mainwp' );
} elseif ( 'keyword' === $mo_type ) {
$mo_type_text = esc_html__( 'Keyword', 'mainwp' );
}
echo '<span class="ui mini basic label">' . esc_html( $mo_type_text ) . '</span>';
}
/**
* Method column_last_check
*
* @param mixed $monitor monitor.
* @param bool $sub_page sub page.
*
* @return void
*/
public function column_last_check( $monitor, $sub_page = false ) {
if ( $sub_page ) {
$last_time = $monitor['lasttime_check'];
} else {
$last_time = $monitor['offline_checks_last'];
}
if ( ! empty( $last_time ) ) {
echo '<span data-tooltip="' . esc_attr( MainWP_Utility::format_timestamp( MainWP_Utility::get_timestamp( $last_time ) ) ) . '" data-inverted="" data-position="left center">' . esc_html( MainWP_Utility::time_elapsed_string( $last_time ) ) . '</span>';
} else {
echo esc_html__( 'Not checked yet.', 'mainwp' );
}
}
/**
* Renders uptime status.
*
* @param int $uptime_status uptime status.
* @param int $compatible_offline uptime status.
* @param bool $mo_disabled Disabled monitor or not.
*
* @return void
*/
public function render_uptime_status( $uptime_status = false, $compatible_offline = false, $mo_disabled = false ) {
if ( $mo_disabled ) {
echo '<span class="ui big circular icon grey looping transition label"><i class="stop circle outline icon"></i></span>';
return;
}
if ( false !== $compatible_offline ) {
$uptime_status = 99; // pendding.
if ( -1 === (int) $compatible_offline ) {
$uptime_status = 0; // to compatible value 'offline_check_result' with 'last_status'.
} elseif ( 1 === (int) $compatible_offline ) {
$uptime_status = 1;
}
}
if ( 1 === (int) $uptime_status ) {
echo '<span class="ui big circular icon green looping pulsating transition label"><i class="chevron up icon"></i></span>';
} elseif ( 0 === (int) $uptime_status ) {
echo '<span class="ui big circular icon red looping pulsating transition label"><i class="chevron down icon"></i></span>';
} else {
echo '<span class="ui big circular icon grey looping pulsating transition label"><i class="circle outline icon"></i></span>';
}
}
/**
* Render last24 uptime status.
*
* @param array $data data.
* @param int $last24_starttime last24 start time.
* @return void
*/
public function render_last24_uptime_status( $data, $last24_starttime ) { //phpcs:ignore -- NOSONAR - complexity.
if ( empty( $data ) || ! is_array( $data ) ) {
$data = array();
}
$uptime_data = array();
foreach ( $data as $value ) {
$uptime_data[ $value['timestamp'] ] = $value;
}
$hourly_key = MainWP_Uptime_Monitoring_Handle::get_hourly_key_by_timestamp( $last24_starttime );
$empty = array(
'up' => 0,
'down' => 0,
'ping_avg' => 0,
'ping_min' => 0,
'ping_max' => 0,
);
$total_up = 0;
$total_down = 0;
for ( $i = 0; $i < 24; $i++ ) {
if ( isset( $uptime_data[ $hourly_key ] ) ) {
$up_stats = $uptime_data[ $hourly_key ];
$color = $up_stats['up'] ? 'green' : 'red';
$text = $up_stats['up'] ? __( 'Up', 'mainwp' ) : __( 'Down', 'mainwp' );
} else {
$up_stats = $empty;
$color = 'gray';
$text = __( 'Pending', 'mainwp' );
}
$total_up += (int) $up_stats['up'];
$total_down += (int) $up_stats['down'];
$local_time = MainWP_Utility::get_timestamp( $hourly_key );
$time_from = MainWP_Utility::format_timestamp( $local_time ) . ' ' . MainWP_Utility::format_time( $local_time + HOUR_IN_SECONDS );
?>
<span class="mainwp-html-popup" data-inverted="" data-position="top center" html-popup-content="<?php echo esc_html( $time_from ) . '<br/><strong>' . esc_html( $text ) . ' ' . ( $up_stats['up'] ? (int) ( $up_stats['up'] * 100 / ( $up_stats['up'] + $up_stats['down'] ) ) . '%' : '' ); ?></strong>">
<label class="mainwp-uptime-status-indicator ui label <?php echo esc_attr( $color ); ?>"></label>
</span>
<?php
$hourly_key = MainWP_Uptime_Monitoring_Handle::get_hourly_key_by_timestamp( $hourly_key + HOUR_IN_SECONDS );
}
?>
<?php
$is_pending = 0 === ( $total_up + $total_down );
if ( $is_pending ) {
echo '<br/><span class="ui small text">' . esc_html__( 'Pending', 'mainwp' ) . '</span>';
} else {
echo '<br/><span class="ui small text">' . ( $total_up ? esc_html__( 'Up', 'mainwp' ) . ' ' . (int) ( $total_up * 100 / ( $total_up + $total_down ) ) . ' %' : esc_html__( 'Down', 'mainwp' ) ) . '</span>';
}
}
/**
* Get monitors table child rows.
*
* @param int $site_id the site id.
* @param array $sub_pages sub page.
* @return string format html content.
*/
public function get_monitors_table_child_rows( $site_id, $sub_pages ) {
ob_start();
?>
<table id="monitors-sub-pages-table-<?php echo intval( $site_id ); ?>" style="width:100%;" class="ui single line selectable unstackable table mainwp-manage-updates-table uptime-monitors-sub-pages-table">
<thead class="mainwp-768-hide">
<tr>
<?php $this->print_column_headers( false, true, true, $site_id ); ?>
</tr>
</thead>
<tbody class="uptime-monitoring-sub-pages-monitors-body monitors-sub-pages-table-body-<?php echo intval( $site_id ); ?>">
<?php
foreach ( $sub_pages as $mo_page ) :
$this->single_row( $mo_page );
endforeach;
?>
</tbody>
</table>
<?php
return ob_get_clean();
}
}