<?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;

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

/**
 * 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 Operations 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 Operations 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 (Operations) 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 );

        // 1. Load the Sites Connection Status 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, 3, 32 ) );
        }

        // 2. Load the Clients graph 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, 3, 32 ) );
        }

        // 3. Load the WP versoin graph 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, 3, 32 ) );
        }

        // 4. Load the PHP versoion graph 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, 3, 32 ) );
        }

        // 5. Load the Recent Activity 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, 12, 40 ) );
        }

        // 6. Load the Sites Actions 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 ) );
        }

        // 7. Load the Clients Actions 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 ) );
        }

        // 8. Load the Plugin Actions 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 ) );
        }

        // 9. Load the Theme Actions 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 ) );
        }

        // 10. Load the Plugins Status Breakdown 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, 80 ) );
        }

        // 11. 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 ) );
        }

        // 12. 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 ) );
        }

        // 13. 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 ) );
        }

        // 14. 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 ) );
        }

        // 15. 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, 12, 36 ) );
        }

        $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" style="display:none;">
            <div class="ui stackable grid" id="mainwp-module-log-filters-row">
                <div class="twelve wide column">
                    <div class="ui compact stackable 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 basic button"><i class="filter icon"></i> <?php esc_html_e( 'Filter', 'mainwp' ); ?></button>
                            <button onclick="mainwp_module_log_overview_content_reset_filters(this)" class="ui mini button" <?php echo $default_filter ? 'disabled="disabled"' : ''; ?>><i class="times icon"></i> <?php esc_html_e( 'Reset', 'mainwp' ); ?></button>
                        </div>
                    </div>
                </div>
                <div class="four wide column right aligned">
                    <?php Log_Events_Filter_Segment::get_instance()->render_filters_segment(); ?>
                </div>
            </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);
                            $('#mainwp-module-log-filter-dtsstart-column').show();
                            $('#mainwp-module-log-filter-dtsstop-column').show();
                        } 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-column').hide();
                            $('#mainwp-module-log-filter-dtsstop-column').hide();
                        }
                        $('#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.
        ?>
        <div class="mainwp-sub-header" id="module-logs-widgets-layout-row">
            <div class="ui two column grid">
                <div class="column">
                    <a href="admin.php?page=SettingsInsights" class="ui mini green button"><?php esc_html_e( 'Manage Network Activity Settings', 'mainwp' ); ?></a>
                </div>
                <div class="right aligned column">
                    <a href="#" class="ui mini button" id="mainwp-insights-filter-toggle-button"><i class="filter icon"></i> <?php esc_html_e( 'Show Filters', 'mainwp' ); ?></a>
                </div>
            </div>
        </div>
        <?php
    }

    /**
     * Method load_sites_table()
     *
     * @param string $tbl_id Table Id
     * @param bool $optimize Whether optimize data query.
     *
     * Load sites table.
     */
    public function load_events_list_table( $tbl_id = '', $optimize = false ) {
        $manager                 = Log_Manager::instance();
        $this->list_events_table = new Log_Events_List_Table( $manager, $tbl_id, $optimize );
    }

    /**
     * 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( 'widget-overview', true );

        $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 ajax_archive_dismissed_db()
     */
    public static function ajax_archive_dismissed_db() {
        MainWP_Post_Handler::instance()->check_security( 'mainwp_module_log_update_dismissed_db' );
        $user_cancel = get_option( 'mainwp_module_logs_updates_dismissed_db_cancelled' );
        if ( $user_cancel ) {
            $status = 'cancelled';
        } else {
            Log_DB_Archive::instance()->archive_sites_changes( 0, 200, 1 );
            $count = Log_DB_Helper::instance()->count_legacy_dismissed();
            if ( $count ) {
                $status = 'running';
            } else {
                $status = 'finished';
            }
        }
        update_option( 'mainwp_module_logs_updates_dismissed_db_process_status', $status );
        die( wp_json_encode( array( 'status' => esc_html( $status ) ) ) );
    }

    /**
     * Method ajax_cancel_update_dismissed_db()
     */
    public static function ajax_cancel_update_dismissed_db() {
        MainWP_Post_Handler::instance()->check_security( 'mainwp_module_log_cancel_update_dismissed_db' );
        update_option( 'mainwp_module_logs_updates_dismissed_db_cancelled', 1 );
        die( wp_json_encode( array( 'ok' => 1 ) ) );
    }

    /**
     * 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();

        $size = Log_DB_Helper::instance()->get_db_size();
        MainWP_Logger::instance()->debug( 'Network Activity DB Size: ' . $size . ' MB' );

        ?>
        <div class="mainwp-primary-content-wrap ui segment">
            <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-insights-welcome-message' ) ) : ?>
            <div class="ui segment" style="margin-bottom:0px;padding-bottom:0px;">
                <div class="ui icon message mainwp-welcome-message" style="margin-bottom:0px;">
                    <em data-emoji=":wave:" class="big"></em>
                    <div class="content">
                        <i class="close icon mainwp-notice-dismiss" notice-id="mainwp-insights-welcome-message" style="float:right;cursor:pointer;"></i>
                        <div class="ui massive header"><?php esc_html_e( 'Welcome to Dashboard Insights', 'mainwp' ); ?></div>
                        <p><?php esc_html_e( 'Track how you and your team use the MainWP Dashboard, view trends, activity summaries, and key usage metrics.', 'mainwp' ); ?></p>
                        <p>
                        <?php
                                /* translators: %1$s: Opening anchor tag, %2$s: Closing anchor tag */
                                printf( esc_html__( 'Start by configuring your %1$sNetwork Activity Settings%2$s to begin collecting data.', 'mainwp' ), '<a href="admin.php?page=SettingsInsights">', '</a>' );
                        ?>
                                </p>
                    </div>
                </div>
            </div>
            <?php endif; ?>

            <?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'insights-widgets' ) ) : ?>
            <div class="ui segment" style="padding-bottom:0;margin-bottom:0;">
                <div class="ui message" style="margin-bottom:0">
                    <i class="close icon mainwp-notice-dismiss" notice-id="insights-widgets"></i>
                    <?php
                    /* translators: %1$s: Bulb emoji, %2$s: Cog icon, %3$s: Layout icon */
                    printf( esc_html__( '%1$s Tip: You can drag and drop widgets to reorder your dashboard, use Page Settings (%2$s) to show or hide widgets, and use Layout (%3$s) in the header to save and load your widget layouts.', 'mainwp' ), '<em data-emoji=":bulb:" class="small"></em>', '<i class="cog fitted icon"></i>', '<i class="all border fitted icon"></i>' );
                    ?>
                </div>
            </div>
            <?php endif; ?>
            <div class="ui segment" style="margin-bottom:0;padding-top:0;padding-bottom:0;">
            <?php do_action( 'mainwp_module_log_render_db_update_notice' ); ?>
            <?php do_action( 'mainwp_module_log_render_db_size_notice' ); ?>
            </div>
            <?php
            /**
             * Action: mainwp_before_overview_widgets
             *
             * Fires at the top of the Operations page (before first widget).
             *
             * @since 4.6
             */
            do_action( 'mainwp_before_overview_widgets', 'insights' );
            ?>

            <div id="mainwp-grid-wrapper" class="gridster">
                <div id="mainwp-widgets-placeholder" class="ui page dimmer">
                    <div class="ui double text loader"><?php esc_html_e( 'Loading...', 'mainwp' ); ?></div>
                </div>
                <script>
                jQuery( document ).ready( function () {
                    jQuery('#mainwp-widgets-placeholder').dimmer('show');
                });
                </script>
                <?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 Operations 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(__('This will reset all widget positions and sizes to their original defaults. Your data and settings will not be affected. Are you sure you want to proceed?'), 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>
        <?php MainWP_Ui_Manage_Widgets_Layout::render_modal_save_layout(); ?>
        <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 Operations 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 MainWP_UI::generate_wp_nonce( '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 Operations 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 Operations page allowing users to unset 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 Operations 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' );
    }
}
