load_dependencies(); // Initialize hooks $this->init_hooks(); // Initialize dashboard data if ( class_exists( 'HVAC_Master_Dashboard_Data' ) ) { $this->dashboard_data = new HVAC_Master_Dashboard_Data(); } } /** * Load required dependencies */ private function load_dependencies() { // Ensure master dashboard data is available if ( ! class_exists( 'HVAC_Master_Dashboard_Data' ) ) { require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-master-dashboard-data.php'; } } /** * Initialize hooks */ private function init_hooks() { // AJAX handlers for events overview add_action( 'wp_ajax_hvac_master_events_filter', array( $this, 'ajax_filter_events' ) ); add_action( 'wp_ajax_hvac_master_events_kpis', array( $this, 'ajax_get_kpis' ) ); add_action( 'wp_ajax_hvac_master_events_calendar', array( $this, 'ajax_get_calendar_data' ) ); // Shortcode for embedding events overview add_shortcode( 'hvac_master_events', array( $this, 'render_events_overview' ) ); // Add function for template integration add_action( 'init', array( $this, 'register_template_functions' ) ); } /** * Register template functions */ public function register_template_functions() { if ( ! function_exists( 'hvac_render_master_events' ) ) { function hvac_render_master_events() { $overview = HVAC_Master_Events_Overview::instance(); return $overview->render_events_overview(); } } } /** * Render the complete events overview */ public function render_events_overview( $atts = array() ) { // Security check if ( ! $this->can_view_events() ) { return '
You do not have permission to view events overview.
'; } ob_start(); ?>

Loading event statistics...

Loading...

Loading events...

