38217-vm/wp-content/plugins/mainwp/modules/logs/pages/page-log-insights-page.php
2026-02-05 17:08:59 +03:00

1103 lines
48 KiB
PHP

<?php
/**
* Processes form input.
*
* @package MainWP/Dashboard
* @version 4.6
*/
namespace MainWP\Dashboard\Module\Log;
use MainWP\Dashboard\MainWP_Menu;
use MainWP\Dashboard\MainWP_UI;
use MainWP\Dashboard\MainWP_Utility;
use MainWP\Dashboard\MainWP_DB_Client;
use MainWP\Dashboard\MainWP_DB_Common;
use MainWP\Dashboard\MainWP_Post_Handler;
use MainWP\Dashboard\MainWP_Logger;
use MainWP\Dashboard\MainWP_Ui_Manage_Widgets_Layout;
/**
* Class Log_Insights_Page
*
* @package MainWP\Dashboard
*/
class Log_Insights_Page { //phpcs:ignore -- NOSONAR - multi methods.
/**
* Get Class Name
*
* @return string __CLASS__
*/
public static function get_class_name() {
return __CLASS__;
}
/**
* The single instance of the class
*
* @var mixed Default null
*/
protected static $instance = null;
/**
* The single instance of the variable.
*
* @var mixed Default null
*/
protected $list_events_table = null;
/**
* Enabled widgets
*
* @var array $enable_widgets
*/
private static $enable_widgets = array(
'recent_events' => true,
'log_plugins' => true,
'log_themes' => true,
'log_sites' => true,
'log_posts' => true,
'log_pages' => true,
'log_users' => true,
'log_clients' => true,
'log_graph_status' => true,
'log_graph_php' => true,
'log_graph_wp' => true,
'log_graph_themes' => true,
'log_graph_plugins' => true,
'log_graph_tags' => true,
'log_graph_clients' => true,
);
/**
* Current page.
*
* @static
* @var string $page Current page.
*/
public static $page;
/**
* Check if there is a session,
* if there isn't one create it.
*
* @return static::singlton Overview Page Session.
*
* @uses \MainWP\Dashboard\MainWP_Overview
*/
public static function instance() {
if ( null === static::$instance ) {
static::$instance = new self();
}
return static::$instance;
}
/**
* MainWP_Overview constructor.
*
* Run each time the class is called.
*/
public function __construct() {
add_action( 'admin_init', array( $this, 'admin_init' ) );
}
/**
* Hook admin init.
*/
public function admin_init() {
$this->handle_update_screen_options();
}
/**
* Handle update screen options.
*/
public function handle_update_screen_options() { //phpcs:ignore -- NOSONAR - complex.
$update_opts = false;
if ( isset( $_POST['module_log_overview_options_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['module_log_overview_options_nonce'] ), 'module_log_overview_options_nonce' ) ) {
$update_opts = true;
}
if ( $update_opts ) {
$show_wids = array();
if ( isset( $_POST['mainwp_show_widgets'] ) && is_array( $_POST['mainwp_show_widgets'] ) ) {
$selected_wids = array_map( 'sanitize_text_field', wp_unslash( $_POST['mainwp_show_widgets'] ) );
foreach ( $selected_wids as $name ) {
$show_wids[ $name ] = 1;
}
}
if ( isset( $_POST['mainwp_widgets_name'] ) && is_array( $_POST['mainwp_widgets_name'] ) ) {
$name_wids = array_map( 'sanitize_text_field', wp_unslash( $_POST['mainwp_widgets_name'] ) );
foreach ( $name_wids as $name ) {
if ( ! isset( $show_wids[ $name ] ) ) {
$show_wids[ $name ] = 0;
}
}
}
global $current_user;
if ( $current_user ) {
update_user_option( $current_user->ID, 'mainwp_module_log_overview_show_widgets', $show_wids, true );
if ( isset( $_POST['reset_module_log_overview_widgets_settings'] ) && ! empty( $_POST['reset_module_log_overview_widgets_settings'] ) ) {
update_user_option( $current_user->ID, 'mainwp_module_log_overview_show_widgets', false, true );
update_user_option( $current_user->ID, 'mainwp_widgets_sorted_' . strtolower( 'mainwp_page_InsightsOverview' ), false, true );
}
}
}
}
/**
* Method on_load_page()
*
* Run on page load.
*
* @param mixed $page Page name.
*/
public function on_load_page( $page ) {
static::$page = $page;
$val = get_user_option( 'screen_layout_' . $page );
if ( ! $val ) {
global $current_user;
update_user_option( $current_user->ID, 'screen_layout_' . $page, 2, true );
}
wp_enqueue_script( 'common' );
wp_enqueue_script( 'wp-lists' );
wp_enqueue_script( 'postbox' );
wp_enqueue_script( 'dashboard' );
wp_enqueue_script( 'widgets' );
static::add_meta_boxes( $page );
add_filter( 'mainwp_header_actions_right', array( $this, 'screen_options' ), 10, 2 );
add_filter( 'mainwp_widget_boxes_show_widgets', array( $this, 'hook_show_widgets' ), 10, 2 );
add_filter( 'mainwp_page_admin_body_class', array( $this, 'hook_admin_body_class' ), 10, 1 );
}
/**
* Method screen_options()
*
* Create Page Settings button.
*
* @param mixed $input Page Settings button HTML.
*
* @return mixed Page Settings button.
*/
public function screen_options( $input ) {
return $input .
'<a class="ui button basic icon" onclick="mainwp_module_log_overview_screen_options(); return false;" data-inverted="" data-position="bottom right" href="#" aria-label="' . esc_attr__( 'Page Settings', 'mainwp' ) . '" data-tooltip="' . esc_attr__( 'Page Settings', 'mainwp' ) . '">
<i class="cog icon"></i>
</a>';
}
/**
* Method hook_show_widgets()
*
* Hook show widgets.
*
* @param array $values Show widgets settings.
* @param string $page Page slug.
*
* @return array $values Show widgets settings.
*/
public function hook_show_widgets( $values, $page ) {
if ( strtolower( $page ) === strtolower( static::$page ) ) {
return get_user_option( 'mainwp_module_log_overview_show_widgets' );
}
return $values;
}
/**
* Method hook_admin_body_class()
*
* @param string $body_classes Body classes.
* @return string $body_classes Body classes.
*/
public function hook_admin_body_class( $body_classes ) {
return $body_classes . ' mainwp-hidden-second-level-navigation ';
}
/**
* Initiates Insights MainWP menu.
*/
public static function init_left_menu() {
MainWP_Menu::add_left_menu(
array(
'title' => esc_html__( 'Insights', 'mainwp' ),
'parent_key' => 'mainwp_tab',
'slug' => 'InsightsOverview',
'href' => 'admin.php?page=InsightsOverview',
'icon' => '<i class="pie chart icon"></i>',
'desc' => 'Dashboard Insights Overview',
'nosubmenu' => true,
),
0
);
}
/**
* Method add_meta_boxes()
*
* Add MainWP Overview Page Widgets.
*
* @param array $page Current page.
*
* @uses \MainWP\Dashboard\MainWP_System_Handler::apply_filters()
* @uses \MainWP\Dashboard\MainWP_System_Utility::get_current_wpid()
* @uses \MainWP\Dashboard\MainWP_UI::add_widget_box()
* @uses \MainWP\Dashboard\MainWP_Connection_Status::get_class_name()
* @uses \MainWP\Dashboard\MainWP_Recent_Pages::get_class_name()
* @uses \MainWP\Dashboard\MainWP_Recent_Posts::get_class_name()
* @uses \MainWP\Dashboard\MainWP_Security_Issues_Widget::get_class_name()
*/
public static function add_meta_boxes( $page ) { //phpcs:ignore -- NOSONAR - complex method.
/**
* Get getmetaboxes
*
* Adds metaboxes (widgets) to the Overview page.
*
* @since 4.6
*/
$extMetaBoxs = array();
$extMetaBoxs = apply_filters( 'mainwp_insights_getmetaboxes', $extMetaBoxs );
foreach ( $extMetaBoxs as $box ) {
if ( isset( $box['plugin'] ) ) {
$name = basename( $box['plugin'], '.php' );
static::$enable_widgets[ $name ] = true;
} elseif ( ! empty( $box['widget_id'] ) ) {
static::$enable_widgets[ $box['widget_id'] ] = true;
}
}
/**
* Unset unwanted Widgets
*
* Contains the list of enabled widgets and allows user to unset unwanted widgets.
*
* @param array $enable_widgets Array containing enabled widgets.
* @param int $dashboard_siteid Child site (Overview) ID.
*
* @since 4.6
*/
$values = apply_filters( 'mainwp_module_log_overview_enabled_widgets', static::$enable_widgets, null );
static::$enable_widgets = array_merge( static::$enable_widgets, $values );
// Load the widget.
if ( ! empty( static::$enable_widgets['log_sites'] ) ) {
MainWP_UI::add_widget_box( 'log_sites', array( Log_Sites_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_clients'] ) ) {
MainWP_UI::add_widget_box( 'log_clients', array( Log_Clients_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_pages'] ) ) {
MainWP_UI::add_widget_box( 'log_pages', array( Log_Pages_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_posts'] ) ) {
MainWP_UI::add_widget_box( 'log_posts', array( Log_Posts_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_themes'] ) ) {
MainWP_UI::add_widget_box( 'log_themes', array( Log_Themes_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_plugins'] ) ) {
MainWP_UI::add_widget_box( 'log_plugins', array( Log_Plugins_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_graph_clients'] ) ) {
MainWP_UI::add_widget_box( 'log_graph_clients', array( Log_Graph_Clients_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_graph_tags'] ) ) {
MainWP_UI::add_widget_box( 'log_graph_tags', array( Log_Graph_Tags_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_graph_status'] ) ) {
MainWP_UI::add_widget_box( 'log_graph_status', array( Log_Graph_Status_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_graph_themes'] ) ) {
MainWP_UI::add_widget_box( 'log_graph_themes', array( Log_Graph_Themes_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_graph_wp'] ) ) {
MainWP_UI::add_widget_box( 'log_graph_wp', array( Log_Graph_WP_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_graph_php'] ) ) {
MainWP_UI::add_widget_box( 'log_graph_php', array( Log_Graph_Php_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_graph_plugins'] ) ) {
MainWP_UI::add_widget_box( 'log_graph_plugins', array( Log_Graph_Plugins_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['log_users'] ) ) {
MainWP_UI::add_widget_box( 'log_users', array( Log_Users_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
// Load the widget.
if ( ! empty( static::$enable_widgets['recent_events'] ) ) {
MainWP_UI::add_widget_box( 'recent_events', array( Log_Recent_Events_Widget::instance(), 'render' ), $page, array( -1, -1, 6, 40 ) );
}
$i = 1;
foreach ( $extMetaBoxs as $metaBox ) {
$enabled = true;
if ( isset( $metaBox['plugin'] ) ) {
$name = basename( $metaBox['plugin'], '.php' );
if ( isset( static::$enable_widgets[ $name ] ) && ! static::$enable_widgets[ $name ] ) {
$enabled = false;
}
}
$id = isset( $metaBox['id'] ) ? $metaBox['id'] : $i++;
$id = 'advanced-' . $id;
$layout = ! empty( $metaBox['layout'] ) && is_array( $metaBox['layout'] ) ? $metaBox['layout'] : array( -1, -1, 6, 40 );
if ( $enabled ) {
MainWP_UI::add_widget_box( $id, $metaBox['callback'], $page, $layout );
}
}
}
/**
* Method get default logs filters()
*/
public static function get_default_filters() {
$format = 'Y-m-d';
return array(
'ranges' => 'thismonth',
'dtsstart' => gmdate( $format, strtotime( gmdate( 'Y-m-01' ) ) ),
'dtsstop' => gmdate( $format, time() ),
);
}
/**
* Method render_footer()
*
* Render Insights page footer. Closes the page container.
*/
public static function render_footer() {
echo '</div>';
}
/**
* Renders manage insights dashboard.
*
* @return void
*/
public function render_insights_overview() {
if ( ! \mainwp_current_user_can( 'dashboard', 'access_insights_dashboard' ) ) {
\mainwp_do_not_have_permissions( esc_html__( 'insights dashboard', 'mainwp' ) );
return;
}
$this->on_show_page();
}
/**
* Method on_show_page()
*
* When the page loads render the body content.
*/
public function on_show_page() {
static::render_header( 'overview' );
$insights_filters = $this->get_insights_filters( true );
static::render_logs_overview_top( $insights_filters );
$this->load_events_list_table(); // for events list in overview page.
$this->list_events_table->prepare_items( true, $insights_filters );
$items = $this->list_events_table->items;
$items_prev = ! empty( $this->list_events_table->items_prev ) ? $this->list_events_table->items_prev : array();
static::render_dashboard_body( $items, $items_prev, $insights_filters );
}
/**
* Method get_insights_filters()
*
* Get insights filters.
*
* @param bool $save_filter To save filter.
*/
public function get_insights_filters( $save_filter = false ) { //phpcs:ignore -- NOSONAR - complex method.
$filters = array( 'client', 'range', 'group', 'user', 'dtsstart', 'dtsstop' );
$get_saved = true;
foreach ( $filters as $filter ) {
if ( isset( $_REQUEST[ $filter ] ) ) { //phpcs:ignore -- safe.
$get_saved = false;
break;
}
}
$filter_ranges = '';
$filter_groups_ids = '';
$filter_client_ids = '';
$filter_user_ids = '';
$filter_dtsstart = '';
$filter_dtsstop = '';
$array_clients_ids = array();
$array_groups_ids = array();
$array_users_ids = array();
$update_filter = false;
if ( $get_saved ) {
$filters_saved = get_user_option( 'mainwp_module_logs_overview_filters_saved' );
if ( ! is_array( $filters_saved ) ) {
$filters_saved = static::get_default_filters();
}
$filter_ranges = isset( $filters_saved['ranges'] ) && ! empty( $filters_saved['ranges'] ) ? $filters_saved['ranges'] : false;
$filter_groups_ids = isset( $filters_saved['groups_ids'] ) && ! empty( $filters_saved['groups_ids'] ) ? $filters_saved['groups_ids'] : '';
$filter_client_ids = isset( $filters_saved['client_ids'] ) && ! empty( $filters_saved['client_ids'] ) ? $filters_saved['client_ids'] : false;
$filter_user_ids = isset( $filters_saved['user_ids'] ) && ! empty( $filters_saved['user_ids'] ) ? $filters_saved['user_ids'] : '';
$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'] : '';
} else {
// phpcs:disable WordPress.Security.NonceVerification
$filter_ranges = isset( $_REQUEST['range'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['range'] ) ) : '';
$filter_groups_ids = isset( $_REQUEST['group'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['group'] ) ) : '';
$filter_client_ids = isset( $_REQUEST['client'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['client'] ) ) : '';
$filter_user_ids = isset( $_REQUEST['user'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['user'] ) ) : '';
$filter_dtsstart = isset( $_REQUEST['dtsstart'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['dtsstart'] ) ) : '';
$filter_dtsstop = isset( $_REQUEST['dtsstop'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['dtsstop'] ) ) : '';
// phpcs:enable WordPress.Security.NonceVerification
$update_filter = true;
}
// validate requests.
if ( ! empty( $filter_client_ids ) ) {
$array_clients_ids = explode( ',', $filter_client_ids ); // convert to array.
if ( in_array( 'allclients', $array_clients_ids, true ) ) {
$array_clients_ids = false;
$filter_client_ids = '';
} else {
$array_clients_ids = MainWP_Utility::array_numeric_filter( $array_clients_ids );
$filter_client_ids = implode( ',', $array_clients_ids );
}
}
if ( ! empty( $filter_groups_ids ) ) {
$array_groups_ids = explode( ',', $filter_groups_ids ); // convert to array.
if ( in_array( 'alltags', $array_groups_ids, true ) ) {
$array_groups_ids = false;
$filter_groups_ids = '';
} else {
$array_groups_ids = MainWP_Utility::array_numeric_filter( $array_groups_ids );
$filter_groups_ids = implode( ',', $array_groups_ids );
}
}
if ( ! empty( $filter_user_ids ) ) {
$array_users_ids = explode( ',', $filter_user_ids ); // convert to array.
if ( in_array( 'allusers', $array_users_ids, true ) ) {
$array_users_ids = false;
$filter_user_ids = '';
} else {
$array_users_ids = MainWP_Utility::array_numeric_filter( $array_users_ids );
$filter_user_ids = implode( ',', $array_users_ids );
}
}
if ( $save_filter && $update_filter ) {
MainWP_Utility::update_user_option(
'mainwp_module_logs_overview_filters_saved',
array(
'ranges' => $filter_ranges,
'groups_ids' => $filter_groups_ids,
'client_ids' => $filter_client_ids,
'user_ids' => $filter_user_ids,
'dtsstart' => $filter_dtsstart,
'dtsstop' => $filter_dtsstop,
)
);
}
return compact(
'filter_ranges',
'filter_groups_ids',
'filter_client_ids',
'filter_user_ids',
'filter_dtsstart',
'filter_dtsstop',
'array_clients_ids',
'array_groups_ids',
'array_users_ids',
);
}
/**
* Render Manage Tasks Table Top.
*
* @param array $insights_filters Insights filters.
*/
public static function render_logs_overview_top( $insights_filters ) { //phpcs:ignore -- NOSONAR - complex.
$manager = Log_Manager::instance();
$filter_ranges = '';
$filter_groups_ids = '';
$filter_client_ids = '';
$filter_user_ids = '';
$filter_dtsstart = '';
$filter_dtsstop = '';
$array_clients_ids = array();
$array_groups_ids = array();
$array_users_ids = array();
extract( $insights_filters ); //phpcs:ignore -- ok.
$default_filter = false;
// extracted values.
if ( ( empty( $filter_ranges ) || 'thismonth' === $filter_ranges ) && empty( $filter_groups_ids ) && empty( $filter_client_ids ) && empty( $filter_user_ids ) && empty( $filter_user_ids ) && empty( $filter_dtsstart ) && empty( $filter_dtsstop ) && empty( $array_clients_ids ) && empty( $array_groups_ids ) && empty( $array_users_ids ) ) {
$default_filter = true;
}
$disable_dt = ( '' === $filter_ranges || 'custom' === $filter_ranges ) ? false : true;
$groups = MainWP_DB_Common::instance()->get_groups_for_current_user();
if ( ! is_array( $groups ) ) {
$groups = array();
}
static::render_layout_selection();
?>
<div class="mainwp-sub-header" id="mainwp-module-log-overview-sub-header">
<div class="ui stackable grid" id="mainwp-module-log-filters-row">
<div class="twelve wide column">
<div class="ui compact grid">
<div class="two wide middle aligned column">
<div id="mainwp-module-log-filter-ranges" class="ui selection fluid mini dropdown seg_ranges not-auto-init">
<input type="hidden" value="<?php echo esc_html( $filter_ranges ); ?>">
<i class="dropdown icon"></i>
<div class="default text"><?php esc_html_e( 'Select range', 'mainwp' ); ?></div>
<div class="menu">
<?php
$date_ranges = array(
'today' => esc_html__( 'Today', 'mainwp' ),
'yesterday' => esc_html__( 'Yesterday', 'mainwp' ),
'thisweek' => esc_html__( 'This week', 'mainwp' ),
'thismonth' => esc_html__( 'This month', 'mainwp' ),
'lastmonth' => esc_html__( 'Last month', 'mainwp' ),
'thisyear' => esc_html__( 'This year', 'mainwp' ),
'lastyear' => esc_html__( 'Last year', 'mainwp' ),
);
foreach ( $date_ranges as $val => $title ) {
?>
<div class="item" data-value="<?php echo esc_html( $val ); ?>"><?php echo esc_html( $title ); ?></div>
<?php
}
?>
<div class="item" data-value="custom"><?php esc_html_e( 'Custom', 'mainwp' ); ?></div>
</div>
</div>
</div>
<div class="two wide middle aligned column">
<div class="ui mini calendar mainwp_datepicker seg_dtsstart" id="mainwp-module-log-filter-dtsstart" >
<div class="ui input left fluid icon">
<i class="calendar icon"></i>
<input type="text" <?php echo $disable_dt ? 'disabled="disabled"' : ''; ?> autocomplete="off" placeholder="<?php esc_attr_e( 'Start date', 'mainwp' ); ?>" value="<?php echo ! empty( $filter_dtsstart ) ? esc_attr( $filter_dtsstart ) : ''; ?>"/>
</div>
</div>
</div>
<div class="two wide middle aligned column">
<div class="ui mini calendar mainwp_datepicker seg_dtsstop" id="mainwp-module-log-filter-dtsstop" >
<div class="ui input left icon">
<i class="calendar icon"></i>
<input type="text" <?php echo $disable_dt ? 'disabled="disabled"' : ''; ?> autocomplete="off" placeholder="<?php esc_attr_e( 'End date', 'mainwp' ); ?>" value="<?php echo ! empty( $filter_dtsstop ) ? esc_attr( $filter_dtsstop ) : ''; ?>"/>
</div>
</div>
</div>
<div class="two wide middle aligned column">
<div id="mainwp-module-log-filter-groups" class="ui selection multiple fluid mini dropdown seg_groups">
<input type="hidden" value="<?php echo esc_html( $filter_groups_ids ); ?>">
<i class="dropdown icon"></i>
<div class="default text"><?php esc_html_e( 'All tags', 'mainwp' ); ?></div>
<div class="menu">
<?php
foreach ( $groups as $group ) {
?>
<div class="item" data-value="<?php echo esc_attr( $group->id ); ?>"><?php echo esc_html( stripslashes( $group->name ) ); ?></div>
<?php
}
?>
<div class="item" data-value="alltags"><?php esc_html_e( 'All tags', 'mainwp' ); ?></div>
</div>
</div>
</div>
<div class="two wide middle aligned column">
<div id="mainwp-module-log-filter-clients" class="ui selection multiple fluid mini 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="allclients"><?php esc_html_e( 'All Clients', 'mainwp' ); ?></div>
</div>
</div>
</div>
<div class="two wide middle aligned column">
<div id="mainwp-module-log-filter-users" class="ui selection multiple fluid mini dropdown seg_users">
<input type="hidden" value="<?php echo esc_html( $filter_user_ids ); ?>">
<i class="dropdown icon"></i>
<div class="default text"><?php esc_html_e( 'All users', 'mainwp' ); ?></div>
<div class="menu">
<?php
$users = $manager->admin->get_all_users();
foreach ( $users as $user ) {
?>
<div class="item" data-value="<?php echo intval( $user['id'] ); ?>"><?php echo esc_html( $user['login'] ); ?></div>
<?php
}
?>
<div class="item" data-value="allusers"><?php esc_html_e( 'All users', 'mainwp' ); ?></div>
</div>
</div>
</div>
<div class="three wide middle aligned left aligned column">
<button onclick="mainwp_module_log_overview_content_filter()" class="ui mini green button"><?php esc_html_e( 'Filter Data', 'mainwp' ); ?></button>
<button onclick="mainwp_module_log_overview_content_reset_filters(this)" class="ui mini button" <?php echo $default_filter ? 'disabled="disabled"' : ''; ?>><?php esc_html_e( 'Reset Filters', 'mainwp' ); ?></button>
</div>
</div>
</div>
<?php Log_Events_Filter_Segment::get_instance()->render_filters_segment(); ?>
</div>
</div>
<?php
MainWP_UI::render_modal_save_segment();
$time = time();
$format = 'Y-m-d';
$ranges_values = array(
'today' => array(
'start' => gmdate( $format, strtotime( 'today' ) ),
'end' => gmdate( $format, strtotime( 'today' ) ),
),
'yesterday' => array(
'start' => gmdate( $format, strtotime( '-1 day', $time ) ),
'end' => gmdate( $format, strtotime( '-1 day', $time ) ),
),
'thisweek' => array(
'start' => gmdate( $format, strtotime( 'last monday', $time ) ),
'end' => gmdate( $format, $time ),
),
'thismonth' => array(
'start' => gmdate( $format, strtotime( gmdate( 'Y-m-01' ) ) ),
'end' => gmdate( $format, $time ),
),
'lastmonth' => array(
'start' => gmdate( $format, strtotime( 'first day of last month' ) ),
'end' => gmdate( $format, strtotime( 'first day of this month' ) - 1 ),
),
'thisyear' => array(
'start' => gmdate( $format, strtotime( 'first day of January ' . gmdate( 'Y' ) ) ),
'end' => gmdate( $format, $time ),
),
'lastyear' => array(
'start' => gmdate( $format, strtotime( 'first day of January ' . gmdate( 'Y' ) . '-1 year' ) ),
'end' => gmdate( $format, strtotime( 'last day of December ' . gmdate( 'Y' ) . '-1 year' ) ),
),
'custom' => array(
'start' => gmdate( $format, strtotime( 'last monday', $time ) ),
'end' => gmdate( $format, $time ),
),
);
$ranges_values = wp_json_encode( $ranges_values );
?>
<script type="text/javascript">
jQuery( document ).ready( function( $ ) {
var dateRanges = JSON.parse('<?php echo $ranges_values; //phpcs:ignore -- ok ?>');
$('#mainwp-module-log-filter-ranges').dropdown({
onChange: function (value, text, selected) {
if(value == 'custom'){
$('#mainwp-module-log-filter-dtsstart input[type=text]').attr('disabled', false);
$('#mainwp-module-log-filter-dtsstop input[type=text]').attr('disabled', false);
} else {
$('#mainwp-module-log-filter-dtsstart input[type=text]').attr('disabled', 'disabled');
$('#mainwp-module-log-filter-dtsstop input[type=text]').attr('disabled', 'disabled');
}
$('#mainwp-module-log-filter-dtsstart').calendar('set date', dateRanges[value]['start']);
$('#mainwp-module-log-filter-dtsstop').calendar('set date', dateRanges[value]['end']);
}
});
});
</script>
<?php
}
/**
* Method render_header()
*
* Render Insights page header.
*/
public static function render_header() {
$params = array(
'title' => esc_html__( 'Insights', 'mainwp' ),
'which' => 'page_insights_overview',
'wrap_class' => 'mainwp-module-logs-content-wrap',
);
MainWP_UI::render_top_header( $params );
}
/**
* Render layout selection.
*/
public static function render_layout_selection() { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR - complexity.
$screen = get_current_screen();
?>
<div class="mainwp-sub-header ui right aligned segment" id="module-logs-widgets-layout-row">
<?php MainWP_Ui_Manage_Widgets_Layout::render_edit_layout( $screen->id ); ?>
</div>
<?php
MainWP_Ui_Manage_Widgets_Layout::render_modal_save_layout();
}
/**
* Method load_sites_table()
*
* Load sites table.
*/
public function load_events_list_table() {
$manager = Log_Manager::instance();
$this->list_events_table = new Log_Events_List_Table( $manager );
}
/**
* Method ajax_events_display_rows()
*
* Display table rows, optimize for shared hosting or big networks.
*/
public function ajax_events_display_rows() {
MainWP_Post_Handler::instance()->check_security( 'mainwp_module_log_widget_insights_display_rows' );
$this->load_events_list_table();
$insights_filters = $this->get_insights_filters(); // get ajax filters.
$this->list_events_table->prepare_items( false, $insights_filters );
$output = $this->list_events_table->ajax_get_datatable_rows();
MainWP_Logger::instance()->log_execution_time( 'ajax_events_display_rows()' );
wp_send_json( $output );
}
/**
* Method ajax_events_overview_display_rows()
*
* Display table rows, optimize for shared hosting or big networks.
*/
public function ajax_events_overview_display_rows() { //phpcs:ignore -- NOSONAR -complex.
MainWP_Post_Handler::instance()->check_security( 'mainwp_module_log_widget_events_overview_display_rows' );
$this->load_events_list_table();
$insights_filters = array();
//phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( ! empty( $_POST['current_site_id'] ) ) {
$insights_filters['wpid'] = intval( $_POST['current_site_id'] );
} elseif ( ! empty( $_POST['current_client_id'] ) ) {
$client_id = intval( $_POST['current_client_id'] );
$websites = MainWP_DB_Client::instance()->get_websites_by_client_ids( $client_id );
$site_ids = array();
if ( $websites ) {
foreach ( $websites as $website ) {
$site_ids[] = $website->id;
}
}
if ( empty( $site_ids ) ) {
$site_ids = -1; // not found websites.
}
$insights_filters['wpid'] = $site_ids;
}
$filter_source = isset( $_REQUEST['source'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['source'] ) ) : '';
//phpcs:enable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$sources_conds = '';
if ( ! empty( $filter_source ) ) {
$array_source_list = explode( ',', $filter_source ); // convert to array.
if ( in_array( 'allsource', $array_source_list, true ) || ( in_array( 'dashboard', $array_source_list ) && in_array( 'wp-admin', $array_source_list ) ) ) {
$filter_source = '';
$array_source_list = false;
}
if ( is_array( $array_source_list ) ) {
$wpadmin_source = true;
$dashboard_source = true;
if ( ! in_array( 'wp-admin', $array_source_list ) ) {
$wpadmin_source = false;
}
if ( ! in_array( 'dashboard', $array_source_list ) ) {
$dashboard_source = false;
}
if ( $wpadmin_source && ! $dashboard_source ) {
$sources_conds = 'wp-admin-only';
} elseif ( ! $wpadmin_source && $dashboard_source ) {
$sources_conds = 'dashboard-only';
}
}
}
$insights_filters['sources_conds'] = $sources_conds;
$this->list_events_table->prepare_items( false, $insights_filters );
$output = $this->list_events_table->ajax_get_datatable_rows();
MainWP_Logger::instance()->log_execution_time( 'ajax_events_display_rows()' );
wp_send_json( $output );
}
/**
* Method render_dashboard_body()
*
* Render the logs Dashboard Body content.
*
* @param array $items Logs items.
* @param array $items_prev Logs prev items.
* @param array $insights_filters Insights filters.
*/
public static function render_dashboard_body( $items = array(), $items_prev = array(), $insights_filters = array() ) {
$screen = get_current_screen();
$stats_data = Log_Stats::get_stats_data( $items );
$stats_prev_data = ! empty( $items_prev ) ? Log_Stats::get_stats_data( $items_prev ) : array();
?>
<div class="mainwp-primary-content-wrap">
<?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'insights-widgets' ) ) : ?>
<div class="ui segment">
<div class="ui info message">
<i class="close icon mainwp-notice-dismiss" notice-id="insights-widgets"></i>
<?php printf( esc_html__( 'To hide or show a widget, click the Cog (%1$s) icon.', 'mainwp' ), '<i class="cog icon"></i>' ); ?>
</div>
</div>
<?php endif; ?>
<?php
/**
* Action: mainwp_before_overview_widgets
*
* Fires at the top of the Overview page (before first widget).
*
* @since 4.6
*/
do_action( 'mainwp_before_overview_widgets', 'insights' );
?>
<div id="mainwp-grid-wrapper" class="gridster">
<?php
MainWP_UI::do_widget_boxes(
$screen->id,
array(
'stats_data' => $stats_data,
'stats_prev_data' => $stats_prev_data,
'insights_filters' => $insights_filters,
)
);
?>
</div>
<?php
/**
* Action: 'mainwp_after_overview_widgets'
*
* Fires at the bottom of the Overview page (after the last widget).
*
* @since 4.6
*/
do_action( 'mainwp_after_overview_widgets', 'insights' );
?>
<script type="text/javascript">
jQuery( document ).ready( function( $ ) {
jQuery( '.mainwp-widget .mainwp-dropdown-tab .item' ).tab();
mainwp_module_log_overview_screen_options = function () {
jQuery( '#mainwp-module-log-overview-screen-options-modal' ).modal( {
allowMultiple: true,
onHide: function () {
}
} ).modal( 'show' );
return false;
};
jQuery('#reset-log-overview-widgets-settings').on('click', function () {
mainwp_confirm(__('Are you sure.'), function(){
jQuery('.mainwp_hide_wpmenu_checkboxes input[name="mainwp_show_widgets[]"]').prop('checked', true);
jQuery('input[name=reset_module_log_overview_widgets_settings]').attr('value', 1);
jQuery('#submit-log-overview-widgets-settings').click();
}, false, false, true);
return false;
});
} );
</script>
<div class="ui modal" id="mainwp-module-log-overview-screen-options-modal">
<i class="close icon"></i>
<div class="header"><?php esc_html_e( 'Page Settings', 'mainwp' ); ?></div>
<div class="content ui form">
<?php
/**
* Action: mainwp_module_log_overview_screen_options_top
*
* Fires at the top of the Sceen Options modal on the Overview page.
*
* @since 4.6
*/
do_action( 'mainwp_module_log_overview_screen_options_top' );
?>
<form method="POST" action="" name="mainwp_module_log_overview_screen_options_form" id="mainwp-module-log-overview-screen-options-form">
<?php wp_nonce_field( 'mainwp-admin-nonce' ); ?>
<input type="hidden" name="module_log_overview_options_nonce" value="<?php echo esc_attr( wp_create_nonce( 'module_log_overview_options_nonce' ) ); ?>" />
<?php static::render_screen_options( false ); ?>
<?php
/**
* Action: mainwp_module_log_overview_screen_options_bottom
*
* Fires at the bottom of the Sceen Options modal on the Overview page.
*
* @since 4.6
*/
do_action( 'mainwp_module_log_overview_screen_options_bottom' );
?>
</div>
<div class="actions">
<div class="ui two columns grid">
<div class="left aligned column">
<span data-tooltip="<?php esc_attr_e( 'Resets the page to its original layout and reinstates relocated widgets.', 'mainwp' ); ?>" data-inverted="" data-position="top left"><input type="button" class="ui button" name="reset" id="reset-log-overview-widgets-settings" value="<?php esc_attr_e( 'Reset Page', 'mainwp' ); ?>" /></span>
</div>
<div class="ui right aligned column">
<input type="submit" class="ui green button" id="submit-log-overview-widgets-settings" value="<?php esc_attr_e( 'Save Settings', 'mainwp' ); ?>" />
</div>
</div>
</div>
<input type="hidden" name="reset_module_log_overview_widgets_settings" value="" />
</form>
</div>
</div>
<?php
}
/**
* Method render_screen_options()
*
* Render Page Settings.
*
* @return void Render Page Settings html.
*/
public static function render_screen_options() {
$default_widgets = array(
'recent_events' => esc_html__( 'Recent Activity Log', 'mainwp' ),
'log_plugins' => esc_html__( 'Plugin Management Activity Overview', 'mainwp' ),
'log_themes' => esc_html__( 'Themes Management Activity Overview', 'mainwp' ),
'log_sites' => esc_html__( 'Site Management Activity Metrics', 'mainwp' ),
'log_posts' => esc_html__( 'Posts Management Event Tracker', 'mainwp' ),
'log_pages' => esc_html__( 'Page Management Event Tracker', 'mainwp' ),
'log_users' => esc_html__( 'User Management Events Summary', 'mainwp' ),
'log_clients' => esc_html__( 'Client Management Activity Summary', 'mainwp' ),
'log_graph_status' => esc_html__( 'Site Connectivity Status', 'mainwp' ),
'log_graph_php' => esc_html__( 'PHP Version Distribution', 'mainwp' ),
'log_graph_wp' => esc_html__( 'WordPress Version Distribution', 'mainwp' ),
'log_graph_themes' => esc_html__( 'Active Themes Overview', 'mainwp' ),
'log_graph_plugins' => esc_html__( 'Site Plugin Status Breakdown', 'mainwp' ),
'log_graph_tags' => esc_html__( 'Tag Allocation Overview', 'mainwp' ),
'log_graph_clients' => esc_html__( 'Client Sites Distribution', 'mainwp' ),
);
$custom_opts = array();
/**
* Filter: mainwp_module_log_widgets_screen_options
*
* Filters available widgets on the Overview page allowing users to unsent unwanted widgets.
*
* @since 4.6
*/
$custom_opts = apply_filters( 'mainwp_module_log_widgets_screen_options', $custom_opts );
if ( is_array( $custom_opts ) && ! empty( $custom_opts ) ) {
$default_widgets = array_merge( $default_widgets, $custom_opts );
}
$show_widgets = get_user_option( 'mainwp_module_log_overview_show_widgets' );
if ( ! is_array( $show_widgets ) ) {
$show_widgets = array();
}
/**
* Action: mainwp_screen_options_modal_top
*
* Fires at the top of the Page Settings modal element.
*
* @since 4.6
*/
do_action( 'mainwp_screen_options_modal_top' );
?>
<?php if ( isset( $_GET['page'] ) ) : // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized ?>
<div class="ui grid field">
<label class="six wide column"><?php esc_html_e( 'Show widgets', 'mainwp' ); ?></label>
<div class="ten wide column" <?php echo 'data-tooltip="' . esc_attr__( 'Select widgets that you want to hide in the MainWP Overview page.', 'mainwp' ); ?> data-inverted="" data-position="top left">
<ul class="mainwp_hide_wpmenu_checkboxes">
<?php
foreach ( $default_widgets as $name => $title ) {
$_selected = '';
if ( ! isset( $show_widgets[ $name ] ) || 1 === (int) $show_widgets[ $name ] ) {
$_selected = 'checked';
}
?>
<li>
<div class="ui checkbox">
<input type="checkbox" id="mainwp_show_widget_<?php echo esc_attr( $name ); ?>" name="mainwp_show_widgets[]" <?php echo esc_html( $_selected ); ?> value="<?php echo esc_attr( $name ); ?>">
<label for="mainwp_show_widget_<?php echo esc_attr( $name ); ?>" ><?php echo esc_html( $title ); ?></label>
</div>
<input type="hidden" name="mainwp_widgets_name[]" value="<?php echo esc_attr( $name ); ?>">
</li>
<?php
}
?>
</ul>
</div>
</div>
<?php endif; ?>
<?php
/**
* Action: mainwp_screen_options_modal_bottom
*
* Fires at the bottom of the Page Settings modal element.
*
* @since 4.6
*/
do_action( 'mainwp_screen_options_modal_bottom' );
}
}