dashboard_data ) { return ''; } $trainer_stats = $this->dashboard_data->get_trainer_statistics(); $options = ''; if ( ! empty( $trainer_stats['trainer_data'] ) ) { foreach ( $trainer_stats['trainer_data'] as $trainer ) { $options .= sprintf( '', esc_attr( $trainer->trainer_id ), esc_html( $trainer->display_name ), esc_html( $trainer->total_events ) ); } } return $options; } /** * AJAX handler for filtering events */ public function ajax_filter_events() { // Verify nonce if ( ! wp_verify_nonce( $_POST['nonce'], 'hvac_master_events_nonce' ) ) { wp_send_json_error( array( 'message' => 'Security check failed' ) ); } // Check permissions if ( ! $this->can_view_events() ) { wp_send_json_error( array( 'message' => 'Insufficient permissions' ) ); } // Get filter parameters $args = array( 'trainer_id' => isset( $_POST['trainer_id'] ) ? sanitize_text_field( $_POST['trainer_id'] ) : '', 'date_from' => isset( $_POST['date_from'] ) ? sanitize_text_field( $_POST['date_from'] ) : '', 'date_to' => isset( $_POST['date_to'] ) ? sanitize_text_field( $_POST['date_to'] ) : '', 'status' => isset( $_POST['status'] ) ? sanitize_text_field( $_POST['status'] ) : 'all', 'search' => isset( $_POST['search'] ) ? sanitize_text_field( $_POST['search'] ) : '', 'page' => isset( $_POST['page'] ) ? absint( $_POST['page'] ) : 1, 'per_page' => isset( $_POST['per_page'] ) ? absint( $_POST['per_page'] ) : 20, 'orderby' => isset( $_POST['orderby'] ) ? sanitize_text_field( $_POST['orderby'] ) : 'date', 'order' => isset( $_POST['order'] ) ? sanitize_text_field( $_POST['order'] ) : 'DESC', ); // Get events data if ( $this->dashboard_data ) { $events_data = $this->dashboard_data->get_events_table_data( $args ); // Format events for display $formatted_events = $this->format_events_for_display( $events_data['events'] ); wp_send_json_success( array( 'events' => $formatted_events, 'pagination' => $events_data['pagination'], 'total_found' => $events_data['pagination']['total_items'] ) ); } wp_send_json_error( array( 'message' => 'Unable to load events data' ) ); } /** * AJAX handler for getting KPI data */ public function ajax_get_kpis() { // Verify nonce if ( ! wp_verify_nonce( $_POST['nonce'], 'hvac_master_events_nonce' ) ) { wp_send_json_error( array( 'message' => 'Security check failed' ) ); } // Check permissions if ( ! $this->can_view_events() ) { wp_send_json_error( array( 'message' => 'Insufficient permissions' ) ); } if ( $this->dashboard_data ) { $kpis = array( 'total_events' => $this->dashboard_data->get_total_events_count(), 'upcoming_events' => $this->dashboard_data->get_upcoming_events_count(), 'past_events' => $this->dashboard_data->get_past_events_count(), 'total_tickets' => $this->dashboard_data->get_total_tickets_sold(), 'total_revenue' => $this->dashboard_data->get_total_revenue(), 'active_trainers' => $this->dashboard_data->get_active_trainers_count() ); wp_send_json_success( $kpis ); } wp_send_json_error( array( 'message' => 'Unable to load KPI data' ) ); } /** * AJAX handler for calendar data */ public function ajax_get_calendar_data() { // Verify nonce if ( ! wp_verify_nonce( $_POST['nonce'], 'hvac_master_events_nonce' ) ) { wp_send_json_error( array( 'message' => 'Security check failed' ) ); } // Check permissions if ( ! $this->can_view_events() ) { wp_send_json_error( array( 'message' => 'Insufficient permissions' ) ); } // Get filter parameters for calendar $args = array( 'trainer_id' => isset( $_POST['trainer_id'] ) ? sanitize_text_field( $_POST['trainer_id'] ) : '', 'date_from' => isset( $_POST['date_from'] ) ? sanitize_text_field( $_POST['date_from'] ) : '', 'date_to' => isset( $_POST['date_to'] ) ? sanitize_text_field( $_POST['date_to'] ) : '', 'status' => isset( $_POST['status'] ) ? sanitize_text_field( $_POST['status'] ) : 'all', 'search' => isset( $_POST['search'] ) ? sanitize_text_field( $_POST['search'] ) : '', 'per_page' => 999, // Get all events for calendar display 'orderby' => 'date', 'order' => 'ASC' ); // Get events data if ( $this->dashboard_data ) { $events_data = $this->dashboard_data->get_events_table_data( $args ); // Format events for calendar $calendar_events = $this->format_events_for_calendar( $events_data['events'] ); wp_send_json_success( array( 'events' => $calendar_events, 'total_found' => count( $calendar_events ) ) ); } wp_send_json_error( array( 'message' => 'Unable to load calendar data' ) ); } /** * Format events for table display */ private function format_events_for_display( $events ) { $formatted = array(); foreach ( $events as $event ) { $event_date = date( 'M j, Y', $event['start_date_ts'] ); $event_time = date( 'g:i A', $event['start_date_ts'] ); // Determine status badge class $status_class = 'hvac-status-' . esc_attr( $event['status'] ); if ( $event['start_date_ts'] > time() ) { $status_class .= ' hvac-status-upcoming'; } else { $status_class .= ' hvac-status-past'; } $formatted[] = array( 'id' => $event['id'], 'name' => $event['name'], 'trainer_name' => $event['trainer_name'], 'trainer_email' => $event['trainer_email'], 'date' => $event_date, 'time' => $event_time, 'status' => ucfirst( $event['status'] ), 'status_class' => $status_class, 'capacity' => $event['capacity'], 'sold' => $event['sold'], 'revenue' => '$' . number_format( $event['revenue'], 2 ), 'link' => $event['link'], 'trainer_edit_link' => home_url( '/trainer/events/edit/' . $event['id'] . '/' ), 'is_upcoming' => $event['start_date_ts'] > time() ); } return $formatted; } /** * Format events for calendar display */ private function format_events_for_calendar( $events ) { $formatted = array(); foreach ( $events as $event ) { $formatted[] = array( 'id' => $event['id'], 'title' => $event['name'], 'trainer' => $event['trainer_name'], 'start' => date( 'Y-m-d', $event['start_date_ts'] ), 'url' => $event['link'], 'className' => 'hvac-calendar-event hvac-status-' . $event['status'], 'extendedProps' => array( 'trainer_name' => $event['trainer_name'], 'capacity' => $event['capacity'], 'sold' => $event['sold'], 'revenue' => $event['revenue'], 'status' => $event['status'] ) ); } return $formatted; } /** * Check if current user can view events */ private function can_view_events() { $user = wp_get_current_user(); return in_array( 'hvac_master_trainer', $user->roles ) || current_user_can( 'manage_options' ); } /** * Get events summary for quick stats */ public function get_events_summary() { if ( ! $this->dashboard_data ) { return array(); } return array( 'total_events' => $this->dashboard_data->get_total_events_count(), 'upcoming_events' => $this->dashboard_data->get_upcoming_events_count(), 'past_events' => $this->dashboard_data->get_past_events_count(), 'total_revenue' => $this->dashboard_data->get_total_revenue(), 'total_tickets' => $this->dashboard_data->get_total_tickets_sold() ); } /** * Clear events cache */ public function clear_cache() { if ( method_exists( 'HVAC_Master_Dashboard_Data', 'clear_cache' ) ) { HVAC_Master_Dashboard_Data::clear_cache(); } } /** * Get filtered events count for display */ public function get_filtered_events_count( $args = array() ) { if ( ! $this->dashboard_data ) { return 0; } $events_data = $this->dashboard_data->get_events_table_data( array_merge( $args, array( 'per_page' => 1 ) ) ); return $events_data['pagination']['total_items']; } } // Initialize the class HVAC_Master_Events_Overview::instance();